Spielprogrammierung mit Java
HomeAufgabenDruckenJava-Online

Mouse Events I (mit GGMouseListener)


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(thisGGMouse.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

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
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(thisGGMouse.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() == || getX() == 14)
    {
      turn(180);
      setHorzMirror(!isHorzMirror());
    }
    move();
  }
}

Programmcode für lokale Bearbeitung downloaden: JGameEx23.zip

Erklärungen zum Programmcode:
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(thisGGMouse.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() == || getX() == 14)
    {
      turn(180);
      setHorzMirror(!isHorzMirror());
    }
    move();
  }
}

Erklärungen zum Programmcode:
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(202030false);
    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(0true);
  }

  public void act()
  {
    setDirection(90);
    if (getY() < 19)
      move();
    else
      setVisible(1true);
  }
}

Programmcode für lokale Bearbeitung downloaden: JGameEx24.zip

Erklärungen zum Programmcode:

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