Wandkollisionen mit drehbarem Objekt

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

  • Wandkollisionen mit drehbarem Objekt

    Wenn ich eine Spielfigur habe, die sich um 360° drehen kann, dann kann dieses Objekt ja in jedem nur denkbaren Winkel mit einer Wand kollidieren. Das führt zu dem Problem, dass das Objekt leicht in der Wand hängen bleibt, obwohl es eigentlich rein logisch so an ihr "entlangschrabben" könnte(wie zB ein Auto an einer Leitplanke). Wie kann ich sowas machen. Die Bounce-Funktion, ändert mir ja nur den Winkel, den ich ja unverändert lassen will.
    Ich hoffe ihr habt mein Anliegen so einigermaßen verstanden.
    Gibt es da eine Möglichkeit, dass dieses Objekt einfach leicht zur Seite versetzt wird? Hab da schon an sinus und cosinus gedacht, aber ich würde gerne wissen ob ihr euch schonmal mit dem Problem auseinandergesetzt habt oder wisst wo ich die Lösung dazu finden kann.
    Einige meiner Spiele:
  • Hi interceptor,
    so was ähnliches hat conan2 schonmal gefragt

    Kollision bei Drehung
    in Game Maker Technik für Anfänger

    ;)

    habe ich über den Suchen-Button oben rechts
    gefunden :happy:
    hetotecs Winter-Homepage - klick hier:hetotec.de


    Hier auf landet ihr auf meiner Spiele-Vorstellungs-Seite ^^
    Noch keinen Stern geschenkt bekommen? Hol dir deinen eigenen Stern
    hier yoyogames.com/games/show/30678
    Am Weihnachtsbaum Lichter anzünden? Mit 9 Musik-Titeln zur Auswahl oder eigene Musik laden
    hier yoyogames.com/games/show/20074

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

  • Kenn ich schon, ist aber nicht das Problem was ich meine. Bei conan2 ging es darum, dass sich das Sprite beim Drehen in der Wand verfangen hat. Bei mir wird aber nicht das Sprite gedreht sondern nur der direction-Wert. Stell dir einfach eine nicht-elastische Kugel vor, die im 45° Winkel auf den Boden auftrifft. Die bleibt dann ja auch nicht hängen sondern rollt weiter in die x Richtung, nur die y-Bewegung wird ausgelöscht. Ich könnte theoretisch bei jeder Kollision feststellen, wie die 2 Objekte zueinander liegen und dann eine Koordinate der Geschwindigkeit auslöschen. Aber was mach ich wenn die Wand schräg ist?
    Einige meiner Spiele:
  • Ich hab da schonmal was geproggt gehabt...es momentan nur nicht da...

    Quellcode

    1. var hcount, vcount, vsign, hsign;
    2. hspeed = speed*cos(degtorad(direction));
    3. vspeed = speed*sin(degtorad(direction));
    4. hcount = 0;
    5. vcount = 0;
    6. hsign = hspeed/abs(hspeed);
    7. vsign = vspeed/abs(vspeed);
    8. vspeed = abs(vspeed);
    9. hspeed = abs(hspeed);
    10. repeat(hspeed) {
    11. repeat(vspeed) {
    12. if(place_free(x+(hspeed-hcount)*hsign, y+(vspeed-vcount)*vsign)) {
    13. x += (hspeed-hcount)*hsign;
    14. y += (vspeed-vcount)*vsign;
    15. exit;
    16. }
    17. vcount += 1;
    18. }
    19. vcount = 0;
    20. hcount += 1;
    21. }
    22. if (round(vspeed) == 0) {
    23. repeat(hspeed) {
    24. if(place_free(x+(hspeed-hcount)*hsign, y) {
    25. x += (hspeed-hcount)*hsign;
    26. exit;
    27. }
    28. hcount += 1;
    29. }
    30. }
    31. if (round(hspeed) == 0) {
    32. repeat(vspeed) {
    33. if(place_free(x, y+(vspeed-vcount)*vsign) {
    34. y += (vspeed-vcount)*vsign;
    35. exit;
    36. }
    37. vcount += 1;
    38. }
    39. }
    Alles anzeigen

    Hab ich jetzt Gerade geschreiben, deswegen auch nicht getestet, sollte aber so funktionieren...
  • Fettes Danke Agnahim!
    Das ist genau das was ich gesucht habe. Leider sind in deinem jetzt gerade geschriebenen Code ein paar Fehler drin (ich mein nicht nur die paar nicht geschlossenen Klammern). Irgendwo musst du was verdreht haben, denn das an der Wand entlangrutschen funktioniert nur wenn ich von links oben gegen eine Wand renne, bei anderen prallts ab und bei 0° gibts sogar irgendwo ne Division durch 0.. Ich hab noch nicht gefunden wo genau der Fehler liegt, da ich mich mit dem Lesen von fremden Codes etwas schwer tu, vielleicht bist du ja schneller und findest es vor mir raus.
    Einige meiner Spiele:
  • Hi interceptor,
    vielleicht hilft das Rampe Example aus den Allgemeinen Tutorials weiter?
    :(
    hetotecs Winter-Homepage - klick hier:hetotec.de


    Hier auf landet ihr auf meiner Spiele-Vorstellungs-Seite ^^
    Noch keinen Stern geschenkt bekommen? Hol dir deinen eigenen Stern
    hier yoyogames.com/games/show/30678
    Am Weihnachtsbaum Lichter anzünden? Mit 9 Musik-Titeln zur Auswahl oder eigene Musik laden
    hier yoyogames.com/games/show/20074
  • Tut mir leid, aber das Rampentutorial ist für mein Problem eher ungeeignet, wenn jemand Agnahim's Script zum Laufen bringen könnte, das wäre genial!
    Einige meiner Spiele:
  • Danke sehr, das hat mir geholfen. Ist zwar nicht in allen Belangen ideal, aber was solls (normale Kollisionsevents scheinen nicht immer gut zu klappen, muss noch ein wenig rumprobieren bis ich da was habe, außerdem scheint die Aktion nur im End-Step-Event ordentlich zu laufen). Für mich langts :D. Trotzdem würde ich gerne wissen, ob Agnas Version besser funktioniert (wenn sie funktioniert...). Die hat bei mir nämlich auch funktioniert wenn ich sie in die Kollisionsevents geschrieben habe.
    Einige meiner Spiele:
  • Original von interceptor
    Fettes Danke Agnahim!
    Das ist genau das was ich gesucht habe. Leider sind in deinem jetzt gerade geschriebenen Code ein paar Fehler drin (ich mein nicht nur die paar nicht geschlossenen Klammern). Irgendwo musst du was verdreht haben, denn das an der Wand entlangrutschen funktioniert nur wenn ich von links oben gegen eine Wand renne, bei anderen prallts ab und bei 0° gibts sogar irgendwo ne Division durch 0.. Ich hab noch nicht gefunden wo genau der Fehler liegt, da ich mich mit dem Lesen von fremden Codes etwas schwer tu, vielleicht bist du ja schneller und findest es vor mir raus.


    Tut mir furchtbar leid...ich war in eile und konnte es , wie gesagt, nicht testen...Asche auf mein haupt
    [PHP]var hcount, vcount, vsign, hsign;
    hspeed = round(speed*cos(degtorad(direction)));
    vspeed = round(speed*sin(degtorad(direction)));
    hcount = 0;
    vcount = 0;
    if (hspeed == 0) hsign = 1;
    else hsign = hspeed/abs(hspeed);
    if (vspeed == 0) vsign = 1;
    else vsign = vspeed/abs(vspeed);
    vspeed = abs(vspeed);
    hspeed = abs(hspeed);
    repeat(hspeed) {//repeat klammer
    repeat(vspeed) {//repeat klammer2
    if(place_free(x+(hspeed-hcount)*hsign, y+(vspeed-vcount)*vsign)) {//if klammer
    x += (hspeed-hcount)*hsign;
    y += (vspeed-vcount)*vsign;
    exit;
    }//if klammer
    vcount += 1;
    }//repeat klammer2
    vcount = 0;
    hcount += 1;
    }//repeat klammer
    if (round(vspeed) == 0) {//if klammer
    repeat(hspeed) {//repeat klammmer
    if(place_free(x+(hspeed-hcount)*hsign, y)) {//if klammer2
    x += (hspeed-hcount)*hsign;
    exit;
    }//if klammer2
    hcount += 1;
    }repeat klammer
    }if klammer
    if (round(hspeed) == 0) {//if klammer
    repeat(vspeed) {//repeat klammer
    if(place_free(x, y+(vspeed-vcount)*vsign)) {//if klammer2
    y += (vspeed-vcount)*vsign;
    exit;
    }//if kalmmer2
    vcount += 1;
    }//repeat klammer
    }//if klammer[/PHP]
    Also ja es gehört ins Kollisions event, weil nach einer kollision mit einem Soliden Objekt das andere ja auf sewine ursprüngliche Position zurückversetzt wird...
    Und ich denke, dass ich alle von dir beschriebenen Fehler verbessert habe...
    Aber ich muss dich warnen...es ist wieder nich getestet^^

    P.S: Puh...wohl der längste Post meines Lebens

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

  • Leider hauts wieder nicht hin... :(
    Das Sliden funktioniert nur gegen eine horizontal verlaufende Wand wenn hspeed und vspeed positiv sind. An allen anderen Wänden pralle ich seltsam ab(ach ja und 2x hast du vergessen deine Kommentare mit // zu kennzeichnen).
    Trotzdem Danke für deine Mühe, dann werd ich wohl derweil beim anderen Script bleiben, das läuft einigermaßen...Teste am besten dein Script das nächste mal selbst, vielleicht wird dann dein Fehler klar.
    Einige meiner Spiele:
  • Den folgenden Code im Kollistions-event mit der Mauer verwenden

    {
    x = xprevious;
    y = yprevious;
    if (abs(hspeed) >= abs(vspeed) && not place_meeting(x+hspeed,y,obj_wall_basic))
    { x += hspeed; exit;}
    if (abs(vspeed) >= abs(hspeed) && not place_meeting(x,y+vspeed,obj_wall_basic))
    { y += vspeed; exit;}
    speed = 0;
    }

    Wenn du es nicht verstehst, lad dir auf gamemaker.nl unter Tutorials das 3d-tut ganz unten auf der Liste runter und führ das 2te example aus.
    Aktuelles Projekt: Katamari

    @interceptor: Tortoise ftw ^^

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

  • Original von interceptor
    Leider hauts wieder nicht hin... :(
    Das Sliden funktioniert nur gegen eine horizontal verlaufende Wand wenn hspeed und vspeed positiv sind. An allen anderen Wänden pralle ich seltsam ab(ach ja und 2x hast du vergessen deine Kommentare mit // zu kennzeichnen).
    Trotzdem Danke für deine Mühe, dann werd ich wohl derweil beim anderen Script bleiben, das läuft einigermaßen...Teste am besten dein Script das nächste mal selbst, vielleicht wird dann dein Fehler klar.


    Argh....Verdammt...ich gebs auf...