dirgrav - Treffen auch mit Gravitation

    • Skript

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

    • dirgrav - Treffen auch mit Gravitation

      Hiho liebe Community ;)

      Euch stört es auch, wenn eure Gegner danebenschießen, nur weil die Kugeln durch die Gravitationskräfte nach unten gezogen werden? Und gerade fliegende Schüsse sehen einfach Sch... nicht gut aus? Dann hab ich hier DIE Lösung, sowohl für Pro/Registriert als auch Lite/Unregistriert (Also auch GM6 und GM7)! 8o

      dirgrav ist ein einfacher Script, bei der man nur Start, Ziel, Geschwindigkeit und die Gravitation angeben muss, und schon liefert es euch die Richtung zurück, bei der es das Ziel treffen wird.
      Leider ist das ganze ein wenig (=kaum, aber eventuell merkbar und vllt _einer der Gründe_, warum euer Spiel eventuell langsamer läuft als gewollt) Rechenaufwendig, also mit Vorsicht zu genießen! (= nicht 20 mal pro Step, bitte ;) )

      Ein paar Daten:
      scr_dirgrav(x1,y1,x2,y2,speed,gravity,[stepsize],[accuracy])
      x1,y1 - Start und x2,y2 - Ziel.
      speed,gravity - Gravitation und Geschwindigkeit des Geschosses.
      [stepsize] (optional) - Die Größe der Schritte, die er prüft, falls das Geschoss nicht trifft; für den nächsten Durchgang (Standart: 10).
      [accuracy] (optional) - Wie viel Pixel "Freiraum" das Geschoss hat - große Zahl = ungenau (Standart: 10).
      Wichtig! Wenn das Geschoss nicht treffen kann, wird -1 zurückgegeben, ansonsten die Richtung, also eine Zahl zwischen 0 und 360.

      Download:
      gm6-Datei mit Beispiel: dirgrav.zip
      gml-Datei (nur Script): scr_dirgrav.zip

      Und hier als Text zum kopieren:
      Spoiler anzeigen

      GML-Quellcode

      1. // scr_dirgrav(x1,y1,x2,y2,speed,gravity,[stepsize],[accuracy])
      2. // returns direction or -1 if not possible
      3. var x1,y1,x2,y2,spd,grav,step,acc;
      4. var len,dir,dir2,xx,yy,vspd,hspd,lastlen;
      5. x1 = argument0;
      6. y1 = argument1;
      7. x2 = argument2;
      8. y2 = argument3;
      9. spd = argument4;
      10. grav = argument5;
      11. if (argument6 = 0) {step = 10;} else {step = argument6;}
      12. if (argument7 = 0) {acc = 10;} else {acc = argument7;}
      13. dir = point_direction(x1,y1,x2,y2);
      14. len = point_distance(x1,y1,x2,y2);
      15. dir2 = dir;
      16. repeat (30) {
      17. hspd = lengthdir_x(spd,dir2);
      18. vspd = lengthdir_y(spd,dir2);
      19. xx = x1; yy = y1;
      20. while (1) {
      21. lastlen = point_distance(xx,yy,x2,y2);
      22. vspd += grav;
      23. xx += hspd;
      24. yy += vspd;
      25. if (point_distance(xx,yy,x2,y2)<=acc) {return dir2;}
      26. if (point_distance(xx,yy,x2,y2) > lastlen) {
      27. if (dir < 90) || (dir > 270) {
      28. if (yy>y2) {
      29. step *= 1.5;
      30. if (dir < 90) {dir2 = min(89.9,dir2+step);}
      31. else {dir2 += step;}
      32. } else {step *= 0.5; dir2 -= step;}
      33. } else {
      34. if (yy>y2) {step *= 1.5; dir2 = max(90,dir2-step);}
      35. else {step *= 0.5; dir2 += step;}
      36. }
      37. break;
      38. }
      39. }
      40. }
      41. return -1;
      Alles anzeigen

      Gruß, euer kopierjunge :D

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

    • Als erstes mal find ich es schön, dass du mal ein script für sowas gemacht hast, denn es gibt sicher viele Leute, die sowas für ihr Spiel gebrauchen können.
      Dein Ansatz, das in einem Näherungsverfahren zu lösen ist wahrscheinlich am intuitivsten, aber wie du selber schon gesagt hast, nicht sehr effizient. Es ist aber möglich den Winkel explizit zu berechnen, mit mehr oder weniger einfachen Berechnungen. Damit ersparst du dir aufwendige Schleifen und das Ergebnis ist auch genauer. Zu diesem Problem gab es auch schon Themen, wie z.B. das hier: Ballistische Bahn. Eventuell kannst du ja mein example gebrauchen und dein Script so verbessern. Ich will jetzt aber keinesfalls deine Arbeit schlecht machen, ich bin nur bemüht eine optimale Lösung für das Problem zu finden.
    • Ich hab mich ja auch erst drangesetzt und versucht, das Ding per Parabell-Berechnen usw. zu lösen und mir ist aufgefallen, dass ich die praktische Erfahrung dazu einfach nicht habe... ;( Dann hab ich mir etwas mehr Zeit als gedacht genommen und ich hab nun eine andere Lösung gefunden - 100% made by copyboy also :D
      Dein Example - garnicht gesehen (obwohl ich in dem Thema ja aktiv war :pinch: ).. Naja ich schau mir mal deins an und dann, wer weis, wird das vielleicht noch was ^^