Hi
Wir haben sowas auch in der Schule gemacht.
Daher kann ich Dir hiermit mein Programm an die Hand geben.
Zumindest hilft es Dir bestimmt in eineigen Punkten, da ich es genauso gemacht habe wie hier vorgeschlagen. Einzig die Berechnung der Winkel zweier Bälle nach dem Zusammenstoß ist nicht schön gelöst - es werden einfach beide Winkel ausgetauscht, was in den meißten Fällen richtig aussieht (
ich wäre übrigens sehr dankbar, wenn mir dabei jemand einen Tipp geben könnte, unsere Kurs-Spitze hat sich lange damit beschäftigt, es aber letzten Endes sein lassen)
Zurück zum Programm:
Ich habe eine Klasse TBall geschrieben, die Funktionen und Prozeduren zum darstellen eines einzelnen Balls enthält. Dem übergeordnet eine Klasse TBaelle, die dann einen Array of TBall enthält und diese Bälle steuert. Die Kollisionsabfrage erfolgt also in der Klasse TBaelle und zwar so:
Delphi-Quellcode:
procedure TBaelle.MoveBalls;
var dist,rrad:real;
i,j:integer;
Ball1,Ball2:TBall;
begin
if not (High(Ball)<0) then begin
for i := 0 to High(Ball) do
if Ball[i] <> nil then Ball[i].Bewegen;
for i := 0 to High(Ball) do begin // jeder Ball wird mit jedem verglichen
Ball1:=Ball[i];
for j := i to High(Ball) do begin
Ball2:=Ball[j];
if Ball1 <> Ball2 then begin
dist := sqrt(sqr(Ball1.GetX-Ball2.GetX)+sqr(Ball1.GetY-Ball2.GetY)); // Abstand der Bälle nach Pythagoras
if (dist <= Ball1.GetRadius+Ball2.GetRadius) then
begin
rrad:=Ball1.GetAngle; // Winkel werden bei Kollision vertauscht
Ball1.SetAngle(Ball2.GetAngle);
Ball2.SetAngle(rrad);
end;
end;
end;
end;
end;
end;
(Ich habe die Proc ein wenig verändert, ich hoffe sie stimmt noch)
Außerdem wollte Dir noch den Tipp geben dass - damit gewährleistet ist dass die Bälle immer eine Gleichmäßige Geschwindigkeite haben - es mit Winkeln arbeitet und nicht mit x- und y-Geschwindigkeiten. Den x-Wert der Steigung bei einem Winkel alpha bekommst Du dann mit
cos( DegToRad(angle-90) ) * speed
und den y-Wert mit
sin( DegToRad(angle-90) ) * speed
Siehe hierzu die Funktionen NextX und NextY in der Klasse TBall.
Naja, Du musst natürlich Dein eigenes Programm schreiben, aber vielleicht hast Du ja Lust in den Source mal reinzuschauen.
Viel Erfolg und Grüße, Christoph
edit: Sorry, da haben wohl Toxman, FlorianK und dizzy gepostet während ich noch geschrieben habn