![]() |
TigerJython | xx für Gymnasien |
Theoretisch kollidieren zwei Figuren dann, wenn sich mindestens zwei Pixel der beiden Figuren überlagern. Da Computerfiguren sich immer in einem rechteckigen Bereich befinden, müsste man alle nicht-transparenten Pixel der beiden Bilder auf Überlagerung prüfen. Selbst für kleine Bilder ist der Aufwand dafür enorm. Enthalten die Bilder beispielsweise 50 x 50 Pixel wären dazu 2500 x 2500 Vergleiche notwendig. Um dieses Problem zu überwinden, legt man einfache geometrische Formen als Kollisionsbereiche fest. In JGameGrid sind dies Rechtecke, Kreise, Linien oder Punkte, die bezüglich der Figur beliebige Position und Orientierung haben können. Standardmässig ist der Kollisionsbereich das umhüllende Rechteck (bounding rectangle).
Beispiel 1: Die beiden rechteckigen Figuren bewegen sich auf einer kreisförmigen Bahn und reflektieren dabei am Fensterrand. Wenn sie zusammenstossen, ertönt ein Ton und die beiden Stäbe ändern ihre Bewegungsrichtung um 180°. In der Applikationsklasse wird ein GGActorCollisionListener implementiert. Dieser wird mit addActorCollisionListener(this) registriert, damit bei Kollisionsevents die Callbackmethode collide() aufgerufen wird. Dem stick1 wird mit addCollisionActor(stick2) mitgeteilt, dass er auf Kollisionen mit stick2 reagieren soll. In diesem Beispiel kann man gut beobachten, wie exakt der Kollision-Algorithmus von JGameGrid funktioniert. Selbst wenn sich die beiden Figuren mit Eckpunkten berühren, wird eine Kollision registriert. |
![]() |
Programmcode für lokale Bearbeitung downloaden: JGameEx26.zip
| setSimulationPeriod(10) | Verkürzt die Simulationsperiode, damit sich die beiden Stäbe schneller bewegen |
| stick2.show(1) | Die beiden Sticks sind Instanzen der gleichen Klasse Stick, wobei beim stick1 das Bild stick_0.gif (rot) und beim stick2 stick_1.gif (gelb) sichtbar ist. Standardmässig ist immer das Sprite mit der Id 0 sichtbar |
| collide(Actor actor1, Actor actor2) | Callbackmethode des CollisionListener. Deklariert das Verhalten der beiden Actors nach der Kollision |
| return 10 | Der Rückgabewert der Methode collide() legt die minimale Anzahl der Simulationszyklen fest, bis sie wieder aufgerufen werden kann |
Beispiel 2: Der Fisch muss den schwimmenden Quallen ausweichen. Falls er eine berührt, wird er auf seine Ausgangsposition am linken Rand des Fensters zurück versetzt. Das Ziel ist es, den rechten Fensterrand zu erreichen.
|
![]() |
Programmcode für lokale Bearbeitung downloaden: JGameEx27.zip
| nemo.setCollisionCircle(new Point(0, 0), 40) | Die Kollisionsfläche wird als Kreis mit dem Mittelpunkt 0,0 und Radius 40 definiert |
| nemo.addCollisionActor(jelly) | Jede neu erzeugte Qualle wird als CollisonActor registriert |
count = countMax |
Die Quallen werden am rechten Rand des Fensters erzeugt und bewegen sich nach links. Damit es nicht zu viele Quallen gibt, werden sie gezählt |
| nemo.setLocation(startLocation) | Der Nemo wird bei jeder Kollision an die Startposition zurückgesetzt. Ereicht er den rechten Rand, ändert er sein Erscheinungsbild |
Beispiel 3: Ein mausgesteuerter Pfeil kann mit seiner vorderen Spitze (CollisionSpot) Ballone zerplatzen. 10 Ballone werden an zufällig gewählten Positionen erzeugt. Beim Pfeil wird der Endpunkt der Nadel mit dart.setCollisionSpot(new Point(30, 0)) als Collisionsspot festgelegt. Zur Bestimmung des Collisionspots wird ein Koordinatensystem mit Ursprung (0, 0) im Mittelpunkt des Spritebildes verwendet. Das Spritebild ist 60 x 17 pixel gross, d.h. (30, 0) sind die Koordinaten des Endpunktes der Nadel. Der Pfeil dreht sich bei der Bewegung in die Richtung der Mausbewegung. Dies wird in der Klasse Dart mit folgendem Verfahren erreicht: Man folgt dem Mauscursor und erfasst fortlaufend die Cursorposition. Jedesmal, wenn die alte und die neue Position 5 Pixel voneinander entfernt sind, bestimmt man die Verbindungsgerade der beiden Punkte. Ihre Richtung, die man mit actan2() bestimmt, betrachtet man als die Bewegungsrichtung der Maus.
|
![]() |
Programmcode für lokale Bearbeitung downloaden: JGameEx28.zip
| dart.setCollisionSpot(new Point(30, 0)) | Setzt den CollisionSpot auf die Koordinaten der Nadelspitze, relativ zum Mittelpunkt des Sprite-Bildes |
| dart.addCollisionActor(balloon) | Jeder neu erzeugte balloon wird als CollisonActor registriert |
actor2.removeSelf() |
Lässt den mit der Pfeilspitze berührten Ballon verschwinden |
| return 0 | Man gibt in der Methode collide() die Anzahl der Simulationszyklen zurück, bis die Kollisionsdetektion wieder aktiv wird. In diesem Fall kann sie sofort wieder aufgerufen werden |
| double dx = location.x - oldLocation.x double dy = location.y - oldLocation.y |
Berechnet die Differenz der neuen und alten Koordinaten |
| if (dx * dx + dy * dy < 25) return true |
Wartet, bis der Abstand des alten und neuen Punktes mindestens 5 pixel ist |