Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Billard programmieren (https://www.delphipraxis.net/12150-billard-programmieren.html)

Matze 21. Nov 2003 15:43


Billard programmieren
 
Hi!

Ich habe mal die allgemeine Frage, ob es möglich ist, ein Billard-Spiel zu programmieren (mit Delphi ;) ).

Ich habe es so versucht, dass ich ein Shape nehme und das abprallen lasse.

Jetzt hört das Abprallen aber nicht mehr auf :mrgreen:
Mein problem ist nun:

Kann ich mittels Pixelabfrage einen "Treffer" realisieren?
Wie mache ich die unterschiedliche Stärke?

Falls ihr meint, dass es zu schwer ist, dann sagt es bitte, nicht, dass ich Stunden progge und es nie klappt ;)

Minz 21. Nov 2003 15:57

Re: Billard programmieren
 
eventuell mit Vektoren?

In denen hättest du die Richtung und die Stärke gespeichert.

Einen Treffer könntest du berechnen in dem du alle Kugeln (gottseidank gibts ja nicht soviele :D) prüfst, ob sie auf der Geraden der gestoßenen Kugel liegen.

Matze 21. Nov 2003 15:58

Re: Billard programmieren
 
Danke, aber wie realisiere ich das, ich meine z.B. die Stärke.
Angenommen ich hab Stärke 1-100, dann muss ich das ja irgendwie berechnen.

Christian S. 21. Nov 2003 16:23

Re: Billard programmieren
 
Hallo!

Ich denke, das ganze ist nicht ganz so einfach. Wenn wir annehmen, dass die Kugeln alle gleiche Masse besitzen, reibungsfrei rollen und vollkommen elastisch stoßen (die zweite Annahme sollte man eigentlich für ein Spiel nicht nehmen), scheint es auf den erten Blick alles sehr simpel zu sein.
Du musst jedoch beachten, dass bei einem exzentrischen Stoß auch noch Rotationsenergie und Drehimpuls ins Spiel kommen, vom Abprallen einer rotierenden Kugel an der Bande oder an einer anderen Kugel mal ganz zu schweigen. Und wenn Du - was ich dringend empfehlen würde - auch noch Reibung der Kugeln auf dem Tisch mit hinein nimmst, wird es richtig lustig.

MfG
Peter

braingrenade 21. Nov 2003 16:25

Re: Billard programmieren
 
Moin Matze !
Am anfang ist die Stäarke hundert und nimmt jeden Durchlauf um z.b. 1 ab , wenn die kugel auf eine Wand prallt z.b. um 2 , wie genau die Stärke (geschwindigkeit) abnimmt müsstest du irgendwie mit
physic (Reibung , federkraft , etc) heraus finden.

Phoenix 21. Nov 2003 16:31

Re: Billard programmieren
 
Die Frage ist, wie realistisch das ganze sein soll.

Du kannst natürlich ersteinmal die allerwichtigsten physikalischen Formeln für z.B. den Reibungswiderstand etc. implementieren. Dann bist Du wohl die nächsten Wochen beschäftigt...

Auf der anderen Seite würde ich tatsächlich erst einmal an einen Billiardtisch mit einem Kumpel gehen, ihm eine Stoppuhr in die Hand drücken, die Strecke vom Ball zur Bande messen und ganz feste anstossen. Somit hast Du z.b. Deine persönliche Maximalgeschwindigkeit. Das nimmst Du als 100% Stossstärke für Dein Spiel und gehst mit der Geschwindigkeit dann so weit runter, daß die 100% tatsächlich noch erträglich sind und die Kugel nicht immer raushüpft :).

Bei der Gelegenheit misst du auch mal den Tisch aus und hast dann für Dein Spiel schonmal die Relationen, die sind nämlich tatsächlich wichtig, um ein einigermassen ordentliches Feeling zu bekommen.

Also: Die Maße des Tisches sollten in Relation zur Stossstärke (sch* neue deutsche Rechtschreibung) stimmen. Du kannst als Stoßstärke (deutlich besser ;-) ) nämlich am besten die Anfangsgeschwindigkeit der Kugel nehmen. So kannst Du also mit 1 - 100 die Geschwindigkeit des Balles festlegen wenn er stösst, und zwar in Richtung des Queue.

czapie 21. Nov 2003 16:34

Re: Billard programmieren
 
Wir haben ein Billard im LK Info mit Delphi programmiert, aber ohne Beachtung der meisten physikalisch Grundlagen.
Wenn du willst mail ich dir meine Version mal zu.
Es ist Objektorientiert Programmiert und mit Delphi 5 geschrieben.

Czapie.

braingrenade 21. Nov 2003 16:35

Re: Billard programmieren
 
Hier hab ich noch n' paar links gegoogelt :

http://www.physik-lexikon.de/viewlex...chwort=Reibung
google suche
Auserdem musst du die Geschwindigkeit (stärke) der Kugel auch noch ausrechnen , irgendwie über die Anstosskraft oder so.

himitsu 21. Nov 2003 16:38

Re: Billard programmieren
 
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 :hi:

Die Muhkuh 21. Nov 2003 16:56

Re: Billard programmieren
 
Hi Matze,



soooo ernst hab ich das mit dem proggen net gemeint :mrgreen: Ist aber toll das du es versuchtst! :thumb:

Wenn man das hier so liest... man man man ganz schön viel Arbeit. Aber du bist ja noch jung! :mrgreen:


@himitsu

sollte das nicht "for I := 0 to 9 do" heißen und net "to"?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz