Figur klebt trotzdem an Blöcken

  • GM 8

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

  • Figur klebt trotzdem an Blöcken

    Hallo mein Name ist Thomas (29).

    Ich habe seit wenigen Tagen angefangen den GameMaker zu testen und war bisher eigentlich sehr zufrieden (mit meinem Anfänger-Ergebnis).
    Jetzt komme ich jedoch zu folgendem Problem, bei welchem mir bisher weder Google noch das Forum hier richtig helfen konnte.

    Um es kurz zu machen:

    Meine Figur klebt beim Sprung am Plattformblock seitlich, wenn während des Sprungs die Bewegentaste weiterhin gedrückt wird.

    Was ich bisher versucht habe:
    -Precise collision checking zu deaktivieren
    -Collision Mask anzupassen
    -rechteckige Collision Mask verwendet
    -Abfrage, dass wenn eine Figur in der Luft ist und ein solides Objekt seitlich berührt, hspeed auf 0 gesetzt wird (war ich wahrscheinlich noch nicht gut genug zum coden).
    Jedenfalls geht das bei mir nur, wenn die Bewegungstaste vom Spieler kurz losgelassen wird... Was ja keiner im normalen Spielablauf macht.
    -Hatte auch noch nen Beitrag hier im Forum gefunden, wo das Problem gelöst wurde, jedoch war dort die Datei für den GM8.1 (oder das Game-Studio?). Sie ließ sich jedenfalls
    bei mir nicht öffnen.

    Wäre für Hilfe dankbar.

    Ich häng die Datei mal mit an -> bitte nicht wundern wenn im Code diverse Kommentare auftauchen: Da hatte ich versucht die Sache mit Hilfe von gefundenen Code-Schnipseln probeweise zu beheben ;)
    Dateien
    • 2try.rar

      (20,57 kB, 115 mal heruntergeladen, zuletzt: )
  • Danke für die schnelle Antwort.

    Hab es gerade getestet, jedoch kommt der Fehler immer noch. :(

    Wäre es sinnvoll wenn ich per Step-Event auf eine seitliche Kollision prüfen würde (wenn das überhaupt geht :D) und falls das true ist, dann die Eingaben für rechts und links blocke?

    PS: So richtig hab ich das Step-Event noch nicht ganz verstanden...

    Ich weiß dass ich bei den Roomproperties den Speed einstellen kann. Die dort angegebene Anzahl müsste den Steps per Sekunde entsprechen.
    So richtig hatte das bei mir aber auch nicht geklappt. ?(
  • Ok, sorry, hat noch was vergessen, nämlich genau das, was du meinst.
    Im Step muss noch abgefragt werden, ob eine Kollision in die Laufrichtung ist und wenn ja, dann muss die hspeed auf 0 gesetzt werden, damit er stehen bleibt.

    Wie das geht, zeig ich gleich, erstmal zum Step-Event:
    Die room speed, gibt die Anzahl der Steps pro Sekunde an. Wenn du also eine room speed von 30 hast, gibt es 30 Steps in der Sekunde. In jedem dieser Steps wird das Step Event von allen Objekten ausgeführt. Im Grunde eigentlich nicht schwer.
    Code zwischen den Steps gibt es nicht, weil der Code in den Steps ausgeführt wird. Man könnte auch sagen Refresh Rate.
    In jedem Step wird alles gedrawt und das was im Step Event ist, ausgeführt.
    Ich hoffe das war einigermaßen verständlich ^^

    Ok, jetz wieder zu dem Problem:
    Das ist dein Code:

    GML-Quellcode

    1. if(place_free(x-20,y) && keyboard_check(vk_left))
    2. {
    3. sprite_index = spr_pl_walk_left;
    4. image_speed = 0.5;
    5. hspeed = -4;
    6. }

    Du willst jetzt, dass falls eine Kollision besteht, dass die Geschwindigkeit auf 0 gesetzt wird, damit er nicht in die Wand reinläuft. Ob eine Kollision besteht hast du ja schon mit place_free(x-20,y) geprüft. D.h. man könnte eigentlich noch ein else dazu schreiben, wo dann hspeed auf 0 gesetzt wird. Was wäre aber, wenn zwar Platz ist, aber man nicht vk_left drückt, sondern vk_right ? Der else Block würde ausgeführt werden (weil vk_left nich gedrückt wird) und die hspeed auf 0 gesetzt. Das wäre schlecht. Also musst du den Block nochmal untergliedern in 2 if Abfragen:

    GML-Quellcode

    1. if(keyboard_check(vk_left))
    2. {
    3. if(place_free(x-20,y) )
    4. {
    5. sprite_index = spr_pl_walk_left;
    6. image_speed = 0.5;
    7. hspeed = -4;
    8. }
    9. else
    10. {
    11. hspeed=0
    12. }
    13. }
    Alles anzeigen

    Hier wird jetzt erstmal geprüft, ob überhaupt vk_left gedrückt wird. Wenn ja, dann wird geprüft, ob eine Kollision besteht und dementsprechend gehandelt. Falls vk_left nicht gedrückt wird, wird nichts gemacht.

    Das gleiche musst du jetzt auch noch für vk_right machen. Das hast du ja bis jetzt noch in einem einzelnen Event, mit unvollständigem Code.