SDL2 Jump'n Run Demo



  • Das ist richtig. Aber komischerweise bleibt der Spieler bei der Landung 1 Pixel über dem Boden stehen. So eckt schonmal eine obere Ecke an darüberliegende block an wenn man zur Seite läuft. Ich glaube ich sehe gerade den Wald vor lauter Bäumen nicht 🙂


  • Mod

    Wohin setzt du den Spieler denn, wenn es eine kolision gab?



  • guitarlo schrieb:

    Ich bin reiner Hobbycoder daher hoffe ich das der Code einigermaßen ordendlich geschrieben ist 😉

    Schalt noch die Warnungen im Compiler ein.



  • rapso schrieb:

    Wohin setzt du den Spieler denn, wenn es eine kolision gab?

    Ich addiere in der Mainschleife jedesmal die y Position mit der y Velocity. Also in dem Falle der Schwerkraft. Also ich hatte mir das so vorgestellt:

    mainschleife
    {
    y position + velocity= neue position
    ycollisions abfrage der neuen Position
    Wenn die neue Posiotion mit dem Boden kollidiert, wird die alte Position beibehalten.
    Findet keine Kollision statt, wird die neue Position übernommen.
    }

    Und aus irgendeinem Grund bleibt bei jedem 2. Sprung der Player 1 Pixel über'n boden und kollidiert somit mit freischwebenden Blöcken.



  • guitarlo schrieb:

    coder daher hoffe ich das der Code einigermaßen ordendlich geschrieben ist 😉

    Keine Klassenstruktur, globale Variablen, wilder Mischmasch ziwschen float und int => Da ist noch viel Luft nach oben.

    Warum setzt du in Scene() jump = true? Willst du immer springen? Warum erhöst du in Scene() grav immer um 0,4?

    guitarlo schrieb:

    mainschleife
    {
    y position + velocity= neue position
    ycollisions abfrage der neuen Position
    Wenn die neue Posiotion mit dem Boden kollidiert, wird die alte Position beibehalten.
    Findet keine Kollision statt, wird die neue Position übernommen.
    }

    Also heißt Kollision mit dem Boden => letzte Position wo noch keine Kollision stattgefunden hat? Und du überprüfst das immer Pixelweise? Kann es nicht sein, dass die letzte geprüfte Position eben 1 Pixel über dem Boden ist, wenn die aktuelle geprüfte Position schon im Boden ist?



  • Ja stimmt, auf Klassen habe ich in diesem Beispiel komplett verzichtet.
    Wäre übersichtlicher, hast du recht. Sorry.

    Ja die Sache mit der Gravity ist mir auch aufgefallen. Die Gravity ist jetzt konstant. Hab sie im obrigen Quelltext fälschlicherweise anstatt yVelocity benutzt.

    Wenn der Player springt wurde die grav auf -4.5 gesetzt und dann beim auf +2 hochgezählt damit er wieder fällt. Somit bekommt jetzt die yVelocity einen wert von -4.5 (fand ich als Sprunggeschwindigkeit okay ;)) und die Gravity wir addiert so dass der Player wieder fällt.

    Vor der Kollisionsabfrage ist jump auf true. Findet keine Bodenkollision statt wird jump auf false gesetzt. Sollte ich das anders machen?

    Um die Bewegung des Spielers zu verlangsamendie habe ich float benutzt. So konnte ich die Nachkommastellen addieren. Somit wird auf SDL_Rect die xVelocity gerundet und der Spieler ist langsamer. Höchstwahrscheinlich gibt es da eine bessere möglichkeit.

    Schlangenmensch schrieb:

    Also heißt Kollision mit dem Boden => letzte Position wo noch keine Kollision stattgefunden hat? Und du überprüfst das immer Pixelweise? Kann es nicht sein, dass die letzte geprüfte Position eben 1 Pixel über dem Boden ist, wenn die aktuelle geprüfte Position schon im Boden ist?

    Guter Ansatz aber komischer weise ist der Pixel versatz nur nach jedem 2. Sprung drin.

    Aber schonmal danke für die Hilfe! 🙂


  • Mod

    guitarlo schrieb:

    rapso schrieb:

    Wohin setzt du den Spieler denn, wenn es eine kolision gab?

    Ich addiere in der Mainschleife jedesmal die y Position mit der y Velocity....

    Wenn die neue Posiotion mit dem Boden kollidiert, wird die alte Position beibehalten.
    ..

    wie weit ist die alte position entfernt vom boden?



  • Ein Pixel da es pixelweise abgefragt wird.
    Das wunderliche ist, dass es nur bei jedem 2. Sprung so ist.


  • Mod

    guitarlo schrieb:

    Ein Pixel da es pixelweise abgefragt wird.

    if (grav>2)
            grav=2;
    ...
        Hero.yVel=(int)grav;
    ...
        Hero._ycolpos.y=int(Hero.xypos.y+Hero.yVel);
    ...
        if (Collision.ycollide)
            Hero._ycolpos.y=Hero.xypos.y;
    

    Das wunderliche ist, dass es nur bei jedem 2. Sprung so ist.

    setz einen breakpoint wo kollision festgestellt wird und loese die verweunderung auf 😉



  • Okay danke 😉


Anmelden zum Antworten