Fragen zur Kollisionsabfrage und motion's

  • GM 8
  • Fragen zur Kollisionsabfrage und motion's

    Hey,
    ich wollte ein kleines Jump'n'Run machen, habe mir das Tutorial bereits angeguckt, möchte dies aber ausschließlich selbst skripten, da ich mir das selbst beibringen möchte ...

    Nun habe ich direkt zu beginn ein Problem:


    GML-Quellcode

    1. if (place_free(self.x,self.y+1)){motion_add(270,0.5)};else(motion_set(270,0))


    normalerweise sollte er doch damit überprüfen ob ein pixel unter meinem Charakter frei ist und wenn nicht, hält er eben an.
    Allerdings "versinkt" mein char leicht im boden. erhöhe ich den y-wert auf self.y+4 dann bleibt er plötzlich schwebend stehen, kurz vor dem boden.
    wie errechnet er das und wieso klappt das nicht?


    gruß
    naibaf77
    True story!
  • motion_add(dir,speed) to add a motion to the current one.
    Das Problem liegt darin, dass du mit motion_add Geschwindigkeit hinzufügst.
    Sollte ein Pixel unter deiner Instanz frei sein, so geht es in Richtung 270 mit einer Geschwindigkeit von 0,5px/stp. Sollte beim 2ten Step immer noch ein Pixel unter deiner Instanz frei sein, wird in Richtung 270 die Geschwindigkeit um 0,5px/stp erhöht (add = hinzufügen). Die Instanz bewegt sich nun mit 1px/stp in jene Richtung.
    Dadurch wird das ganze immer schneller, und deine Instanz macht pro Step immer größere Schritte in Richtung 270. Du Überprüfst jedoch immer nur auf 1Pixel unter deiner Instanz.
    Wenn sagen wir also mal 4px unter deiner Instanz frei sind, deine Instanz mittlerweile ein Speed von 5px/stp in Richtung 270 drauf hat, so bewegt sie sich 5px, da in der Ausgangssituation nunmal unter ihr Platz ist, jedoch im nächsten Step ist dort eine Wand, die Instanz wird dadurch in Richtung 270 auf 0 gestellt (mit motion_SET <--) und bleibt somit in deiner Instanz stecken.

    Problemlösung:
    Erweitere den Code-Ausschnit mit motion_set darum, dass die Instanz auf ihre Vorherige Position springt, und sich an die andere Instanz (bsplw. Wand) anschmiegt.

    Spoiler anzeigen

    GML-Quellcode

    1. // Beispielsweiße so
    2. y = yprevious;
    3. move_contact_solid(270,-1);
    4. // Falls Befehle unbekannt: Bitte in der Hilfe nachgucken


    Desweiteren solltest du eine maximale Fallgeschwindigkeit einrichten, ist aber auch in den YoYoGames Tutorial erklärt.

    Mfg.,
    Mokuyobi
    木曜日 (Mokuyōbi)
  • okay, ja sowas in der art hatte ich mir schon gedacht, jetzt hab ich das aber genau verstanden :D dann werd ich mich mal an deinen kleinen skript ransetzen und versuchen zu verstehen, was der bringt ;)
    danke dir schonmal !!

    edit:

    habe das heir gebastelt:

    GML-Quellcode

    1. if !collision_point(self.x,self.y+1,all,true,true){motion_add(270,0.5)}
    2. else{motion_set(270,0);self.y=self.yprevious;move_contact_solid(270,-1)}


    aber jetzt bleibt er noch tiefer drin stecken :D

    gruß
    naibaf77
    True story!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von naibaf77 ()

  • Benutzer online 1

    1 Besucher