# Kollisionserkennung bei gezeichneten Objekten



## BountainMike (28. Jun 2009)

Hallo,


ich bin was die Spiele-Programmierung angeht, noch ein Anfänger und könnte eure Hilfe gebrauchen. Ich programmiere gerade eine Art Spiel des Lebens, das ich später noch weiter ausbauen möchte.

In meinem Spielfeld bewegen sich dafür verschiedene Objekte (Rechtecke und Kreise). Diese lassen durch einen Thread immer wieder neu zeichnen mittels fillRect(x,y,groessex,groessey) bzw. fillOval(x,y,groessex,groessey). Die Bewegung erfolgt ausschließlich diagonal (45° in alle 4 Richtungen), indem die Position der Objekte um +/- 1 verändert wird.

Die Objekte sollen nun aber zusammenstoßen und von einander abprallen. Dabei überlappen und verhaken sich momentan jedoch immer wieder einige Objekte, die dann nicht mehr von einander loskommen. Vereinfacht dargestellt, sieht die Kollisionsbedingung wie folgt aus:


> if((obekt1.x <= objekt2.x) && ((objekt1.x+objekt1.groesse)>=objekt2.x) && ...ähnliche Bedingungen für die y-Koordinaten) {
> objekt1.richtungx=-objekt1.richtungx;
> objekt2.richtungx=-objekt2.richtungx;
> objekt1.richtungy=-objekt1.richtungy;
> ...



Habt ihr einen Tipp, wie die Objekte sauber von einander abprallen könnten bzw. was bei der genannten Bedingung falsch läuft?


Vielen Dank!


----------



## Quaxli (29. Jun 2009)

Sieht umständlich aus... . Verwendest Du keine Grafikprimitive von Java? (Rectangle, etc.?)

Du solltest nicht auf Variablen direkt zugreifen. Getter- und Setter-Methoden wären besser oder in diesem Fall sogar eine eigene Methode (inverseMove(...) oder so).

Lösungsvorschlag: Du könntest im Falle einer Kollision für die beiden Objekte im Anschluß die Methode, mit der Du sie bewegst, noch einmal extra aufrufen. Wenn Dein GameLoop schnell genug ist, ist die Bewegung so klein, daß das nicht auffällt und reicht aber aus, daß die Kollissionserkennung beim nächsten Durchlauf nicht mehr zuschlägt.


----------



## SlaterB (29. Jun 2009)

mit getter/ setter sähe es aber teilweise noch schlimmer aus, dann schon lieber höhere Methoden

object1.reverse();
statt
objekt1.richtungx=-objekt1.richtungx;
objekt1.richtungy=-objekt1.richtungy;

edit:
oh, inverseMove(...) hattest du auch vorgeschlagen


----------

