Ich versuche mich gerade daran, ein Skript zu schreiben, das es es einem Objekt (kreisförmig) erlaubt Kollisionen richtig zu erkennen und entsprechend darauf zu reagieren.
Z.B. soll es über kleine, solide Objekte hinwegrollen, auf schrägen Flächen nach oben rollen und den Schwung weiter mitzunehmen usw... Kurz gesagt soll es sich im Idealfall so wie eine Kugel in einem Hindernisslauf verhalten.
Bisher hab ich einige Stunden herumexperimentiert und jetzt ist das herausgekommen:
Alles anzeigen
Ich will euch nicht antun euch durch dieses unkommentierte Skript hindurchzuquälen, sondern zeige es nur her damit ihr wenigstens an dem Schleifenteil seht wie verrückte Dinge meines Wissens nach für so eine Aktion notwendig sind.
Und da es leider trotz allen Anstrengungen noch immer nicht so funktioniert wie ich es mir vorstelle, hab ich gehofft dass es irgendwen gibt der schon mal was ähnliches probiert hat oder sonst irgendwo eine kleine Physikengine für solche Zwecke gefunden hat.
Für jede Hilfe und Anregung wäre ich sehr dankbar!
Im Anhang findet ihr die Sourcedatei falls wer ausprobieren will wie gut es bisher funktioniert.
Z.B. soll es über kleine, solide Objekte hinwegrollen, auf schrägen Flächen nach oben rollen und den Schwung weiter mitzunehmen usw... Kurz gesagt soll es sich im Idealfall so wie eine Kugel in einem Hindernisslauf verhalten.
Bisher hab ich einige Stunden herumexperimentiert und jetzt ist das herausgekommen:
GML-Quellcode
- //Collision event
- if (!place_free(x,y+vspeed)){
- move_contact_solid(direction,speed);
- vspeed=0;
- }
- if(!place_free(x+hspeed,y)){
- old_speed=speed;
- ydiff = -1;
- xdiff = -1;
- for (j=abs(hspeed);j>=1;j-=1){
- for (i=0;i<=max(3,ceil(j*1.5));i+=1){
- if (place_free(x+j*sign(hspeed),y-i)){
- ydiff=-i;
- xdiff=j*sign(hspeed);
- break;
- }
- }
- if (ydiff != -1)
- break;
- }
- if (ydiff != -1){
- vspeed=ydiff;
- hspeed=xdiff;
- new_speed=sqrt(vspeed*vspeed+hspeed*hspeed);
- quot=old_speed/new_speed;
- vspeed*=quot;
- hspeed*=quot;
- x+=hspeed;
- y+=vspeed;
- } else {
- move_contact_solid(direction,speed);
- hspeed=0;
- }
- }
Ich will euch nicht antun euch durch dieses unkommentierte Skript hindurchzuquälen, sondern zeige es nur her damit ihr wenigstens an dem Schleifenteil seht wie verrückte Dinge meines Wissens nach für so eine Aktion notwendig sind.
Und da es leider trotz allen Anstrengungen noch immer nicht so funktioniert wie ich es mir vorstelle, hab ich gehofft dass es irgendwen gibt der schon mal was ähnliches probiert hat oder sonst irgendwo eine kleine Physikengine für solche Zwecke gefunden hat.
Für jede Hilfe und Anregung wäre ich sehr dankbar!
Im Anhang findet ihr die Sourcedatei falls wer ausprobieren will wie gut es bisher funktioniert.
Aktuelles Projekt: Katamari
@interceptor: Tortoise ftw
@interceptor: Tortoise ftw
