Einzelnen Beitrag anzeigen

Takeshi

Registriert seit: 17. Aug 2003
Ort: Mülheim Ruhr
26 Beiträge
 
#10

Re: viele fliegende sich abstoßende Bälle??

  Alt 3. Nov 2004, 19:34
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
Angehängte Dateien
Dateityp: zip ball_104.zip (4,0 KB, 17x aufgerufen)
Christoph Friedrich
  Mit Zitat antworten Zitat