So, das ist jetzt weniger eine Programmiersprachenspezifische Frage, vielmehr eine mathematische.
Ich schreibe zur Zeit ein kleines Spiel in C# und XNA.
Die Game-Objekte definieren für Bewegung speed und direction(wie beim Gamemaker), nicht etwa mit einem Bewegungs-Vektor (x,y).
Nun habe ich eine Methode genannt AddMotion(float speed, float direction), die die angegebene Bewegung zur Aktuellen addieren soll.
Spoiler anzeigen
Nun habe ich mir deshalb überlegt, ich konvertiere die argumente speed und direction als auch die objekt-variablen erstmal in einen 2d Vector (x,y), addiere sie miteinander und konvertiere sie zurück, um sie auf die echten variablen anzuwenden.
Also etwa so: (C#)
public void AddMotion(float speed, float direction)
{
//allokiere temporären Vector, der die aktuelle bewegung und die argumente in vectoren konvertiert und addiert
Vector2 tmp = GetMotion() //gibt aktuelle speed und direction in form eines vectors zurück
+ new Vector2(
speed * (float) Math.Cos( (double) MathHelper.ToRadians(direction)), //hspeed = speed * Cos(direction)
speed * (float) Math.Sin( (double) MathHelper.ToRadians(direction)) //vspeed = speed * Sin(direction)
);
this.Direction = (float)Math.Atan2(tmp.X, -tmp.Y); //angle = Atan2(hspeed,vspeed)
this.Speed = tmp.Length();
}
Etwas formaler ohne das C# spezifische:
Meine Frage ist nun; Stimmt das? Funktioniert das? Denn sie scheint nicht einwandfrei zu funktionieren, deswegen wollte mithilfe von euch sichergehen können, dass hier nichts oder etwas faul ist.
Könnte man das auch ohne Konvertierung lösen und die direction irgendwie mit dem argument "interpolieren"?
Denn das Problem ist, dass die direction am Ende falsch ist beim Aufruf dieser Methode.
Würd mich freuen, wenn sich jemand die Mühe machen würde und das durchcheckt, dann hätte sich die Mühe mit diesem Post nämlich gelohnt =)
danke
Ich schreibe zur Zeit ein kleines Spiel in C# und XNA.
Die Game-Objekte definieren für Bewegung speed und direction(wie beim Gamemaker), nicht etwa mit einem Bewegungs-Vektor (x,y).
Nun habe ich eine Methode genannt AddMotion(float speed, float direction), die die angegebene Bewegung zur Aktuellen addieren soll.
Würde ich das nun einfach so machen:
this.Speed += speed;
this.Direction += direction;
Das funktioniert leider nicht, da einfach direction addieren is nich, das ist ja Schwachsinn..
this.Speed += speed;
this.Direction += direction;
Das funktioniert leider nicht, da einfach direction addieren is nich, das ist ja Schwachsinn..
Nun habe ich mir deshalb überlegt, ich konvertiere die argumente speed und direction als auch die objekt-variablen erstmal in einen 2d Vector (x,y), addiere sie miteinander und konvertiere sie zurück, um sie auf die echten variablen anzuwenden.
Also etwa so: (C#)
public void AddMotion(float speed, float direction)
{
//allokiere temporären Vector, der die aktuelle bewegung und die argumente in vectoren konvertiert und addiert
Vector2 tmp = GetMotion() //gibt aktuelle speed und direction in form eines vectors zurück
+ new Vector2(
speed * (float) Math.Cos( (double) MathHelper.ToRadians(direction)), //hspeed = speed * Cos(direction)
speed * (float) Math.Sin( (double) MathHelper.ToRadians(direction)) //vspeed = speed * Sin(direction)
);
this.Direction = (float)Math.Atan2(tmp.X, -tmp.Y); //angle = Atan2(hspeed,vspeed)
this.Speed = tmp.Length();
}
Etwas formaler ohne das C# spezifische:
Meine Frage ist nun; Stimmt das? Funktioniert das? Denn sie scheint nicht einwandfrei zu funktionieren, deswegen wollte mithilfe von euch sichergehen können, dass hier nichts oder etwas faul ist.
Könnte man das auch ohne Konvertierung lösen und die direction irgendwie mit dem argument "interpolieren"?
Denn das Problem ist, dass die direction am Ende falsch ist beim Aufruf dieser Methode.
Würd mich freuen, wenn sich jemand die Mühe machen würde und das durchcheckt, dann hätte sich die Mühe mit diesem Post nämlich gelohnt =)
danke
"das war meine letzte flamewar PM an dich ."
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von blubberblub ()