scr_pushangles(), Script für dynamische Anpassung des image_angles von allen 4 Seiten

    • Skript
    • scr_pushangles(), Script für dynamische Anpassung des image_angles von allen 4 Seiten

      Das hier ist schon was ziemlich spezifisches, aber falls jemand mal sowas brauchen sollte muss er nicht die selbe Hirnakrobatik überstehen wie ich.

      Die Problemstellung:
      Wir haben ein dynamisches Objekt (Tisch/Schrank etc), wenn der Spieler gegen eine Seite schiebt soll sich der image_angle an die Schieberichting anpassen. Das Problem hierbei ist, wenn wir zB. in Richtung 45° schieben, der image_angle des Objektes aber 180° ist, dann würde Code wie "image_angle -= angle_difference(image_angle,push_ang)*0.1;" darin resultieren das sich das Objekt einmal komplett um 135° dreht.

      Was wir also brauchen ist eine Möglichkeit gegen eine Seite zu schieben, und der Winkel wird so angepasst das diese Seite in Richtung des Schiebewinkels zeigt ohne das sich das Objekt einmal im Kreis dreht. Ziemlich bescheuert zu erklären, darum hier einmal eine kleine Skizze:


      Falls nun überhaupt noch jemand weiß wovon ich spreche, geht es jetzt weiter ans Eingemachte:

      GML-Quellcode: scr_pushangles

      1. ///scr_pushangles(push direction)
      2. var ang = image_angle;
      3. var dir = argument0;
      4. var ad1 = angle_difference(ang-90,dir);
      5. var ad2 = angle_difference(ang+90,dir);
      6. var ad3 = angle_difference(ang,dir);
      7. var ad4 = angle_difference(ang+180,dir);
      8. if (abs(ad1) < abs(ad2)) {
      9. if (abs(ad3) < abs(ad4)) {
      10. if (abs(ad1) < abs(ad3)) {
      11. var aa = ad1;
      12. }else{
      13. var aa = ad3;
      14. }
      15. }else{
      16. if (abs(ad1) < abs(ad4)) {
      17. var aa = ad1;
      18. }else{
      19. var aa = ad4;
      20. }
      21. }
      22. }else{
      23. if (abs(ad3) < abs(ad4)) {
      24. if (abs(ad2) < abs(ad3)) {
      25. var aa = ad2;
      26. }else{
      27. var aa = ad3;
      28. }
      29. }else{
      30. if (abs(ad2) < abs(ad4)) {
      31. var aa = ad2;
      32. }else{
      33. var aa = ad4;
      34. }
      35. }
      36. }
      37. //passe den Winkel nur an, wenn sich das Objekt bewegt
      38. var s = (abs(x-xprevious)+abs(y-yprevious));
      39. image_angle -= aa*0.05*min(1,s)/1;
      Alles anzeigen

      So wirds verwendet:

      GML-Quellcode

      1. //in eurem collision/push script
      2. with (obj_dynamic) {
      3. scr_pushangles(point_direction(other.x,other.y,x,y));
      4. }
      5. //oder:
      6. with (obj_dynamic) {
      7. scr_pushangles(other.image_angle);
      8. }

      Falls was unklar ist bitte nachfragen! Over and Out.
      132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
    • Das rumgetausche am Angang verhindert, dass man bei 180 grad zu einander sich die kiste nicht erst um 180 grad dreht obwohl die Kante schon richtig wäre?

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
    • Öhm ja, ich kanns leider nicht besser erklären als die tolle Grafik, aber ja, die nächstgelegene Seite richtet sich dann in Richtung des angegebenen angles aus.

      EDIT: Kannst auch das neue HZ Update mal angucken was ich eben hochgeladen hab, da hab ich das ganze nämlich implementiert.
      132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
    • Benutzer online 1

      1 Besucher