[C++][Direct3D] Sprite in rotierte Richtung bewegen

  • Themenstarter Themenstarter MFZ007
  • Beginndatum Beginndatum
M

MFZ007

Hallo allerseits!

Hab ein kleines D3D Prog geschrieben, das ein Sprite zeichnet und man
es dann mit GetAsyncKeyState bewegen und rotieren kann.

Nun will ich aber, dass wenn ich die Nach-Oben Taste drücke er nicht
einfach nur das Sprite nach Oben verschiebt sondern in die Richtung "fliegt"
in die die Rotation zeigt.

Habe folgende Variablen:

float Rotation
D3DXVECTOR2 VPosition(x, y)

Wäre für Hilfe sehr dankbar..
 
Also ich hab mich jetzt nicht durch den Datenwust auf dieser DirectXseite gelesen, aber ein bischen Geometrie dürfte da doch helfen, oder nicht?

Du kennst doch den Winkel, oder nicht? Dann kannst du ein bißchen mit sinus und so rechnen, dann hast du es doch.

wenn du bei einem tastendruck einen schritt gehen willst (sagen wir der ist 10 px groß), dann gilt ja bei einer rotation von 30°

Code:
  /|C  
A/_|B

alpha = 30°
beta = 90°
gamma = 180 - 90 - 30 = 60°
b = 10
a = ?
c = ?

a:

sin(alpha)/a = sin(beta)/b
sin(30)/a = sin(90)/10
sin(30) = a * sin(90)/10
(10 * sin(30))/sin(90) = a

c:

b² = a² + c²
c² = b² - a²
c = sqrt(b²-a²)
c = sqrt(100 - a²); //a² siehe oben



so einfach ist das! Klasse 8 Gymnasium!

Grüße
Christian Behrenberg
 
Hehe ich geh glaub ich gleich ins Bett :eek:
Ich dachte diesmal auch wieder anders, nämlich an die Rotation eines Sprites und nicht die Bewegung auf einem anderen Pfad, der einen bestimmten Winkel einschliesst :)
 
Ja klar, aber er speichert ja in Rotation seinen Winkel. Also kann er doch seinen Ortsvektor (also die X/Y Koordinate des Sprites) wie in einem Koordinatensystem verschieben. Das Dreieck ist nur die Konstruktion dafür: der Weg ist die Strecka AC, die zurückgelegt ist, in die x und y Komponenten zerlegt, bezeichnet mit AB und BC. Also ein rechtwinkliges Dreieck.

Gruß
Christian Behrenberg
 
Danke für die Antworten.

HeelX Beitrag hat einiges klar gemacht.
Ich versuche jetzt dies umzusetzen..

Vielen Dank und immer wieder.
 
Sorry für den Doppelpost,

Soweit funktioniert es.
Ich hab noch einem Kollegen gemailt und der hat mir noch ne andere Methode
gezeigt die ich dann auch angewandt habe.

Das hat prima Funktioniert.

Code:
float m_TempRot = (Rotation * D3DX_PI / 180.0f);

Direct3D.BeginScene();


if(GetAsyncKeyState(VK_LEFT) & 0x8000)
{
     m_TempRot += .1f;
}

else if(GetAsyncKeyState(VK_RIGHT) & 0x8000)
{
    m_TempRot -= .1f;
}
			
if(GetAsyncKeyState(VK_UP) & 0x8000)
{
    if(vPosition.y > 0 && vPosition.y < WndHeight && 
    vPosition.x > 0 && vPosition.x < WndWidth)
    {
        vPosition.y -= cos(m_TempRot) * 10;
        vPosition.x += sin(-m_TempRot) * 10;
    }
}

Vielleicht klingt das jetzt ein bisschen blöd, aber
könntet ihr mir klar machen wie das Funktioniert?:rolleyes:
Wäre sehr froh.

mfG MFZ007
 
Du bist gut. Anstatt den ganzen Quelltext hättest du die einzelnen Stücke, die du nicht verstehst, rausschneiden können, aber nun gut:

1.)

if(vPosition.y > 0 && vPosition.y < WndHeight &&
vPosition.x > 0 && vPosition.x < WndWidth)

Da wird gecheckt, ob sich dein Objekt innerhalb deines Fensters befindet. Du solltest, wenn dein Ding durch eine Welt, die größer als dein Bildschirm ist, "fliegen" soll, aber sowieso ein Koordinatensystem anlegen, das relativ zum Bildschirm angelegt ist

2.)

vPosition.y -= cos(m_TempRot) * 10;
vPosition.x += sin(-m_TempRot) * 10;

Das ist die vereinfachte Form meiner Variante, weil das hier vom sinus bzw. cosinus eines Dreiecks ausgeht, dass die Hypothenuse mit der Länge 1 hat. Das Ergebnis der ersten Zeile gibt wieder, wie groß die Ankathete ist und die zweite gibt an, wie groß die Kathete ist. Der Multiplikator 10 verlängert in der Berechnung sozusagen die Hypothenuse 1 um den Faktor 10 und ist deshalb 10 "lang". Wenn du dir den Strahlensatz eines rechtwinkligen Dreieckes anschaust (Klasse 8), dann siehst du, dass durch das *10 auch die Katheten und Ankatheten verlängert werden --- und deshalb die Berechnung hier richtig ist.

Grüße
Christian Behrenberg
 
Danke. Weißt du denn z.B. wie du meine Vorschläge (relatives Koordinatensystem usw.) selber (das ist wichtig) programmieren wirst?!

Gruß
Christian Behrenberg
 
Zurück