»» gruss ActiviT,
Hi
Was mir aber noch mehr Kopfzerbrechen bereitet, ist die Kollisionsberechnung. Wie geht sowas?
Ich habe mal gegoogelt, ...
ich auch: »javascript 2D engine collision« ...
Verflucht sei Google...
... und bin mit dem ersten treffer auf »Javascript 2D Game Engine« gelandet, was fuer mich
nach kurzer lektuere hinsichtlich Deiner anforderungen sehr vielversprechend aussieht.
Allerdings. Der Quelltext ist zwar etwas... naja... unübersichtlich ist untertrieben. Aber zumindest kann man ihm den Code für Kollisionen entnehmen.
die physik-engine gibt es mittlerweile in einer canvas-faehigen variante.
ein aelteres beispiel *leided* natuerlich noch unter divitis.
da die beispiele nahelegen, dass grundlegende reale-welt-probleme, wie beschleunigung
und kollision zufriedenstellend geloest wurden, solltest Du dich als anregung durch den
quellcode der 2D-engines kaempfen.
vielleicht schreibst Du diesen dann ja um, denn sprachkonzeptionell sind die engines
alles andere als zufriedenstellend geloest.
Das werde ich tun. Allerdings habe ich da doch noch eine Frage.
Bei Luke (dein Link) läuft die Engine so, dass alle X Sekunden ein "Durchlauf" geschieht. D.h. alle X Sekunden bewegen sich die Körper. Es kommt aber zu Probleme, wenn man die Framesrate herunterstellt (nur ein Durchlauf alle 2 Sekunden z.B.). Wenn man dann nämlich zwei Körper aufeinander zufliegen lässt (mit sehr hoher Geschwindigkeit), fliegen Sie durcheinander durch. Denn die Engine berechnet Kollisionen, indem sie berechnet, ob es nach einem Durchlauf Kollisionen gibt, was sie tut, indem sie guckt, ob zwei Körper sich überlagern. Aber man betrachte folgendes:
OOO OOO
OOO -> <- OOO
OOO OOO
Das hier sind zwei Körper. Sie fliegen aufeinander zu...
OOO OOO
OOO -> <- OOO
OOO OOO
OOO OOO
OOO -> <- OOO
OOO OOO
OOO OOO
OOO -> <- OOO
OOO OOO
OOO OOO
OOO OOO
OOO OOO
OOO OOO
<- OOO OOO ->
OOO OOO
Weil jedes Objekt insgesamt 5 Einheiten zurücklegt, jedes Element aber nur 3 Einheiten breit ist, crashen sie gar nicht, weil sie sich zu keinem von der Engine erfassen Zeitpunkt überlappen. Wie kann man soetwas verhindern?