Laden...

XNA: in die eingeschlagene Richtung fahren

Erstellt von blr vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.630 Views
B
blr Themenstarter:in
120 Beiträge seit 2010
vor 13 Jahren
XNA: in die eingeschlagene Richtung fahren

guten Tag liebe XNA Freunde

ich habe ein Steuerungsproblem, welches mir große Sorgen bereitet.
SOLL:

1.Ich drücke Pfeiltaste "oben", das auto fährt vorwärts nach oben.
2.ich drücke Pfeiltaste "rechts" und dann drücke ich "oben" und das Auto fährt vorwärts..
aber diesmal nach rechts...
3.Ich drücke Pfeiltaste "links" und er dreht sich nach links und dann drücke ich "oben" und er fährt vortwärts weiter...in die eingeschlage Richtung

Wenn ich sage:

bei: IsKeyDown(Keys.Left)
rotation += MathHelper.ToRadians(10);//dreht er sich nach links
bei
IsKeyDown(Keys.Up)
Position.Y -= 4 // dann bewegt er sich nach oben
und nicht in die Richtung, die ich eben bei "Keys.Left" eingeschlagen habe.

Wie kann dem Befehl "Keys.Up" die Richtung zuweisen, die ich mit "Keys.Left" oder "Keys.Right" wähle?

Danke für jeden Tipp 😃

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo blr,

bewege deine Fahrzeuge vektorbasiert und addiere den jeweiligen Geschwindigkeitsvektor zur derzeitigen Position, die du ebenfalls durch einen Vektor darstellst. So ist es auch nicht schwer, die Geschwindigkeiten in X- und Y-Richtung getrennt zu manipulieren.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

4.931 Beiträge seit 2008
vor 13 Jahren

Hallo blr,

wenn du dein Auto in beliebige Richtungen steuern willst, dann solltest du auf Vektoren (Polar-Koordinaten) umsteigen.

Um von Polarkoordinaten wieder ins kartesische Koordinatensystem (x,y) umzurechnen, gilt:


x = r.cos(phi);
y = r.sin(phi);

wobei r der Radius (Abstand vom Nullpunkt) und phi der Winkel (in Bogenmaß) ist.

Ich weiß ja nicht wie alt du bist, aber "Trigonometrie" müßtest du dann dafür schon in der Schule durchgenommen haben - ansonsten müßtest du schauen, ob es eine Library dafür gibt, welche dir die Berechnungen ausführt.

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo Th69,

sicher wäre es eine Möglichkeit, die trigonometrischen Berechnungen und die Vektoradditionen händisch durchzuführen — allerdings enthält das XNA-Framework bereits die Vector2-Struktur, die die Eigenschaften X und Y besitzt.

m0rius

[edit]Formulierung. Etwas kryptisch gewesen ...[/edit]

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

4.931 Beiträge seit 2008
vor 13 Jahren

Hallo m0rius,

die Vector2-Struktur ist aber eine rein kartesische Klasse, d.h. die von blr verwendete Rotation läßt sich damit alleine ohne trigonometrische Funktionen nicht umsetzen, s.a. "Community Comment" "Extension Methods: Projection and Rotation"...

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo Th69,

die Vector2-Struktur besitzt die statische Methode Vector2.Transform(Vector2, Matrix). Diese kann wie folgt auch zum Rotieren eines Vektors um einen bestimmten Winkel verwendet werden:


// Winkelberechnung in Radiant wie gehabt:
float angleInRadians = MathHelper.ToRadians(10);

// Es wird die statische Methode Matrix.CreateRotationZ verwendet, da um die Z-Achse rotiert wird.
// Zeigt die X-Achse nach rechts und die Y-Achse nach oben, kommt die Z-Achse aus dem Monitor heraus.
Matrix rotationMatrix = Matrix.CreateRotationZ(angleInRadians);

// Berechnete Matrix-Rotation auf den Positionsvektor anwenden:
position = Vector2.Transform(position, rotationMatrix);

So kann die händische Berechnung der trigonometrischen Funktionen entfallen.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

B
blr Themenstarter:in
120 Beiträge seit 2010
vor 13 Jahren

danke für eure zahlreichen Antworten:)

Verzeiht mir bitte Unwissen, aber ich arbeite seit 1,5 Wochen mit XNA und kenn noch nicht alle Möglichkeiten derer Verwendung.

Also:
Deklaration:

Vector2 Position = new Vector2();

Ich habe einen Mauszeiger mit Vector2 gebaut, da habe ich dann von Mouse.GetState()
die Werte an den Vector2 zugewiesen, aber was mache ich in diesem Fall?
Ich drücke links-oben und wie bekommt der Vector2 die Werte?
Etwa so?

Position.X += 4???
Pisition.Y += 4???

Und das beim Zeichnen:

Spritebatch.Draw(Auto, Pisition, Color.White,Rotation)

?
So würde er "vorwärts" in jede beliebige Richtung fahren?
Danke im Voraus

5.657 Beiträge seit 2006
vor 13 Jahren

Hier scheint es sich ja eher um ein mathematisches Problem zu handeln als um ein programmiertechnisches. Evtl. wäre es für alle Beteiligten sehr hilfreich, wenn du dich zuerst einmal mit der Vektorrechnung auseinandersetzt.

Prophylaktisch möchte ich dich mal auf [Hinweis] Wie poste ich richtig? Punkt 1.1.1. und 4c hinweisen.

Weeks of programming can save you hours of planning

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo blr,

du rechnest dann ausschließlich mit Vektoren. Zum Addieren gibt es die statische Methode Vector2.Add(Vector2, Vector2), die zwei Vektoren addiert und das Resultat zurückgibt.
In deinem Fall würdest du die Summe von Positions- und Geschwindigkeitsvektor dem Positionsvektor zuweisen und so die alte Position aktualisieren.

Bitte setze deinen C#-Code in die ensprechenden BB-Codes [``CSHARP``] bzw. [``/CSHARP``]. Du bist ja mittlerweile auch eine Zeit lang dabei ...

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

B
blr Themenstarter:in
120 Beiträge seit 2010
vor 13 Jahren

Danke dir für den Rat....werde mich jetzt damit ne Zeit lang beschäftigen müssen.
Ja ist halt manchmal etwas komisch kleinen C#-Ausdruck in die C#-Klammer zu setzen, ist ja an sich kein richtiger Quelcode...

Danke dir noch mal