Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
XNA: in die eingeschlagene Richtung fahren
blr
myCSharp.de - Member



Dabei seit:
Beiträge: 122

Themenstarter:

XNA: in die eingeschlagene Richtung fahren

beantworten | zitieren | melden

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 :)
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4085

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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]
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von m0rius am .
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4085

beantworten | zitieren | melden

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"...
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
blr
myCSharp.de - Member



Dabei seit:
Beiträge: 122

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5973
Herkunft: Leipzig

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MrSparkle am .
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
blr
myCSharp.de - Member



Dabei seit:
Beiträge: 122

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers