[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.


Anmelden zum Antworten