Maus-Events


Mit Maus-Events können mausgesteuerte Aktionen ausgelöst werden. Die Maus wird im JGameGrid durch durch einen GGMouseListener überwacht. Dieser wird mit addMouseListener() im GameGrid registriert. Dabei werden über eine OR-Maske die Events angegeben an denen man interessiert ist. Dadurch lassen sich auf elegante Art Mausevents ausfiltern, die in der Anwendung nicht benötigt werden. Die Callbackmethode mouseEvent() wird aufgerufen, wenn die linke oder rechte Maustaste gedrückt, losgelassen oder die Maus verschoben wird.

Mit dem Parameter der Klasse GGMouse können wichtige Information zum Event bezogen werden, insbesondere die aktuelle Mausposition.

Beispiel 1: Ein Maus-Actor kann mit der Maus an eine beliebige Position im Gitter verschoben werden.

In einer switch-Struktur wird festgelegt, was geschehen soll, wenn die linke Maustaste gedrückt wird (lPress), losgelassen (lRelease) oder die Maus mit der gedrückten Maustaste verschoben wird (lDrag).

Beispiel zeigen

Beispiel im Online-Editor bearbeiten

 


Erklärungen zum Programmcode:
addMouseListener(this, GGMouse.lPress | GGMouse.lDrag | 
GGMouse.lRelease)
Der Mouselistener wird registriert. Da die Applikationsklasse einen GGMousListener implementiert, wird ihre eine Referenz übergeben (this).
lPress, lDrag und LRelease sind Konstanten der Klasse GGMouse, die zur Festlegung der gewünschten Mauseevents mit OR verknüpft werden
toLocationInGrid(mouse.getX(), mouse.getY()) Gibt die Gitter-Koordinaten an der Position des Mausklicks zurück, wobei nur Positionen innerhalb des sichtbaren Bereichs berücksichtigt werden

 

Beispiel 2: Mit einem linken Mausklick wird ein neuer Clownfish erzeugt, mit einem rechten Mausklick verschwindet er.

Die Fische sind Instanzen der Klasse Clownfish. Da die Bewegung der Fische in dieser Klasse implementiert ist, wird mit jedem Mausklick bereits ein sich bewegender Fisch erzeugt.

Der MouseListener und die Maus-Events sind in der Applikationsklasse implementiert. In diesem Beispiel benötigen wir nur GGMouse.lPress und GGMouse.rPress.


Beispiel zeigen

Beispiel im Online-Editor bearbeiten

 


Erklärungen zum Programmcode:
addMouseListener(this, GGMouse.lPress | GGMouse.rPress) Registriert den MouseListener, wobei nur Mausaktionen Drücken der linken (lPress) und Drücken der rechten Maustaste (rPress) benötigt werden
toLocationInGrid(mouse.getX(), mouse.getY()) Liefert die Zellenkoordinaten des Mausklicks zurück
ArrayList<Actor> actors = getActorsAt(location); Holt alle Fische aus der Zelle des Mausklicks in einer ArrayList zurück
if (actors != null)
{
   for (Actor actor: actors)
   actor.removeSelf();
}
Falls es in der Zelle Fische gibt, wird die Array Liste durchlaufen und alle Fische entfernt

 

Beispiel 3: Mit einem Mausklick können die grünen Aliens, die sich von oben nach unten bewegen, eliminiert werden. Sobald sie unten angekommen sind, werden sie rot und sind unsterblich.

Das Verhalten der Aliens ist in der Klasse Alien festgelegt. Ein Alienobjekt bewegt sich nach unten (setDirection 90°) und wechselt seine Farbe, wenn er den unteren Fensterrand erreicht hat (y = 19). Die Aliens werden fortlaufend als Instanzen des Klasse Alien an Positionen mit einer zufälligen x-Koordinate und y-Koordinate gleich 0 erzeugt.

Der MouseListener und die Mauseevents sind in der Applikationsklasse implementiert. In diesem Bespiel benötigen wir nur GGMouse.lPress.

Beispiel zeigen

Beispiel im Online-Editor bearbeiten

 


Erklärungen zum Programmcode:

if (getNbCycles() % 5 == 0)

Nur alle 5 Simulatioszyklen wird ein neuer Alien erzeugt
toLocationInGrid(mouse.getX(), mouse.getY()) Gibt die Zellenposition des Mausklicks zurück
addActor(new Alien(), new Location(x, 0), 90) Erzeugt eine Alien an der Position x, 0 mit der Bewegungsrichtung 90° (SOUTH)
Actor actor = getOneActorAt(location)
if (actor != null && actor.getY() != 19)      
     actor.removeSelf()
Wenn sich ein Actor an der Position des Mausklicks befindet, wird er erntfernt, augenommen sie befinden sich an unteren Rand (rote Aliens)
while (true)
{
   setTitle("Aliens: " + nbAliens + " Elinminated: " + nbHits);
   delay(100);
}
Der Applikationsthread zeigt die aktuelle Zahl der erzeugter Aliens und die eliminierten Aliens an. Die endlose Schleife darf zu schnell durchlaufen werden, da sonst das Programm unnötig viel CPU-Leistung verbraucht