Du machst erst mal ein Array mit den Kugeln, wo die Daten jeder Kugel drin sind.
Und brauchst dann nur nach dem unteren Beispiel rechnen.
Das ist nur ein Beispiel, kein fertige und wirklichkeitsnacher Code.
Zum verringern des Tempos solltest du besser eine Realitätsnähere Variante verwenden (hier sind es pro Schritt -5% des Tempos)
Hab hier mit Absicht Currency verwendet, da es ein skalierter 64-Bit-Integer ist und daher das Tempo (Bewegung) und die Position auf 4 Stellen nach dem Komma genau sind.
Ausserdem ist es schneller als die anderen reellen Typen.
Habe hier mal die Tatsache, das Kugeln auch noch eine Rotationsbewgung besitzen der Einfachheithalber erst mal weggelassen. Das könnte man später, wenn es erst mal richtig läuft ja noch nachrüsten.
zur { Bewegungsstärke verringen }:
Hier musst du einfach die Reibungskräfte, den Luftwiederstand und so abrechnen.
zur { Abprallkontrolle }:
Hier wird berechnet, ob eine Kugel irgendwo anstößt (Bande oder ander Kugel).
Wenn ja, wird die neue Richtung der Kugel errechnet.
Da bei einem Aufprall ja auch noch Energie "verloren geht", muss im Falle eines Zusammenstoßes auch noch mal etwas vom Tempo (der Bewgungsenergie) abgezogen werden.
Delphi-Quellcode:
Var Kugeln: Array[0..9] of Record
PositionX, PositionY: Currency;
BewegungX, BewegungY: Currency;
End;
Procedure Timer...
Var B: Boolean;
Begin
For I := 0 to 9 to Begin
{ Abprallkontrolle }
Wenn Kugel irgendwo abprallt dann
BewegungX & BewegungY neu berechnen
End;
For I := 0 to 9 to Begin
{ Kugeln bewegen }
PositionX := PositionX + BewegungX;
PositionY := PositionY + BewegungY;
{ Bewegungsstärke verringen }
BewegungX := Auf4StellenNachDemKommaGegenNullRunden(BewegungX * 95%);
BewegungY := Auf4StellenNachDemKommaGegenNullRunden(BewegungY * 95%);
End;
{ sind Kugeln im Bewegung }
B := False;
For I := 0 to 9 to
If (BewegungX <> 0) or (BewegungY <> 0) Then B := True;
If B Then
Kugeln bewegen sich noch
{ Kugeln zeichnen }
For I := 0 to 9 to
Zeichne(Round(PositionX), Round(PositionY), I);
{Hab jetzt einfach mal 'ne Zeichenprozedure erfunden, }
{über I kannste ja übergeben, welche Kugel das ist }
{z.B. 0=Weiß... }
End;
Wenn dann mal fertig ist, hast du erst mal ein zwar noch nicht total realistisches Billard, aber dafür eine was läuft.
Jetzt bin ich aber geschaft.
http://www.mysmilie.de/smilies/muede/img/028.gif
Add:
Ach ja, wenn eine Kugel (1) eine Andere (2) anstößt, bekommt natührlich die andere Kugel (2) ein bissel Energie Übertagen. Dann muß dieser Kugel (2) auch noch diese Energie angerechnet werden:
Add2:
Zum zeichnen müssen nätürlich die Positionswerte der Kugeln gerundet werden.
So das war's erst mal