AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi viele fliegende sich abstoßende Bälle??
Thema durchsuchen
Ansicht
Themen-Optionen

viele fliegende sich abstoßende Bälle??

Ein Thema von Carolin · begonnen am 3. Nov 2004 · letzter Beitrag vom 11. Nov 2006
Antwort Antwort
Takeshi

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

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

  Alt 3. Nov 2004, 18: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz