Nachdem ich in meinem Thread für Arena Fight darauf hingewiesen wurde, dass Kollisionen unter den einzelnen Kreisen das ganze realistischer gestalten würden, habe ich mich mal daran versucht. Das ist dabei herausgekommen.
Das gesamte Script basiert nur auf einfacher Vektorrechnung, also nix mit Sinus und Cosinus :P.
Viel Spaß damit .
Edit: Ich hab jetzt das Script weitgehend perfektioniert. Der Bug mit den sich verhakenden Kreisen sollte nicht mehr auftreten. Allerdings ist "Resting Contact" noch nicht implementiert, also kann es z.B. beim Stapeln von Kugeln zu Problemen kommen.
Außerdem hab ich das System der Kollisionserkennung komplett erneuert, nun wird nicht mehr überprüft ob 2 Kreise sich berühren (Abstand der Mittelpunkte < Gemeinsamer Radius), sondern der Geschwindigkeitsvektor wird überprüft und wenn er auf einen anderen Ball reffen wird (in der nächsten Frame) oder sogar durch ihn durchfliegt (Weil die Geschwindigkeit zu groß ist. Der Kreis würde sich dann einfach an dem Anderen vorbei "teleportieren".) wird er so gekürzt, dass der Kreis genau auf den anderen Kreis trifft, dann wird erst der Ausgangsvektor nach der Kollision berechnet. So ist es auch unmöglich, dass Objekte sich verfehlen weil ihre Geschwindigkeit zu groß ist. Das könnte nützlich sein, falls man einen Shooter programmieren würde...
Ich habe auch noch eine Version mit einem stationären "fixen" Kreis gemacht. Schaut es euch mal an.
Ps: Es gibt 2 neue Variablen am Anfang des Scripts. $nGroundFriction und $nBounciness. Da ich mit Vektoren arbeite, wird der Geschwindigkeitsvektor beim zusammenprall auf die Kollisionsachse umgerechnet. Also gibt es nun einen Anteil der Gescheindigkeit parallel zur Achse die die Mittelpunkte der Kreise bei der Kollision verbindet ($nGroundFriction) und einen Teil orthogonal zu dieser Achse ($nBounciness). Was die beiden bewirken könnt ihr selbst herausfinden, indem ihr einen Wert zwischen 0 und 1 angebt (0 = Jegliche Energie geht bei der Kollision verloren; 1 = Kein Energieverlust).