# Anziehung



## Runtime (30. Jan 2010)

Hallo zusammen,

ich will ein Spiel wie dieses programmieren und will dazu die Anziehungskraft berechnen. ???:L Kann mir jemand von euch eine Beispielklasse geben?


----------



## Marco13 (31. Jan 2010)

Das Bild und die Definition sind ein bißchen... seltsam... Geschwindigkeit ist eigentlich "Weg pro Zeit", in diesem Fall also "Pixel pro Millisekunde" ... Ob "Pixel" da eine geeignete Maßeinheit sind, ist aber auch fraglich.

Ansonsten äußert sich "Anziehung" einfach in einer Beschleunigung: Also "("Pixel pro Millisekunde") pro Millisekunde". Wie das Codetechnisch aussieht, hängt von dem ab, was du bisher gemacht hast. 

BTW: Das in Java nachzuprogrammieren ist alles andere als trivial....


----------



## Steev (1. Feb 2010)

Ok, das Gerüst hat man ja schnell gebaut. Das Problem liegt eher in der Physik.

1. Man muss Kollisionen zwischen Polygonen und Polygonzügen erkennen können
2. Man muss jedem Punkt, bzw. Abschnitt eines Polygonzuges die entsprechenden Physikwerte mitgeben
3. Man braucht eine einfache Zeichenfunktion
4. Man braucht gute Kenntnisse von Physik

Die Grundfunktionalität hat man recht schnell zusammengebaut. Und jetzt kommt das, was etwas komplizierter wird: Die Fahr- und Fahrzeugphysik. Ich würde das als Prototyp erstmal so machen:

1. Polygonklasse erstellen
2. Funktionen für die ermittlung aller Schnittpunkte sowie der Mittelsenkrechten von zwei Polygonen erstellen

Dann würde ich die Strecke als Polygon definieren und das Fahrzeug (erstmal) auch. Das das Fahrzeug aus mehreren Polygonen besteht, die über Joins aneinander hängen und physikalisch korrekt berechnet werden müssen, ist mir schon klar. Aber für den Anfang haben wir erstmal ein Polygon als Fahrzeug und eins als Strecke.

3. Lasse das Fahrzeug so lange nach unten fallen, bis eine Kollision zwischen dem Fahrzeugpolygon und der Strecke auftritt. Dafür wird dem Fahrzeug ein Gewicht gegeben und dann wird das Fahrzeug mithilfe der Schwerkraftformel auf der Y-Achse verschoben.

4. Wenn das der Fall ist, so ermittle die Anzahl der Schnittpunkte mit dem "Strecken"-Polygonzug.

*Grobkonzept:*
5. Wenn es nur einen Schnittpunkt zwischen der Strecke und dem Fahrzeug gibt, so ermittel den Mittelpunkt des Fahrzeuges (Und deshalb wird das Fahrzeug später in mehrere Objekte aufgeteilt, weil dieses Verfahren jetzt jedes Teil des Fahrzeug gleich gewichtet) und prüfe ob der Mittelpunkt vor oder hinter dem Schnittpunkt liegt.
Liegt der Mittelpunkt hinter dem Schnittpunkt, so rotiere das Fahrzeug "negativ" um den Schnittpunkt, bis mehr als ein Schnittpunkt auftritt. Oder eben anders herum wenn der andere Fall eintritt.
Wenn mehr als ein Schnittpunkt mit dem Polygonzug auftritt, dann ermittle die beiden Schnittpunkte, die am nächsten an dem Mittelpunkt des Objektes liegen. Liegt auf der einen Seite des Mittelpunkt gar kein Schnittpunkt und auf der anderen Seite mehrere, so rotiere um den nächsten Schnittpunkt zum Mittelpunkt.

6. Ermittel die Mittelsenkrechten aller Geraden, mit denen ein Schnittpunkt vorliegt (Winkel). Dann berechne das Mittel dieses Wertes und verschiebe das Fahrzeug entsprechend diesem Wertes auf der X-Achse, bis dieser Wert die "Richtung" ändert. Also eigendlich eine relative Verschiebung.

7. Das Objekt (Fahrzeug) hat eine Eigengeschwindigkeit die entsprechend der Masse berechnet und abgebremst wird. Das bedeutet also, dass das Fahrzeug, wenn es nach unten fällt, und gleichzeitig noch eine Eigengeschwindigkeit auf der X-Achse hat, dass das Fahrzeug dann im Bogen fällt. Tritt eine Kollision auf, so wird die Eigengeschwindigkeit entsprechend gemindert (oder sogar gemehrt). Ich gehe hier allerdings davon aus, dass es nie eine höhere Eigengeschwindigkeit geben kann, als im freien Fall.

Abgeben von Energie:
Wenn ein Objekt auf ein anderes Objekt trifft, so wird Energie abgegeben. Da der Linienzug nicht verschoben wird, sondern einfach nur in der Luft rumhängt können wird den also vernachlässigen. Für unser Objekt bedeutet das aber: Bei einer Kollision zwischen dem Objekt und dem Linienzug muss der Winkel der Mittelsenkrechten mit dem Winkel der Eigengeschwindigkeit verrechnet werden (Geschwindigkeitsvektor -> Pytagoras, Winkelsätze). Und der Winkel der Eigengeschwindigkeit muss entsprechend Korrigiert werden. Im Klartext bedeutet das: Wenn du vor eine Wand fährst, dann trifft dein Geschwindigkeitsvektor auf einen genau entgegengesetzten Winkel. Wenn die beiden Winkel verrechnet werden, dann wird ein Teil der Geschwindigkeit in eine andere Richtung umgeleitet. Das hängt auch von der Steigung der Geraden ab.

Das erstmal als ganz, ganz grobes Grobkonzept.

Falls dir das alles zu kompliziert ist, dann verwende doch einfach eine Java-Physik-Engine.

Phys2D - The 2D Game Physics Engine in Java

Gruß
Steev


----------



## Runtime (1. Feb 2010)

Es ist mir zu Kompliziert 
Danke.


----------

