Bewegung / Kurs berechnen anhand Anziehung mehrer Objekte

  • GM 7

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

  • Bewegung / Kurs berechnen anhand Anziehung mehrer Objekte

    Moin,

    hier erstmal die Spielidee

    Das Gelbe ist beweglich. Es bewegt sich mit einer konstanten Bewegung. Die Richtung ist variabel. Die schwarzen Kreise haben eine Anziehungskraft welche die Richtung bestimmen. Das Blaue ist ein Bereich der umfahren werden muss. Der Spieler kann flexibel große schwarze Objekte erstellen und an freien Stellen positionieren. Die Herausforderung ist es diese so zu platzieren, sodass das Gelbe ans Ziel heil ans Ziel gelangt.

    Nun zum technischen Problem
    Die Berechnung des Kurses und danach dessen Implementation.
    Größe der Schwarzen und der Abstand zum Gelben sind die Faktoren zur Ermittlung der Richtung. Je größer das Schwarze desto stärker die Anziehung. Je geringer der Abstand desto stärker die Anziehung.

    Im Stepevent wird jedesmal die Richtung neu berechnet. In einer Schleife werden alle schwarzen Objekte berücksichtigt. Der mit dem stärksten Einfluss bildet den Richtkurs. Jedes andere manipuliert diesen um einen gewissen Prozentsatz.

    Wie kann ich zur Laufzeit auf alle schwarzen Objekte zugreifen?
    Wie ermittle ich eine "direction"? Bsp.: Wenn nur ein Schwarzes da ist, ist die Richtung klar. Nur wie komme ich an die Grad Zahl?
    Hat jemand eine einfachere / bessere Lösung?
    Bonus: Kann man zur Laufzeit per "mit der Maus ziehen" soein schwarzes Objekt erstellen?
  • Also, so etwas hab ich selbst schon mal gemacht. Nur kann ich es zur Zeit nicht finden...egal ich erklärs dir einfach:

    So, physikalisch gesehen ist die Gravitationkraft gleich der Propation von Maße zu Entfernung zum quadrat. Da wir keine Simulation machen wollen, reicht das von der Genauigkeit her auch völlig. Am besten du arbeitest nur mit motion_add, diese Funktion fügt dem Objekt durch Vektoraddition einen Geschwindigkeitsvektor der über Betrag und Winkel bestimmt wird.

    Dh.:

    Im Step Event von deinem Objekt, das die Anziehungskraft übertragen soll:

    GML-Quellcode

    1. var ID;
    2. ID=id;
    3. with(obj_bewegbar) //Jedes Planet Objekt oder wie auch immer greift auf dein bewegbares zu
    4. {
    5. motion_add(ID.masse/sqr(sqrt(sqr(ID.x-x)+sqr(ID.y-y)))*faktor,point_direction(x,y,ID.x,ID.y));
    6. }


    Du musst natürlich noch im Planeten Objekt, oder wie auch immer das heißt was die Gravitationskraft erzeugt die Variable Masse deklarieren. Mit dem faktor musst du dich spielen, wie hoch ich den hatte weiß ich leider nicht mehr, ohne ihn würde sich kaum etwas bewegen. Mein Tipp:
    Wenn du einfach nur wo zusehen willst, dann mach jedes der Objekte, bzw. Instanzen, da du nur ein Objekt brauchst. Du kannst dann zwar aufgrund der potentiellen Anstieg der Rechenauslastung nur so 30 nehmen...aber das ganze wirkt recht cool...

    Edit: Oha, ich wusste gar nicht, dass ich sowas schon mal geklärt habe, zumindest mitgeholfen habe...aber ich hab immer noch die selbe lösung
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Erstmal danke für die Antworten.
    Die Fragen

    Wie kann ich zur Laufzeit auf alle schwarzen Objekte zugreifen?

    Indem die zur Laufzeit erstellten Objekte die Berechnung machen. Hier die Schwarzen (Planeten). Erst wollte ich das im gelben Objekt machen.

    Wie ermittle ich eine "direction"? Bsp.: Wenn nur ein Schwarzes da ist, ist die Richtung klar. Nur wie komme ich an die Grad Zahl?

    ist schon mal geklärt mit
    point_direction(x,y,ID.x,ID.y)

    Diese Magnet Methode ist auch ne lustige Lösung. Ich habs ein bisschen einfacher gemacht

    GML-Quellcode

    1. motion_add(point_direction(x,y,ID.x,ID.y),ID.masse/distance_to_object(ID))

    Läuft aber bisschen unsanft.

    Eigentlich wollte ich eine konstante Geschwindigkeit und nur die Flugrichtung wird berechnet. Dadurch sollte die Sache mehr kontrollierbar sein und weniger hektisch. Das ähnelt mehr einer Strömung.
  • Du solltest die Entfernung zum Quadrat setzen, sonst kommt genau das raus, was du gesagt hast...ist klar und kann auch nicht anders sein.
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]