Thema: Delphi Billard programmieren

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#9

Re: Billard programmieren

  Alt 21. Nov 2003, 16:38
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat