Java / GLOOP: Kollision bei dem Billardtisch?

1 Antwort

(...) damit der Ball stehen bleibt, wenn er den Rand vom Tisch berührt (...)

Der Ball sollte bereits eine Geschwindigkeit haben, mit der er sich bewegt. Heißt, bei jedem draw call wird seine neue Position mit Hilfe einer Geschwindigkeit (1px per call o.ä.) berechnet. Wenn eine Kollision mit dem Tischrand erfolgt, müsste die Geschwindigkeit nur auf 0 gesetzt werden.

Das ergibt aber keinen so schönen Effekt und ist ja gerade beim Billard spaßraubend. Du solltest bei Kollision eher die Geschwindigkeit negieren und dann langsam (also je draw call) gegen 0 iterieren.

Das wäre soweit noch ziemlich linear und einfach gehalten. Für ein schöneres Verhalten wäre ein kleiner Exkurs in Physik (Beschleunigung, Geschwindigkeit, Bremsweg und Anhalteweg) bestimmt nicht schlecht.

Als ersten Schritt aber solltest du dir eine neue Klasse Kugel/Ball erstellen, die einen Ball beschreibt (Ball-Objekt, Geschwindigkeit, Ball zeichnen/bewegen).

(oder die Bälle weiter rollen, wenn einer den anderen trifft).

Hier gilt das gleiche Prinzip: Jeder Ball hat eine eigene Geschwindigkeit. Bei Kollision müsste diese erhöht werden. Zuerst könnte ein Fade-In vorgenommen werden - statt sofort auf volle Geschwindigkeit zu gehen, wird die Geschwindigkeit von 0 beginnend je draw call inkrementiert.

PS.:

1) Stopfe die einzelnen Tisch-Seiten doch in ein Array:

GLQuader[] seiten = new GLQuader[4];

Dann könntest du in einigen Fällen sogar mit Schleifen deinen Code verkürzen:

for (int i = 0; i < seiten.length; ++i) {
  seiten[i].setzeTextur("gfx/HOLZ.png");
}

2) Wird wirklich nach jedem Tastendruck der Mainthread für 5 Sekunden gestoppt?

Und ist eine Auswertung von mehreren gleichzeitig gedrückten Tasten möglich? Wenn nicht, wäre ein if-else if geeigneter, um unnötige Abfragen/Vergleiche einzusparen.