Ich habe eine Klasse namens Sprite und ballSprite ist eine Instanz dieser Klasse. Sprite hat eine Vector2-Eigenschaft namens Position.
Ich versuche, die X-Komponente des Vektors wie folgt zu erhöhen:
%Vor%aber es verursacht diesen Fehler:
%Vor%Ist es nicht möglich, solche Komponenten zu setzen? Der Tooltip für die X- und Y-Felder sagt "Get or set ...", also kann ich nicht sehen, warum das nicht funktioniert.
Das Problem ist, dass ballSprite.Position
eine Struktur zurückgibt. Wenn Sie darauf zugreifen, erstellt es eine Kopie davon aufgrund der Wertesemantik. ++ versucht, diesen Wert zu ändern, aber es wird eine temporäre Kopie ändern - nicht die tatsächliche Struktur, die in Ihrem Sprite gespeichert ist.
Sie müssen den Wert aus dem Lesen der Position nehmen und ihn in eine lokale Variable einfügen, diese lokale Variable ändern und dann die lokale Variable wieder in Position setzen oder eine andere, ähnliche Vorgehensweise verwenden (vielleicht versteckt man sie) als einige IncrementX
Methode).
Eine andere, allgemeinere Lösung könnte darin bestehen, Ihrer Position einen weiteren Vektor2 hinzuzufügen. Der Operator + ist überladen. Sie können also einen neuen Vektor mit der gewünschten Änderung erstellen und diesen dann zum Vektor hinzufügen, anstatt die einzelnen Komponenten nacheinander zu aktualisieren.
Eine einfache Alternative ist das:
anstelle von: sprite.Position.X = 10;
verwenden: sprite.Position = new Vector2(10, sprite.Position.Y);
anstelle von: sprite.Position.Y = 10;
verwenden: sprite.Position = new Vector2(sprite.Position.X, 10);
anstelle von: sprite.Position.X += 10;
verwenden: sprite.Position += new Vector2(0, 10);
anstelle von: sprite.Position.Y += 10;
verwenden: sprite.Position += new Vector2(10, 0);
Anstatt new Vector2(...)
zu verwenden, um 2 Vektoren hinzuzufügen, können Sie auch Vector2.UnitX :
Es ist sehr nützlich, wenn Sie direktional verschieben möchten. Wenn Sie beispielsweise nur horizontal verschieben möchten:
%Vor% In diesem Beispiel wird der Wert von speed.Y
nicht zur Position des Sprites hinzugefügt. Warum?
Ein weiterer Vorteil dieser Art ist Lesbarkeit . Zumindest denke ich das. Überzeugen Sie sich selbst:
%Vor%Natürlich gibt es auch eine Vector2.UnitY für vertikale Bewegung. Kombinieren Sie diese statischen Felder zusammen mit Vector2.Zero und Vector2.One , und Sie können leicht verständlichen Code schreiben .
Wenn ich mit Vector2
s und Anweisungen arbeite, verwende ich die folgende Tabelle: