Weltraum gravitations Physik

  • GM 8

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

  • Weltraum gravitations Physik

    Hi

    ich hmache grade ein Weltraum spiel, bei dem man die erde vor asterioiden verteidien muss.

    Jetzt will ich das ganze noch etwas realistischer gestalten, und möchte, dass sich die einzelnen Aterioiden gegenseitig "anziehen".

    Das könnte man ja mit gravitation machen, die immer auf das näheste objekt gerichtet ist.

    Doch wie geht es, das ich zum Beispiel sowas hinbekomm:

    gravity_direction=point_direction(x,y,nähestes_objekt.x,nöhestes_objekt.y)

    also nicht nur ein objekt soll überprüft werden sondern gleich alle.
  • Leider ist das GM-interne Gravitationssystem dafür nicht geeignet. Stattdessen solltest du einfach in jedem Step für jede durch Gravitation beeinflusste Instanz folgendes tun: Du gehst nacheinander alle anderen Massenbehafteten Instanzen, d.h. alle Instanzen mit denen deine Instanz Wechselwirken soll, ab, und fügst jeweils zur hspeed und zur vspeed eine entsprechende Komponente hinzu. Die zu addierende Konstante ist dabei der horizontale bzw. der vertikale Abstand (soetwas wie x - other.x) dividiert durch den Gesamtabstand (also soetwas wie point_distance es liefert) hoch drei und multiplizierst das ganze mit einer Konstante, die die Stärke der Gravitation bestimmt, sowie den Massen von beiden Instanzen, die Wechselwirken. Voila! Das ganze geht physikalisch von der Newtonschen Näherung der Gravitation aus, ist also nicht relativistisch korrekt, aber sollte für einfache Spiele reichen.
  • Wieso sollte es nicht dafür geeignet sein? Eine einfache Anziehung kann man damit allemal herstellen.
    Du musst mit der Funktion instance_nearest die nächste Instanz herausfinden, dazu muss aber die eigene Instanz deaktiviert werden, da die ja auch dazuzählt. Also etwas in der Form:

    GML-Quellcode

    1. instance_deactivate_object(id);
    2. nearest = instance_nearest(x, y, obj);
    3. instance_activate_all();
    4. gravity_direction = point_direction(x, y, nearest.x, nearest.y);

    © 2008 by Teamgrill Productions
  • Ja, aber sobald du drei oder mehr Objekte hast bekommst du das Problem, dass es wahnsinnig schwer wird, die Richtung der Kraft zu berechnen. Das geht in Komponenten besser. Leider kann man jedoch die Gravitation im Gegensatz zur Geschwindigkeit nicht Komponentenweise verändern. Ausserdem ist die eingebaute Gravitation konstant, während die reale Gravitation von der Distanz der Instanzen abhängt. Insgesamt ist die interne Gravitation sehr beschränkt und für den allgemeinen Fall nicht nützlich. Kleiner nachschlag zu Oben: Die Stärke der Gravitation hängt natürlich nicht von beiden Massen ab, sondern nur jeweils von der Masse der anderen Instanz. Mein Fehler, sorry. Anstelle des Vorgehens oben könntest du übrigens auch die sehr nützliche Funktion motion_add(dir,speed) nutzen. Dir ist dann dein Ergebnis von point_direction, speed wäre dann in meinem Beispiel irgendeine Konstante multipliziert mit der Masse der anderen Instanz dividiert durch die Distanz hoch zwei (diesmal nurnoch hoch zwei, weil du den Vektor nichtmehr normieren musst).