Links und rechts Kollisionen

  • GM 8

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

  • Links und rechts Kollisionen

    Ich benutze folgenden Code um meinen Spieler zu bewegen und nach einer Kollision abzufragen:


    GML-Quellcode

    1. if(gamepad_check_button(gpid,global.leftButton_p1) = true) and (place_free(x-0.5,y)) {if (place_meeting(x-0.5,y,obj_solids)) {move_contact_solid(180,12); }else {walk=1; hspeed -= myspeed; }}
    2. if(gamepad_check_button(gpid,global.rightButton_p1) = true) and (place_free(x+0.5,y)) {if (place_meeting(x+0.5,y,obj_solids)) {move_contact_solid(0,3); }else {walk=1; hspeed += myspeed; }}move_outside_solid(90,3);



    Aber irgendwie läuft da etwas schief. Der Spieler "rutscht" quasi durch Blöcke sobald er von links oder rechts darauf zu steuert.
    Was ist da denn nicht korrekt?
  • place_free fragt ab, ob die derzeitige Instanz an Position x, y eine Kollision mit einer solid Instanz hätte (place_empty würde dies mit allen Instanzen machen).
    place_meeting ist eine Verneinung von place_free, beschränkt sich aber auf die Instanzen des angegebenen Objekts.

    move_contact_solid bewegt die Instanz in kleinen Schritten vorwärts solange es möglich ist (ist meine Vermutung, da sie eigentlich nur eine Umkehrung von move_outside ist).
    move_outside_solid bewegt die Instanz in kleinen Schritten aus allen solid Kollision heraus (also je größer die Distanz, desto rechenlastiger wird es).
    hspeed gibt an, inwiefern die x-Position der Instanz zwischen Step und End Step geändert wird.


    Jetzt sollte dir schon auffallen, dass du da irgendwie wild Sachen zusammengeworfen hast und das meiste überflüssig ist.
    Wenn du mit place_xxx grünes Licht bekommen hast, dann kannst du auch direkt die Koordinaten ändern und solltest gar nicht erst den Umweg über speed-Variablen gehen.
    Wie das genau geht, solltest du mit meinen Erklärungen selbst hinkriegen.

    Achtung:
    Es kann natürlich passieren, dass sich zwei Objekte so schnell bewegen, dass sie durcheinander "durchfliegen". Bei den meisten Spielen ist das aber recht unwahrscheinlich und du kannst auf genauere Abfragen verzichten.
    Das gilt sowohl für place_xxx-Befehle als auch für die Bewegungen durch speeds - in beiden Fällen bewegt der Game Maker nicht wirklich die Instanzen sondern setzt sie direkt an ihre neuen Positionen.
  • Danke erst mal für die ausführliche Erklärung. Mir ist aber dennoch einiges unklar.
    Also ich habe es jetzt mal so angepasst:

    GML-Quellcode

    1. if(gamepad_check_button(gpid,global.leftButton_p1) = true) {walk=1; hspeed -= myspeed; }

    Hiermit läuft meine Figur nach links. Aber unglücklicher Weise "rutscht" sie auch mit geringer Geschwindigkeit durch Blöcke hindurch.
    Sie bleibt wie gewollt auf den Blöcken stehen und kann auch nicht von unten nach oben hindurch. Aber nach links und rechts..

    Füge ich aber

    GML-Quellcode

    1. place_free(x-4,y)
    hinzu, bleibt meine Spielfigur einfach stehen, obwohl keine Kollision in der Nähe ist.
    Achja, hspeed benutze ich, da somit flüssigere Bewegungen möglich sind.
  • Sorry für den Doppelpost aber da schon einige Einträge hier vorhanden sind, wird das Thema schnell überflogen.


    Ich bin das ganze noch ein mal durchgegangen und habe nun einen "sauberen" Code.
    Aber meine Spielfigur bleibt dennoch stecken. Kann sich das mal jemand ansehen? Ich hänge da total fest.

    GML-Quellcode

    1. if
    2. (gamepad_check_button(gpid,global.rightButton_p1) = true) and
    3. (gamepad_check_button(gpid,global.leftButton_p1) = false) {
    4. if place_free(x+hspeed,y)
    5. {walk=1; hspeed += myspeed; }
    6. }
    7. else if
    8. (gamepad_check_button(gpid,global.rightButton_p1) = false) and
    9. (gamepad_check_button(gpid,global.leftButton_p1) = true) {
    10. if place_free(x-hspeed,y)
    11. {walk=1; hspeed -= myspeed; }
    12. }
    Alles anzeigen

    EDIT: Im Anhang noch eine Textdatei welche alle Befehle des ersten Spielers beinhaltet. Download (Dropbox, rtf document) <

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

  • Benutzer online 1

    1 Besucher