AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Billard programmieren
Thema durchsuchen
Ansicht
Themen-Optionen

Billard programmieren

Ein Thema von Matze · begonnen am 21. Nov 2003 · letzter Beitrag vom 22. Nov 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

Billard programmieren

  Alt 21. Nov 2003, 16:43
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
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
  Mit Zitat antworten Zitat
Minz

Registriert seit: 19. Dez 2002
476 Beiträge
 
#2

Re: Billard programmieren

  Alt 21. Nov 2003, 16:57
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 ) prüfst, ob sie auf der Geraden der gestoßenen Kugel liegen.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Billard programmieren

  Alt 21. Nov 2003, 16:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#4

Re: Billard programmieren

  Alt 21. Nov 2003, 17:23
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
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Benutzerbild von braingrenade
braingrenade

Registriert seit: 30. Okt 2002
Ort: Neufra
274 Beiträge
 
Delphi 6 Personal
 
#5

Re: Billard programmieren

  Alt 21. Nov 2003, 17:25
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.
Let the sun beat down upon my face
Stars fill my dream
I am a traveller of both time and space
To be where I have been ________________ Such A Surge
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#6

Re: Billard programmieren

  Alt 21. Nov 2003, 17:31
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
czapie

Registriert seit: 17. Nov 2002
Ort: Berlin
384 Beiträge
 
Delphi 5 Standard
 
#7

Re: Billard programmieren

  Alt 21. Nov 2003, 17:34
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.
Was man zu verstehen gelernt hat, fürchtet man nicht mehr.
(Marie Curie)
http://www.cafes-in-berlin.com
  Mit Zitat antworten Zitat
Benutzerbild von braingrenade
braingrenade

Registriert seit: 30. Okt 2002
Ort: Neufra
274 Beiträge
 
Delphi 6 Personal
 
#8

Re: Billard programmieren

  Alt 21. Nov 2003, 17:35
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.
Let the sun beat down upon my face
Stars fill my dream
I am a traveller of both time and space
To be where I have been ________________ Such A Surge
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Billard programmieren

  Alt 21. Nov 2003, 17: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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Billard programmieren

  Alt 21. Nov 2003, 17:56
Hi Matze,



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

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


@himitsu

sollte das nicht "for I := 0 to 9 do" heißen und net "to"?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:04 Uhr.
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