Wie sieht move_bounce in Code aus? Welche Formel steckt dahinter?

  • GM 8

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

  • Wie sieht move_bounce in Code aus? Welche Formel steckt dahinter?

    Hey,
    ich arbeite grad an einer kleinen Kollisionserkennung bei denen meine Objekte nicht solid sind obwohl sie die funktion eines solids haben.
    Jetzt kann ich aber nich mehr sowas wie move_bounce_solid benutzen, genauso wenig wie place_free.
    Aber statt place_free kann ich ja einfach place_meeting(x,y,parent meiner soliden objekte) nehmen, nun brauch ich aber auch noch eine alternative zu move_bounce_solid :D
    Allerdings nicht move_bounce_all! denn die funktioniert irgendwie nicht
    Bei mir ein komisches ergebnis raus als ichs versucht hab.
    Das Objekt hat sich danach einfach nur in die entgegengesetze richtung bewegt! Obwohl eigentlich ja einfallswinkel = ausfallswinkel oder so gelten müsste.
    Jedenfalls:

    Gibt es eine Möglichkeit die resultierende Richtung (ausfallswinkel) eines Objektes zu berechnen, wenn dieses mit winkel X auf eine (der einfachheit halber) gerade Wand prallt (in meinem fall ein anderes objekt) ?
    Im Internet hab ich irgendwie nix aufs Game maker anwendbares gefunden

    Hoffe ihr könnt mir irgendwie weiterhelfen :thumbsup:

    lg Pac
    Sorm ist Schuld

    Edit: Doch ist er

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

  • Du kannst doch einfach prüfen, ob das Objekt links bzw. rechts an ein Objekt stößt und dann einfach folgendes schreiben:

    GML-Quellcode

    1. x = -x

    Das gleiche mit y, wenn es oben oder unten kollidiert.
    Oder meinst du etwas anderes?

    mfG Stupe
    Grüße Stupe
  • Also für x hab ichs aber wenn da noch y hinzukommt funktionierts nicht. Probier mal rum.
    Das in den Kollisionsevent

    GML-Quellcode

    1. if other.x + 14 {hspeed=hspeed*(-1)}

    als die 14 muss du halt von origin bis zur Killisionsmaske eingeben.
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • oder

    GML-Quellcode

    1. if direction>=180
    2. direction=direction+180
    3. else if direction<180
    4. direction=direction*2+180

    ist nicht die beste Lösung ist aber eigentlich fast das gleiche wie bounce
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Wenn du für beide Koordinatenachsen separat die korrekten Ausfallswinkel für die jeweiligen Einfallswinkel haben willst, reicht für die x-Komponenten einfach 180-direction - für die y-Komponenten ist es die etwas kompliziertere Formel tan(arctan(direction)*-1). Wenn du dir diese Funktion mal anguckst, siehst du vielleicht schon selbst, warum? ;)

    Falls nicht: Arcustangens ist insofern schön praktisch, weil sie sich 0.5*pi und -0.5*pi - im Gradmaß 90° und 270° (Edit: eigentlich -90° - aber für direction ist das ja gleichbedeutend) - annähert. Damit berechnet sich also sehr einfach die y-Komponente deiner direction: Ein Wert unter 0 bedeutet, dass dein Objekt sich grade irgendwie nach unten bewegt, ein Wert über 0, dass es sich nach oben bewegt. Wenn du diesen Wert also negierst, kriegst du exakt den Gegenanteil raus - dann einfach nur noch den Funktionswert selbst umkehren, um wieder einen Winkel draus zu machen, und schon wechselt dein Objekt die Bewegungsrichtung.
    Aber meh, ich bin noch nicht ganz wach, evtl. hab ich das grad nicht sonderlich verständlich erklärt. Ich bin sicher, ein mathematisch versierterer boxxar oder Blackspark als ich kann dir das gescheiter erklären. ^^

    Anyway, ich hab das Ganze mal in ein Example gegossen; du findest es im Anhang.
    Dateien
    • bouncing.gm81

      (10,48 kB, 234 mal heruntergeladen, zuletzt: )
  • Angenommen, du hast Wandobjekte mit rechteckigen Kollisionsmasken, dann kannst du dieses Verhalten an der Bounding Box dieser Objekte orienteren. Ist das selbe Prinzip, nur dass man diesmal nicht die Raumgrenzen checkt, sondern während der Kollision guckt, welche Bounding-Box-Kante man grade schneidet.
    Ich hab das Example mal ein wenig abgeändert und wieder angehangen. Du wirst denk ich mal schnell sehen, was ich meine. ;)


    Edit:
    Achja, dieser Code wird fehlerhaft arbeiten, wenn die Kollision mit zwei nebeneinanderliegenden Wandobjekten gleichzeitig stattfindet. Wenn du das so übernimmst, solltest du also dafür sorgen, dass die Wandmasken groß genug sind, dass die Bälle nicht an die Kante zwischen zwei Wandmasken knallen können. Ecken sollten kein Problem sein, nur eben aneinandergereihte Wände in einer Linie.
    Dateien