Rakete und fester Punkt am Raumschiff



  • Hi,
    ich will mein 2D Game sehr "realistisch" gestalten, und deshalb die Raketen schon vor dem Abschuss auf die richtige Position meiner F16 setzen - als Beispiel jetzt einmal ein Punkt unter dem linken Flügel.

    Ich hab dafür den Punkt ausgerechnet:

    float TempPositionX = Ship->GetPositionX();
    float TempPositionY = Ship->GetPositionY();
    
    TempPositionX += (Ship->GetWidth() / 4 - 1);
    TempPositionY += (Ship->GetHeight() / 2) - 11;
    
    Rakete->SetPosition(TempPositionX, TempPositionY);
    

    Das ist hier:
    [img=http://img411.imageshack.us/img411/5733/bild1zso.jpg]

    (Der Rote Pfeil zeigt auf den "Kopf" der unter dem Flügel rausschaut)

    Soweit kein Problem - aber die Rakete muss sich mitdrehenen, wenn sich mein Schiff dreht / bewegt - genau das ist das Problem an dem ich hier seit einem Tag sitze 😉

    Dafür hab ich eine Funktion gemacht, die die Rakete jeden Frame auf diesen Punkt setzen soll:

    Rakete->SetRotation(Ship->GetRotation());
    
    float TempPositionX = Ship->GetPositionX();
    float TempPositionY = Ship->GetPositionY();
    TempPositionX += (Ship->GetWidth() / 2) - (Rakete->GetWidth() / 2);
    TempPositionY += (Ship->GetHeight() / 2) - (Rakete->GetHeight() / 2);
    
    TempPositionX += sin(Ship->GetRotation()) * Ship->GetHeight() / 2;
    TempPositionY -= cos(Ship->GetRotation()) * Ship->GetHeight() / 2;
    
    Rakete->SetPosition(TempPositionX, TempPositionY);
    

    Soweit bin ich jetzt - die Rakete ist genau vor dem Raumschiff (eigentlich knapp über dem Mittelpunkt, schaut aber vorne heraus) - aber wie kann ich die jetzt auf den "Raketenpunkt" unter den linken Flügel bringen?
    Das hier hab ich schon probiert - erzeugt aber eine Ellipse:

    Rakete->SetRotation(Ship->GetRotation());
    
    float TempPositionX = Ship->GetPositionX();
    float TempPositionY = Ship->GetPositionY();
    TempPositionX += (Ship->GetWidth() / 2) - (Rakete->GetWidth() / 2);
    TempPositionY += (Ship->GetHeight() / 2) - (Rakete->GetHeight() / 2);
    
    TempPositionX += sin(Ship->GetRotation() - 1.5f) * Ship->GetHeight() / 2;
    TempPositionY -= cos(Ship->GetRotation() - 0.1f) * Ship->GetHeight() / 2;
    
    Rakete->SetPosition(TempPositionX, TempPositionY);
    

    Hoffe auf viele Antworten 😉

    mfg



  • Google mal nach dem Begriff Szenengraph. Das Konzept dürfte dir einiges erleichtern.



  • Arr0ws schrieb:

    Rakete->SetRotation(Ship->GetRotation());
    
    float TempPositionX = Ship->GetPositionX();
    float TempPositionY = Ship->GetPositionY();
    TempPositionX += (Ship->GetWidth() / 2) - (Rakete->GetWidth() / 2);
    TempPositionY += (Ship->GetHeight() / 2) - (Rakete->GetHeight() / 2);
    
    TempPositionX += sin(Ship->GetRotation() - 1.5f) * Ship->GetHeight() / 2;
    TempPositionY -= cos(Ship->GetRotation() - 0.1f) * Ship->GetHeight() / 2;
    
    Rakete->SetPosition(TempPositionX, TempPositionY);
    

    Du solltest denselben Winkel innerhalb von sin und cos subtrahieren. Für eine Position links dürfte es PI/2 sein, also:

    TempPositionX += sin(Ship->GetRotation() - MATH_PI/2) * Ship->GetHeight() / 2;
    TempPositionY -= cos(Ship->GetRotation() - MATH_PI/2) * Ship->GetHeight() / 2;
    


  • Hast du auf spieleprogrammierer.de nicht auch diese Frage gestellt...


  • Mod

    Hobby Programmierer schrieb:

    Hast du auf spieleprogrammierer.de nicht auch diese Frage gestellt...

    was hat das bitte mit dem topic zu tun?


Anmelden zum Antworten