Game-Apps für Smartphones und Tablets |
|
Bern University oh Teacher Education |
Mit Touch-Events können Programme, die auf die Berührung des Smartphons-Touchscreen reagieren, erstellen. Dazu müssen wir einen GGTouchListener implementieren. Dieser wird mit addTouchListener() im GameGrid registriert. Dabei werden über eine "OR"-Maske die Events angegeben an denen man interessiert ist. Dadurch lassen sich auf elegante Art Touchevents ausfiltern, die in der Anwendung nicht benötigt werden. Implementiert sind folgende Aktionen: click, doubleClick, drag, longPress, press und release. Mit dem Parameter der Klasse GGMouse können wichtige Information zum Event bezogen werden, insbesondere die aktuelle Touchposition. Beispiel 1: Mit jeder Berührung des Tauchscreens 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 TouchListener und der Tochevent sind in der Applikationsklasse implementiert. In diesem Bespiel braucht man nur GGTouch.click.
| ![]() |
// AndroidEx15.java Create objects by clicking package app.ex15; import ch.aplu.android.*; public class AndroidEx15 extends GameGrid implements GGTouchListener { public AndroidEx15() { super(8, 8, cellZoom(62), RED, "reef", false); } public void main() { addTouchListener(this, GGTouch.click); doRun(); } public boolean touchEvent(GGTouch touch) { addActor(new Clownfish(), getTouchLocation()); return true; } } class Clownfish extends Actor { public Clownfish() { super("nemo"); } public void act() { if (getX() == 0 || getX() == 7) { turn(180); setHorzMirror(!isHorzMirror()); } move(); } } |
addTouchListener(this, GGTouch.click) | Registriert den TouchListener, wobei nur die Position der Berührung der Touchscreens benötigt wird |
Location location = toLocationInGrid(touch.getX(), touch.getY()) | Speichert die Koordinaten der Berührungin der Variablen location |
addActor(new Clownfish(), location) | Erzeugt einen neuen Clownfish an der Position der Berührung |
Beispiel 2: Ein Maus-Actor kann mit dem Finger an eine beliebige Position im Gitter verschoben werden. In einer switch-Struktur wird festgelegt, was geschehen soll, wenn gedrückt wird (press), losgelassen (release) oder verschoben wird (drag).
| ![]() |
// AndroidEx16.java package app.ex16; import ch.aplu.android.*; public class AndroidEx16 extends GameGrid implements GGTouchListener { private Actor actor; public AndroidEx16() { super(8, 8, 0, RED); } public void main() { addActor(new Actor("mouse"), new Location(5, 5)); addTouchListener(this, GGTouch.press | GGTouch.drag | GGTouch.release); } public boolean touchEvent(GGTouch touch) { Location location = toLocationInGrid(touch.getX(), touch.getY()); switch (touch.getEvent()) { case GGTouch.press: actor = getOneActorAt(location); break; case GGTouch.drag: if (actor != null) actor.setLocation(location); break; case GGTouch.release: if (actor != null) { actor.show(0); actor.setLocation(location); } break; } refresh(); return true; } } |
Erklärungen zum Programmcode:
addTouchListener(this, GGTouch.press | GGTouch.drag | GGTouch.release); | Der Touchlistener wird registriert. Da die Applikationsklasse einen GGTouchListener implementiert, wird ihre eine Referenz übergeben (this). press, drag und release 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 der Berührung 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 der Berührung befindet |