Mit Mouse-Events können mausgesteuerte Aktionen ausgelöst werden. Die Maus wird im JGameGrid 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. 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). |
// JGameEx21.java import ch.aplu.jgamegrid.*; import java.awt.*; public class JGameEx21 extends GameGrid implements GGMouseListener { private Actor actor ; public JGameEx21() { super(8, 8, 70, Color.red, false); setTitle("Drag Mouse!"); addActor(new Actor("sprites/mouse.gif"), new Location(5, 5)); addMouseListener(this, GGMouse.lPress | GGMouse.lDrag ); show(); } public boolean mouseEvent(GGMouse mouse) { Location location = toLocationInGrid(mouse.getX(), mouse.getY()); switch (mouse.getEvent()) { case GGMouse.lPress: actor = getOneActorAt(location); break; case GGMouse.lDrag: if (actor != null) actor.setLocation(location); break; } refresh(); return true; } public static void main(String[] args) { new JGameEx21(); } } |
Programmcode für lokale Bearbeitung downloaden: JGameEx21.zip
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 |
Location location = 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 |
actor = getOneActorAt(location) | Gibt den Actor zurück, der sich in der Zelle des Mausklicks befindet |
Beispiel 2: Mit linkem Mausklickt wird ein neuer Clownfish erzeugt. Es ist ein schönes Beispiel für objektorientierte Programmierung. Jeder neue Clownfish wird als Instanz der Klasse Clownfish erzeugt. Da die Bewegung der Fische in der Klasse Clownfish implementiert ist, wird mit jedem Mausklick bereits ein sich bewegender Fish erzeugt. Der MouseListener und die Mauseevents sind in der Applikationsklasse implementiert. In diesem Bespiel braucht man nur GGMouse.lPress.
|
![]() |
// JGameEx23.java import ch.aplu.jgamegrid.*; import java.awt.*; public class JGameEx23 extends GameGrid implements GGMouseListener { public JGameEx23() { super(15, 15, 40, Color.red, "sprites/reef.gif", false); addMouseListener(this, GGMouse.lPress); show(); doRun(); } public boolean mouseEvent(GGMouse mouse) { Location location = toLocationInGrid(mouse.getX(), mouse.getY()); addActor(new Clownfish(), location); return true; } public static void main(String[] args) { new JGameEx23(); } } class Clownfish extends Actor { public Clownfish() { super("sprites/sNemo.gif"); } public void act() { if (getX() == 0 || getX() == 14) { turn(180); setHorzMirror(!isHorzMirror()); } move(); } } |
Programmcode für lokale Bearbeitung downloaden: JGameEx23.zip
addMouseListener(this, GGMouse.lPress) | Registriert den MouseListener, wobei nur die Mausaktion Drücken der linken Maustaste benötigt wird |
Location location = toLocationInGrid(mouse.getX(), mouse.getY()) | Speichert die Koordinaten des Mausklicks in der Variablen location |
addActor(new Clownfish(), location) | Erzeugt einen neuen Clownfishan der Position des Mausklicks |
Beispiel 3: Linke und rechte Maustaste verwenden
Mit dem linken Mausklick wird ein Clownfish erzeugt, mit dem rechten Mausklick wird er entfernt
// JGameEx23a.java import ch.aplu.jgamegrid.*; import java.awt.*; import java.util.*; public class JGameEx23a extends GameGrid implements GGMouseListener { public JGameEx23a() { super(15, 15, 40, Color.red, "sprites/reef.gif", false); addMouseListener(this, GGMouse.lPress| GGMouse.rPress); show(); doRun(); } public boolean mouseEvent(GGMouse mouse) { Location location = toLocationInGrid(mouse.getX(), mouse.getY()); if (mouse.getEvent() == GGMouse.lPress) { addActor(new Clownfish(), location); } if (mouse.getEvent() == GGMouse.rPress) { ArrayList<Actor> actors = getActorsAt(location); if (actors != null) { for (Actor actor: actors) actor.hide(); } } return true; } public static void main(String[] args) { new JGameEx23a(); } } // -------------class Clownfish------------ class Clownfish extends Actor { public Clownfish() { super("sprites/sNemo.gif"); } public void act() { if (getX() == 0 || getX() == 14) { turn(180); setHorzMirror(!isHorzMirror()); } move(); } } |
addMouseListener(this, GGMouse.lPress| GGMouse.rPress); | Registriert den MouseListener mit den Mausaktionen Drücken der linken und rechten Maustaste |
if (mouse.getEvent() == GGMouse.lPress) { } if (mouse.getEvent() == GGMouse.rPress) { } |
Da nur zwei Mausaktionen vorkommen, verwenden wir die if-Struktur. Kommen mehrere Mausaktionen vor, wird in der Egel die switch-Struktur verwendet |
Beispiel 4: Mit einem Mausklick können die grünen Aliens, die sich von obern nach unten bewegen, eliminiert werden. Sobald sie aber unberührt unten angekommen sind, ändern sie ihre Farbe und können nicht mehr weggeklickt werden. Das Verhalten der Aliens ist in der Klasse Alien festgelegt. Ein Alien-Objekt 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. |
![]() |
// JGameEx24.java import ch.aplu.jgamegrid.*; public class JGameEx24 extends GameGrid implements GGMouseListener { private int nbHits = 0; public JGameEx24() { super(20, 20, 30, false); addMouseListener(this, GGMouse.lPress); setSimulationPeriod(200); playSound(GGSound.DUMMY); show(); doRun(); } public boolean mouseEvent(GGMouse mouse) { Location location = toLocationInGrid(mouse.getX(), mouse.getY()); if (mouse.getEvent() == GGMouse.lPress) { Actor actor = getOneActorAt(location); if (actor != null && actor.getY() != 19) { actor.removeSelf(); nbHits++; setTitle("Hits: " + nbHits); playSound(GGSound.PING); } } return false; } public void act() { if (getNbCycles() % 5 == 0) { int x = (int)(20 * Math.random()); addActor(new Alien(), new Location(x, 0)); } } public static void main(String[] args) { new JGameEx24(); } } // ------------------------ class Alien -------- class Alien extends Actor { public Alien() { super("sprites/alien.gif", 2); setVisible(0, true); } public void act() { setDirection(90); if (getY() < 19) move(); else setVisible(1, true); } } |
Programmcode für lokale Bearbeitung downloaden: JGameEx24.zip
if (getNbCycles() % 5 == 0) |
Dient zur Einstellung der Intervalle, in welchen die Aliens erscheinen. Ein neue Alien wird nur jeden fünften Simulationszyklus erzeugt |
location = toLocationInGrid(mouse.getX(), mouse.getY()) | Erfasst die Position des Mausklicks |
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. Die roten Aliens (y-Koordinate ist 19) können nicht entfernt werden. |
nbHits++ setTitle("Hits: " + nbHits |
Anzahl Treffer wird gezählt und in der Titelleiste angezeigt |