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 😃
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
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.
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
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"...
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
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
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
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
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