[DX] In einer 3D-Anwendung die Kamera springen lassen...
-
Hallo,
ich möchte in meinem Programm den Spieler durch Drücken der Leertaste
springen lassen.
Die Abfrage der Tastaturereignisse sieht so aus:
[void GetInput(float timeDelta) { // ... if (KEYDOWN(KbBuffer, DIK_SPACE)) if (m_IsJumping == false) m_IsJumping = true; // Do jump updates Camera->Jump(timeDelta, &m_IsJumping); }Diese Funktion wird bei jedem Renderaufruf aufgerufen und überträgt
die aktuellen Tastaturereignisse auf die Kamera-Klasse.
m_IsJumping ist eine boolesche Variable, die nur auf true steht, wenn die
Kamera gerade "am springen" ist, und danach wieder auf false gestellt wird.Die Spring-Funktion sieht so aus:
void CCamera::Jump(float timeDelta, bool* _isJumping) { if (!*_isJumping) { m_v0 = m_JumpVelocity; // Sprunggeschwindigkeit m_v1 = 0; // temporäre Variable m_g = 200; // Erdbeschleunigung m_OldPos = GetPos(); } else { // aktuelle Geschwindigkeit errechnen double vy = m_v0 - m_g*timeDelta; // aktuellen weg während delta t errechnen double s = ((m_g * pow(timeDelta, 2)) / 2) + vy*timeDelta; // Position setzen SetPos(D3DXVECTOR3(GetPos().x, GetPos().y + (float)s, GetPos().z)); // Wenn der Boden erreicht ist, abbrechen if (GetPos().y <= m_OldPos.y) { *_isJumping = false; SetPos(D3DXVECTOR3(GetPos().x, m_OldPos.y, GetPos().z)); } m_v1 = vy; m_v0 = m_v1; } }klappt ja auf jeden Fall in der Theorie, aber ich möchte die Funktion so
ändern, dass ich die Leertaste gedrückt halten kann und er unmittelbar
auf das Ende des Sprungs wieder zu einem neuen Sprung ansetzt.
Jetzt bleibt er bei gedrückt halten der Leertaste einfach am Boden, erst wenn
ich sie loslasse und dann wieder drückt, springt er wieder.Kann mir damit jemand mit diesem Problem helfen, mir evtl auch
Verbesserungsvorschläge zu dieser Funktionsweise geben?
Norman.
-
if (KEYDOWN(KbBuffer, DIK_SPACE)) if (m_IsJumping == false) //<---!!!!!! m_IsJumping = true;
-
Was meinst du damit?
Wenn im moment nicht gesprungen wird und die Leertaste gedrückt wird,
gehe in den "Spring-Modus" durch setzen der Variablen. Von da an ist die
Variable ja auf true gesetzt, bis die Kamera wieder auf dem Boden angekommen
ist, dann wird die Variable wieder auf false gesetzt...
Norman.
-
// Wenn der Boden erreicht ist, abbrechen if (GetPos().y <= m_OldPos.y) { *_isJumping = false; SetPos(D3DXVECTOR3(GetPos().x, m_OldPos.y, GetPos().z)); }Und du weißt ganz sicher, dass der Boden an dieser Stelle nicht höher ist als vorher?
-
Ja, der Boden ist im Moment bloß eine Ebene und wird auch nicht
über Kollisionen abgefragt sondern bloß über die Y-Höhe der Kamera
über 0. Sobald die Höhe der Kamera unter dem Boden liegt, wird die vorherige
Höhe wieder hergestellt, damit man nicht im Boden versinkt.