Ich hab mir deinen Code jetzt nicht näher angeschaut, aber bei solchen Kollusionen gibt es i.d.R. folgende Punkte zu beachten.
1.) Der Timer läuft auf, weil er sehr schnell eingestellt ist. Das kann man leicht beheben, indem man am Anfang der OnTimerRoutine den Timer disabled und am Schluß der Routine wieder auf enabled setzt.
2.) Die Bälle, Kugeln ect. laufen ineinander. Das ist schon etwas schwieriger. Hier kann man mit einer function IsFreePlace(X, Y) prüfen, bevor man die Kugel an eine bestimmte Stelle setzt.
3.) Die Kollusion wird nicht erkannt, weil der Timer sehr schnell eingestellt ist und auch hier laufen die Kugeln manchmal ineinander. Da kann man zum Beispiel einen Zug im Voraus denken und mit diesen Koordinaten auf Kollusion prüfen (in meinem Code die NextBalls).
4.) Wenn dir der elastische Stoß mit Berücksichtigung der Massen zu kompliziert ist bzw. wenn alle Kugeln die gleiche Masse haben, kannst du die Geschwindigkeiten der beiden Kugeln einfach austauschen.
5.) Bei Kollusion mit einer Wand wird die entsprechende Geschwindigkeit umgedreht.
Gruß
Thomas
PS.: Etwas einfacher zu handhaben als InterSectRect ist:
http://www.delphi-treff.de/tipps/gra...e-kollidieren/