C++ Spielfigur hüpfen lassen



  • Hallo,

    ich bin momentan dabei mit ein paar Kollegen (Fachinformatiker 2. Lehrjahr) ein kleines 2D jump 'n' run Spiel zu programmieren.
    Mein Job ist es momentan die Spielfigur zum hüpfen zu bringen, da ein jump 'n' run ohne "jump" ja leicht sinnlos ist 😉

    hab allerdings keine Ahnung wie ich es Pogrammieren soll, dass meine Spielfigur nach einmaligem Tastendruck selbstständig hüpft und was für einen Algorithmus ich brauche um die Hüpfbewegung auch real aussehen zu lassen, also keine eckige Bewegung zu haben... Ausserdem muss die Figur je nachdem ob eine Pfeiltaste gedrückt wurde auch noch in die jeweilige Richtung hüpfen.

    Da ich bis jetz eigentlich immer nur kleine C-Konsolenanwendungen programmiert habe und mein C++ Seminar im Geschäft wieder ne Weile her isch bin ich damit also momentan leicht überfordert 😉

    ich hoffe mal ihr versteht was ich meine und könnt mir weiter helfen!!

    lg, Rebecca

    edit: weiß ja nich ob des wichtig is: hab zum Programmieren Microsoft Visual Studio.net

    edit2: haben noch diese Engine eingebunden (http://hge.relishgames.com/)



  • Also ich würde das problem von der logischen Sicht her (grob) folgendermaßen lösen:

    Zuerst mal ein paar Variablen definieren

    jump_height = 50 //pixel
    jump_width =  100 //pixel
    

    Dann die Ausführung

    if(Spieler drückt KEY_UP) {                     //nur nach oben springen
      -> Sprunganimation der Figur abspielen
      for(int i=0; i<jump_height; i++) {
        if(KollisionNachOben==FALSE) {
          -> POS Y der Figur--;
          -> 25 Millisekunden warten 
        }
      }
    
      while(KollisionNachUnten==FALSE) {
        -> POS Y der Figur++;
        -> 25 Millisekunden warten 
      }
    }
    

    Fast das gleiche muss passieren, wenn der Spieler KEY_UP und eine Richtung drückt (KEY_RIGHT, KEY_LEFT). (Den Punkt berechnen wo die Figur am höchsten ist, Kollisionen überprüfen...)

    Ich hoffe ich konnte dir helfen!



  • Siehe Physikbuch, zweite Klasse. Was heut so alles FI wird... f'`8k

    Bye, TGGC (\-/ returns)



  • Du brauchst eine Variable für die x- und y-Geschwindigkeit. Der Absprung setzt die y-Geschwindigkeit nach Oben (ins negative). Dann musst du einfach bei jedem Frame ein bisschen auf die y-Geschwindigkeit addieren, dass simuliert eine realistische Schwerkraft (Die auch ständig alles nach unten zieht). Nun musst du nurnoch darauf achten, dass bei kollision mit dem Erdboden die Y-Geschwindigkeit wieder auf Null gesetzt wird.



  • hey, erstma bitte keine Beleidigungen, ich bin immer noch gut genug um die Ausbildung zu verkürzen...

    hm... ok, das was Roland geschrieben hat hab ich im prinzip schon, und die Kurve werd ich sicha auch hinkriegen, danke 😉

    mein momentan größtes Problem ist, dass ich laut meinem Kollegen an der Stelle, an der ich Programmiere (Object.cpp, if(hge->Input_GetKeyState(HGEK_SPACE))...
    keine Schleife machen darf. d.h. aber im Moment dass ich auf Space gedrückt halten muss damit meine Spielfigur die ganze Hüpfbewegung macht.



  • Du mußt natürlich die Bewegung des Objekts an regelmäßige "Ticks" koppeln, die unabhängig von Eingaben erfolgen. Der Tastendruck löst die Bewegung nur aus, teilt der Spielfigur also mit, daß sie nun hüpfen soll; das Hüpfen selbst passiert dann "von allein".



  • crazy-smiling schrieb:

    hey, erstma bitte keine Beleidigungen, ich bin immer noch gut genug um die Ausbildung zu verkürzen...

    hm... ok, das was Roland geschrieben hat hab ich im prinzip schon, und die Kurve werd ich sicha auch hinkriegen, danke 😉

    mein momentan größtes Problem ist, dass ich laut meinem Kollegen an der Stelle, an der ich Programmiere (Object.cpp, if(hge->Input_GetKeyState(HGEK_SPACE))...
    keine Schleife machen darf. d.h. aber im Moment dass ich auf Space gedrückt halten muss damit meine Spielfigur die ganze Hüpfbewegung macht.

    dann machst du eine bool-Variable names SpringeGerade oder so, diese setzt du auf true sobald die taste gerdrückt wurde und die if abfrage für die taste sieht dann so aus:

    if(hge->Input_GetKeyState(HGEK_SPACE) || SpringeGerade)
    {
     SpringeGerade = true;
     // blabla
     if(Sprunge Zu ende oder wo es auch immer zu ende ist)
     {
      SpringeGerade = false;
     }
    }
    

    mfg.



  • In meinen Programmen lass ich eine Eigene Funktion die Tastatureingabe übernehmen, die die Eingabe auf der Tastatur dann natürlich auch auswertet, und dann ein struct zurückgibt, in dem die alle tasten mit Namen wie "jump" und "shoot" gespeichert sind. Wenn dann die variable "jump" auf 1 Steht, und kontakt zum Boden besteht, kann dann die Sprungsequenz eingeleiteitet werden. Selltest du meinen lösung ausprobieren, reicht an dieser stelle ein verändern der y Geschwindigkeit und eventuell eine Sprunganimation (die keine Höhenveränderung enthält) Gestartet werden. Die weiche Sprungkurve wird automatisch dadurch entstehen, dass die Schwerkraft das obrekt bei jedem frame (oder abhängig von der Vergangenen Zeit) ein wenig nach unten Beschleunigt. Ich empfehle wirklich die sache so anzugehen, denn es wird vieles leichter machen, und es sieht besser aus, als so ein Eckiger Sprung.

    Edit: Was ich noch vergessen habe zu sagen, ist dass die x- und y- Koordinaten in einem float oder double gespeichert werden sollten, denn sonst werden fast alle Bewegungsinformationen (die sich meist so zwischen 3 und 0 befinden) bei jeder Aktualisierung der Koordinaten weggerundet und es wird wieder unschön.



  • TGGC schrieb:

    Siehe Physikbuch, zweite Klasse. Was heut so alles FI wird... f'`8k

    Bye, TGGC (\-/ returns)

    Ich sag nur: 3 Jahre Ausbildung und ich hatt nicht eine Stunde Mathematik in der Berufsschule 😞



  • TGGC schrieb:

    Siehe Physikbuch, zweite Klasse. Was heut so alles FI wird... f'`8k

    Bye, TGGC (\-/ returns)

    Ich sag nur: 3 Jahre Ausbildung und ich hatt nicht eine Stunde Mathematik in der Berufsschule 😞



  • Hi!

    Naund? Was hat das damit zu tuen? 😛 Du hast die Grundlagen in der Schule gelernt. Alles weitere lässt sich durchaus selbst aneignen.

    grüße



  • schon blöd dass es in der Ausbildung kein MAthe mehr gibt, aba was solls...

    wollt mich nochma schnell für eure Hilfe bedanken, habs hin gekriegt 🙂 *freu*

    if(hge->Input_GetKeyState(HGEK_SPACE)||sprung==true)
    {
    
     Objectlist[i].spr->SetFrame(9);	                             
    
     if(sprung==false)
     {
       f_sprung_startpos=Objectlist[i].y;			
       sprung=true;						
       f_y=1;
     }
    
     Objectlist[i].y = Objectlist[i].y-(Objectlist[i].vy * dt)+f_y;
     f_y+=0.2;
    
    if(f_sprung_startpos<=Objectlist[i].y)
    {
      sprung=false;		
      Objectlist[i].y=f_sprung_startpos;
    }
    

    so, vielleicht nich ganz so wie ihr des gemeint hattet, aba läuft un sieht gut aus 😉 also thx!



  • TGGC schrieb:

    Siehe Physikbuch, zweite Klasse. Was heut so alles FI wird... f'`8k

    Bye, TGGC (\-/ returns)

    Aber selbst die Diplomarbeit über A* schreiben 🙄



  • Delryn schrieb:

    Aber selbst die Diplomarbeit über A* schreiben 🙄

    A* macht weniger als 5% davon aus. Ich weiss, ist nicht so leicht zu verstehen. f'`8k

    Autocogito

    Gruß, TGGC (\-/ returns)



  • ich habe so etwas auch schon einmal gemacht
    und ich habe das springen mit einer wurfparabel dargestellt:

    y = V * t * sin(w) - 0.5*G*pow(t,2);
    x = V * cos(w) * t;
    

    V = geschwindigkeit
    w = winkel
    t = zeit
    G = erdanziehungskraft ( 9,8 )

    du musst nur die zeit erhöhen, und die geschwindigkeit so einstellen, des er nicht zu weit fliegt *g*

    mfg
    luki



  • Au weier. Das ist absolut der Falsche Ansatz um ein Spiel halbwegs realistisch aussehen zu lassen. man sollte bevor man etwas tut nicht nur darauf Achten, dass es hinterher so in etwa so aussieht, wie im realen leben, Also eine Parabel in der Wirklichkeit entsteht bestimmt nicht deshalb, weil vor dem Wurf jemand eine Parabel ausrechnet, die das Objekt hinterher Abwandert. Eine Parabel entsteht, indem eine Durchgehende Kraft ständig an einem Ojekt zieht, und somit die bewegungsrichtung ändert.

    Eine animation eines Bildes in dem ein Objekt sich hoch und wieder Herunter Bewegt ist auch ein Komplett falscher weg einen Realistischen Sprung hinzubekommen.


Anmelden zum Antworten