Platformer Jump Problem

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Platformer Jump Problem

    Hallo,

    ich habe mich jetzt schon an mehreren Jump 'n Runs versucht,
    bin aber immer auf das selbe Problem beim Springen gestoßen:

    Wenn meine Figur springt, bleibt sie ständig bereits VOR dem Boden stehen (in unterschiedlichen abständen, ja nach Fallhöhe) um dann aufgrund der Gravity wieder weiter zu fallen :huh:
    Manchmal landet sie auch richtig auf dem Boden. An der Collision mask wird es also nicht liegen, da der Abstand ja sonst immer gleich sein solte.

    Ich habe das ganze jetzt erst mal zum testen so simpel wie möglich gehalten.

    Hat von euch schon Jemand ein ähnliches Problem gehabt, oder davon gehört?
    Und gibt es eine Simple Möglichkeit das Problem zu beheben, ohne seine eigenen Gravity/Collision functions zu scripten?
    Habe schon gehört die GM eigenen collisions wären halt einfach für die Tonne...

    Hier sind meine scripts.

    :event_create: Create Event

    GML-Quellcode

    1. gravity_direction = 270
    2. gravity = 0.5


    :event_collision: Collision mit obj_wall:

    GML-Quellcode

    1. vspeed = 0
    2. hspeed = 0

    :event_keypress: Key Press space:

    GML-Quellcode

    1. vspeed = -10


    Eine exe oder project Datei kann ich leider nicht hochladen, da mein Internet im Moment einfach unter aller Sau ist :l

    Über Hilfe, damit ich endlich mal weiter komme, würde ich mich sehr freuen :)

    Gruß,


    -Kevin
    Ware wa messiah nari! Hahaha
  • boxxar schrieb:

    Verwende die Funktion move_contact_solid im Kollisionsevent, die bewegt die Instanz an den exakten Ort der Kollision.

    Danke für die schnelle Antwort, ich seh's mir gleich mal an!

    EDIT:
    Mein Code sieht jetzt so aus:

    gravity = 0;
    if !place_meeting(x,y+1, obj_wall)
    {
    move_contact_solid(270, -1);
    vspeed = 0;
    hspeed = 0;
    }

    Ohne Gravity = 0 fällt der Player nach kurzer Zeit durch den Boden.
    Mit gravity = 0 fällt er zwar nicht durch, jedoch steigen vspeed und hspeed (letztere kommt nicht mal im script vor <_> :headtouch: ) immer weiter an.

    Setze ich die speeds nach move contact auf 0, sieht das ganze anständig aus. Jedoch steigt die hspeed :headtouch: nach jedem sprung sehr geringfügig an,
    frei nach dem Motto 1 + 1 = 1.999999943294623984 ²
    Während die vspeed mal bei 0 ist, mal bei 10, mal bei 14... Auch die y Position ändert sich. Mal präzise 416 mal 416.50 ?(

    So erst mal die Lage. Ich Versuch mal weiter dran rum.


    Noch eine Idee wie's besser läuft?
    PS: Visuell sieht alles gut aus! Jedoch im Debug menu spinnen die Speeds und Position halt ein bisschen, und ich würde diesen Mist gerne zu Beginn im Keim ersticken :)
    Ich kann ja wohl erwarten, dass die Maschine wenigstens so Präzise ist wie ich selbst! 8o

    Gruß,



    -Kevin
    Ware wa messiah nari! Hahaha

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von derkevevin ()

  • Hi
    ist zwar etwas spät, aber hier habe ich mal was für dich. Das gehört alles deine Objekt Player:

    Im Creat

    GML-Quellcode

    1. // Animationsgeschwindigkeit
    2. image_speed = 0;
    3. // Alle Variabeln auf null setzen.
    4. vspeed = 0;
    5. hspeed = 0;
    6. jump = false // Variabel für den Sprung
    7. fallen = false; // Variabel für runterfallen.
    8. x_dir = false; // Variabel für die Richtung rechts und links - false = links - true = rechts
    Alles anzeigen


    im Step gibt es 4 Excute a piece of code
    Nummer 1:

    GML-Quellcode

    1. // --- <= Bewegungroutine => --- //
    2. ///////////////////////////////////
    3. hspeed = 0;
    4. vspeed += 1;
    5. ///////////////////////////////////////////////////
    6. // Hier wird Überprüft ob du die D-Taste drückst //
    7. ///////////////////////////////////////////////////
    8. if (keyboard_check(ord("D")) )
    9. {
    10. image_speed = 0.5; // Animationsgeschwindigkeit
    11. hspeed += 4; //x += 4;
    12. x_dir = true; // rechts
    13. }
    14. ///////////////////////////////////////////////////
    15. // Hier wird Überprüft ob du die A-Taste drückst //
    16. ///////////////////////////////////////////////////
    17. if (keyboard_check(ord("A")) )
    18. {
    19. image_speed = 0.5; // Animationsgeschwindigkeit
    20. hspeed -= 4; //x -= 4;
    21. x_dir = false; // links
    22. }
    23. ////////////////////////////////////////////////
    24. // Animationsgeschwindigkeit auf Null setzen //
    25. // sobald die Taste A oder D losgelassen wird //
    26. ////////////////////////////////////////////////
    27. if (keyboard_check_released(ord("A"))) || (keyboard_check_released(ord("D")))
    28. {
    29. image_speed = 0;
    30. image_index = 0
    31. }
    32. //////////////////////////////////////////////////
    33. // Hier wird Überprüft ob du die W-Taste drückst //
    34. // Ist für das Springen der Figur //
    35. //////////////////////////////////////////////////
    36. if (keyboard_check_pressed(ord("W")))
    37. {
    38. if (place_free(x,y+1) == false)
    39. {
    40. vspeed -= 12; // - \/ Sprung-Höhe \/ -
    41. jump = true; // Player springt
    42. }
    43. }
    44. ///////////////////////////////////////////////////////
    45. // Hier wird Überprüft ob du die W-Taste nur kurz //
    46. // drückst. Wenn ja wird die Sprunghöhe halbiert //
    47. ///////////////////////////////////////////////////////
    48. if (keyboard_check_released(ord("W")) )
    49. {
    50. if (vspeed <0)
    51. {
    52. vspeed /= 2;
    53. jump = true; // Player springt
    54. }
    55. }
    Alles anzeigen


    Nummer 2

    GML-Quellcode

    1. // --- <> Kollisionen <> ---
    2. if place_free(x+hspeed,y) == false // Kollisionserkennung Links-Rechts
    3. {
    4. if hspeed > 0
    5. {
    6. move_contact_solid(0,-1)
    7. }
    8. if hspeed < 0
    9. {
    10. move_contact_solid(180,-1)
    11. }
    12. hspeed = 0
    13. }
    14. if place_free(x,y+vspeed) == false // Kollisionserkennung Oben-Unten
    15. {
    16. if vspeed > 0
    17. {
    18. move_contact_solid(270,-1)
    19. }
    20. if vspeed < 0
    21. {
    22. move_contact_solid(90,-1)
    23. }
    24. vspeed = 0
    25. fallen = false; // Player fällt nicht mehr
    26. }
    Alles anzeigen


    Nummer 3

    GML-Quellcode

    1. // --- || Sprites || ---
    2. if (x_dir == true) && (fallen == false) // Player geht nach rechts
    3. {
    4. sprite_index = Player_rechts;
    5. }
    6. if (x_dir == false) && (fallen == false) // Player geht nach links
    7. {
    8. sprite_index = Player_links;
    9. }
    10. if (x_dir == true) && (jump == true) // Player springt rechts-hoch
    11. {
    12. sprite_index = Player_springen_hoch_rechts;
    13. }
    14. if (x_dir == false) && (jump == true) // Player springt links-hoch
    15. {
    16. sprite_index = Player_springen_hoch_links;
    17. }
    18. //////////////////////////////
    19. // Player fällt nach unten //
    20. //////////////////////////////
    21. if (vspeed>0)
    22. {
    23. fallen = true;
    24. jump = false;
    25. }
    Alles anzeigen


    Nummer 4

    GML-Quellcode

    1. // Sobald der Player nach unten //
    2. // fällt zeige entsprechenden Sprite //
    3. ///////////////////////////////////////
    4. {
    5. if (fallen == true) && (x_dir == true) // Variabel fallen testen mit der Richtung
    6. {
    7. sprite_index = Player_springen_runter_rechts; // Sprite fällt für rechts
    8. }
    9. if (fallen == true) && (x_dir == false) // Variabel fallen testen mit der Richtung
    10. {
    11. sprite_index = Player_springen_runter_links; // Sprite fällt für links
    12. }
    13. }
    Alles anzeigen


    Man könnte auch alles in ein Excute a piece of code schreiben, aber so ist übersichtlicher wenn du nach einen Fehler suchst, ober es erweitern willst.

    Gruss Drachen

    ================================================================================================================================
    25-07-2014 - 16.50Uhr
    Habe soeben die Variabel Schwerthieb aus der Nummer 4 entfernt. Die brauchts du nicht. Außer dein Player kämpft mit einen Schwert. :)

    Gruss Drachen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Drachen ()

  • Ich möchte auch noch etwas dazu sagen, ihr kennt ja sicherlich das Problem, dass wenn ihr schneller werdet die Collisionsfunkion zu langsam ist und euer Spieler deshalb im Boden stecken kann. Ich löse das dann immer so:

    GML-Quellcode

    1. if not place_free(x,y+vspeed+1) // Die 1 kann man auch weglassen, dadurch wird nur noch etwas genauer gearbeitet
    2. {
    3. gravity = 0
    4. vspeed = 0
    5. }
    6. else
    7. {
    8. gravity = 0.4
    9. }


    Das kann man genauso mit hspeed und x machen, ich finde das funktioniert besser als move_contact_solid


    Edit:

    Man kann ganz unten rechts das Thema als erledigt markieren. Wenn deine Frage beantwortet wurde.
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • Dufner schrieb:

    Ich möchte auch noch etwas dazu sagen, ihr kennt ja sicherlich das Problem, dass wenn ihr schneller werdet die Collisionsfunkion zu langsam ist und euer Spieler deshalb im Boden stecken kann. Ich löse das dann immer so:

    GML-Quellcode

    1. if not place_free(x,y+vspeed+1) // Die 1 kann man auch weglassen, dadurch wird nur noch etwas genauer gearbeitet
    2. {
    3. gravity = 0
    4. vspeed = 0
    5. }
    6. else
    7. {
    8. gravity = 0.4
    9. }


    Das kann man genauso mit hspeed und x machen, ich finde das funktioniert besser als move_contact_solid


    Edit:

    Man kann ganz unten rechts das Thema als erledigt markieren. Wenn deine Frage beantwortet wurde.

    Vielen Dank auch für deinen Beitrag!
    In welchen Event packst du den code denn rein? Collision oder step?
    Und ja, ich werds als erledigt markieren, wenn mein Problem gelöst ist. Hatte die Tage nicht so viel Zeit zum testen.
    Ware wa messiah nari! Hahaha