Ruckeln bei Schrägen (slopes)

  • GM 8

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

  • Ruckeln bei Schrägen (slopes)

    Hallo liebe Game Maker Community :)

    versuche schon seit längerem funktionierende slopes in mein Spiel einzubauen. Bei den 45° Schrägen gibt es auch keine Probleme, doch bei geringeren Steigungen bzw Gefällen sieht es so aus, als würde man Treppen hoch-/hinunterlaufen und es entsteht so ein unschönes "ruckeln" (auf- und abspringen des Spielers). Jemand eine Idee wie ich das vermeiden kann, sodass die Bewegung flüssiger aussieht? Hatte es auch schon mal mit direction und Winkel probiert, aber entweder hat der Spieler dann bei der ersten Pixelerhöhung gestoppt oder ist am Ende der Steigung wie bei einer Rampe etwas in die Luft gesprungen.
    Hab bereits nach anderen engines gegoogelt, doch das hat mich meist nur noch mehr verwirrt :huh:

    Hier ein Ausschnitt meines right_key events:

    Spoiler anzeigen

    GML-Quellcode

    1. var i;
    2. for (i=-5; i<6; i+=1) {
    3. if (place_free(x + xspd, y - i)) {
    4. x += xspd;
    5. y -= i;
    6. break;
    7. }
    8. }


    Und hier nochmal ein Bild zum vorhandenen ungewollten "Ruckeln" (Variablen oben links nicht beachten / die unterste prüft ob man auf solidem Boden steht).



    Eine GM:Studio Problemlösung wäre genauso gut wie für GM8.0 :thumbsup:
  • Also, wenn ich dein Bild so anschaue, dann sieht es so aus als würdest du precise collision detection, also pixelgenaue Kollision benutzen. Wenn du nun genau hinschaust, siehst du dass die vordere untere Kante der Schuhe ebenfalls schräg ist. Das hat also den Effekt als würdest du zwei Schrägen übereinander hinwegziehen (da ja nur die Vorderkante relevant ist). Und wie du dir nun vielleicht denken kannst, kann es da immer wieder zu Lücken kommen, wenn du die eine Schräge nach rechts und oben verschiebst, weil dann im nächsten Frame ein anderer Pixel des Schuhs für die Kollision verantwortlich ist.
    Mein Tipp also klipp und klar - keine precise collision detection im Charakter verwenden! Ich empfehle es, wie im original Mario, mit einer rechteckigen Maske zu machen, dann kann dieser Effekt nicht mehr auftreten.

    Ich hoffe das hilft dir weiter.
  • Tutorial hab ich mir angeschaut. Werde es mal mit dem script aus dem Video versuchen. Leider funktioniert das aber nur für Steigungen und nicht für Gefälle, müsste man dann nochmal anpassen.

    Precise collision habe ich nur bei den slopes aktiviert, nicht beim Spieler-sprite. Dort ist es nur ein Rechteck. Deswegen geht der Spieler auf dem Bild ja auch schon vor Berührung mit der Schräge nach oben / unten.

    Werd mein script nochmal überarbeiten und dann melde ich mich nochmal. Schon mal danke für die Hilfestellungen ;)

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

  • Push

    Update: Habe mal ein Objekt test erstellt, den code eingefügt, Veriablen angepasst und Gravitation eingestellt und es verhält sich leider auch so wie schon zuvor :/
    So sieht das Objekt test nun aus
    Spoiler anzeigen
    Information about object: test
    Sprite: spr_mario_stand_right
    Solid: false
    Visible: true
    Depth: 0
    Persistent: false
    Parent:
    Mask: spr_mario_mask

    No Physics Object
    Create Event:

    set variable xspd to 1
    Step Event:

    if relative position (0,1) is collision free for Only solid objects
    set the gravity to 1 in direction 270
    else
    set the gravity to 0 in direction 270
    Collision Event with object ground:

    move in direction 270 at most -1 till a contact with solid objects
    set the vertical speed to 0
    Keyboard Event for Key:

    Keyboard Event for Key:

    execute code:

    if place_meeting(x+xspd,y,ground)
    {
    yplus = 0;
    while (place_meeting(x+xspd,y-yplus,ground) && yplus <= abs(1*xspd)) yplus += 1; // prüft wiederholt auf kollision mit ground, yplus höchstens gleich xspd somit maximal 45° slopes; erhöht yplus um 1 falls kollision vorhanden und noch unter xspd ist
    if place_meeting(x+xspd,y-yplus,ground) // wenn trotz höchstem yplus kollision mit ground besteht
    {
    while (!place_meeting(x+sign(xspd),y,ground)) x+=sign(xspd);
    xspd = 0;
    }
    else
    {
    y -= yplus // wenn bei höchstem yplus keine kollision mehr besteht walk up slopes
    }
    }
    x += xspd;


    Ich weiß nun auch wie mein Problem Zustande kommt, allerdings nicht wie ich es umgehen kann. Unzwar folgendes:
    Bei so einer Schrägen im Detail(22,5°, ein großer Punkt steht für ein Pixel)
    ......••••••
    ...••••••••
    ••••••••••
    Geht der Spieler abwechselnd im ersten Step ein Pixel nach rechts und im zweiten Step ein Pixel nach rechts UND nach oben wodurch diese Unregelmäßigkeit entsteht. Ich würde es nun gerne haben dass man quasi jeden Step ein Pixel nach rechts geht und 0,5 Pixel nach oben doch dann würde man teilweise auch die solide Schräge schneiden was bestimmt nicht funktionieren würde(?).

    Vorschläge somit immer noch erwünscht :)
  • Es liegt wahrscheinlich daran, dass du deinen Spieler bei einer Schrägen -5 Pixel nach oben laufen lässt, da aber die Schräge nur 2 Pixel hoch geht, wird dein Spieler also 3 Pixel in die Luft teleportiert, da er diese durch die Schwerkraft wieder ausgleicht entsteht dieser Effekt.

    Man könnte es so lösen, dass du bis zu einem bestimmten Wert schaust, wann Y frei ist. Also z.B. so:

    GML-Quellcode

    1. if place_free(x+5 ,y-5)
    2. {
    3. if place_free(x+5,y-1) { x += 5 ; y -= 1}
    4. else {if place_free(x+5,y-2) { x += 5 ; y -= 2}
    5. else {if place_free(x+5,y-3) { x += 5 ; y -= 3}
    6. else {if place_free(x+5,y-4) { x += 5 ; y -= 4}
    7. else {if place_free(x+5,y-5) { x += 5 ; y -= 5}
    8. }
    9. }
    10. }
    11. }
    12. }
    Alles anzeigen


    Jetzt wird bis zum Wert 5 geschaut, ob Y frei ist, das niedrigste nimmt er dann.
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.