(Das Interface KeyListener)
Zeile 66: Zeile 66:
  
 
Die Anmeldung des <code>KeyListener</code>-Interfaces hat automatisch stattgefunden, als der <code>CounterText</code> über <code>add(...)</code> angemeldet wurde. Ab dem Zeitpunkt wird die <code>onKeyDown(KeyEvent)</code>-Methode bei jedem Tastendruck aufgerufen. Zusätzlich hat das Interface eine optionale Methode zur Reaktion auf das Loslassen einer Taste. Du findest die Information in der [https://docs.engine-alpha.org/4.x/ea/event/KeyListener.html Dokumentation].
 
Die Anmeldung des <code>KeyListener</code>-Interfaces hat automatisch stattgefunden, als der <code>CounterText</code> über <code>add(...)</code> angemeldet wurde. Ab dem Zeitpunkt wird die <code>onKeyDown(KeyEvent)</code>-Methode bei jedem Tastendruck aufgerufen. Zusätzlich hat das Interface eine optionale Methode zur Reaktion auf das Loslassen einer Taste. Du findest die Information in der [https://docs.engine-alpha.org/4.x/ea/event/KeyListener.html Dokumentation].
 +
 +
== Auf bestimmten Tastendruck reagieren: Moving Rectangle ==
 +
 +
Im folgenden Beispiel reagiert das "Character"-Objekt auf WASD-Input, um sich in diskreten Schritten zu Bewegen.
 +
 +
[[Datei:Tutorial MovingRectangle rectA.png|mini|Das rote Rechteck bewegt sich mit WASD]]
 +
 +
<source lang="java">
 +
import ea.Game;
 +
import ea.Scene;
 +
import ea.actor.Rectangle;
 +
import ea.event.KeyListener;
 +
 +
import java.awt.Color;
 +
import java.awt.event.KeyEvent;
 +
 +
 +
public class MovingRectangle
 +
extends Scene {
 +
 +
    public MovingRectangle() {
 +
        this.add(new Character());
 +
    }
 +
 +
    public static void main(String[] args) {
 +
        Game.start(600, 400, new MovingRectangle());
 +
        Util.addScreenshotKey("rectA");
 +
    }
 +
 +
    private class Character
 +
    extends Rectangle
 +
    implements KeyListener {
 +
 +
        public Character() {
 +
            super(2, 2);
 +
            this.setCenter(0,0);
 +
            setColor(Color.RED);
 +
        }
 +
 +
        @Override
 +
        public void onKeyDown(KeyEvent keyEvent) {
 +
            switch (keyEvent.getKeyCode()) {
 +
                case KeyEvent.VK_W:
 +
                    this.moveBy(0, 0.5f);
 +
                    break;
 +
                case KeyEvent.VK_A:
 +
                    this.moveBy(-0.5f, 0);
 +
                    break;
 +
                case KeyEvent.VK_S:
 +
                    this.moveBy(0, -0.5f);
 +
                    break;
 +
                case KeyEvent.VK_D:
 +
                    this.moveBy(0.5f, 0);
 +
                    break;
 +
            }
 +
        }
 +
    }
 +
}
 +
</source>
 +
 +
== KeyEvent ==
 +
 +
Alle Informationen über den Tastendruck sind im [https://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html <code>java.awt.KeyEvent</code>] gespeichert. Die Engine nutzt hier dieselbe Schnittstelle wie Standard-Java, nachdem die auch hier gut funktioniert.
 +
 +
Dieses Mal gibt es eine switch/case-Struktur in der <code>onKeyDown</code>-Methode, um abhängig von der Eingabe (W/A/S/D) unterschiedlich zu reagieren:
 +
 +
<source lang="java">
 +
@Override
 +
public void onKeyDown(KeyEvent keyEvent) {
 +
    switch (keyEvent.getKeyCode()) {
 +
        case KeyEvent.VK_W:
 +
            this.moveBy(0, 0.5f);
 +
            break;
 +
        case KeyEvent.VK_A:
 +
            this.moveBy(-0.5f, 0);
 +
            break;
 +
        case KeyEvent.VK_S:
 +
            this.moveBy(0, -0.5f);
 +
            break;
 +
        case KeyEvent.VK_D:
 +
            this.moveBy(0.5f, 0);
 +
            break;
 +
    }
 +
}
 +
</source>

Version vom 5. Januar 2020, 00:57 Uhr


Dies ist ein Tutorial für die Engine Alpha 4.x. Diese funktioniert anders als die EDU-Version. Du findest eine Übersicht über alle Tutorials hier.

Inhalt

In diesem Tutorial:

  • Reagierst du auf Tastatureingabe des Spielers


Tastencounter

Der folgende Code implementiert einen einfachen Zähler, der die Anzahl an gedrückten Tasten (vollkommen egal, welche) festhält.

Der Counter im Gange
import ea.Game;
import ea.Scene;
import ea.actor.Text;
import ea.event.KeyListener;

import java.awt.event.KeyEvent;

public class TastenCounter
extends Scene {

    public TastenCounter() {
        this.add(new CounterText());
    }

    public static void main(String[] args) {
        Game.start(500, 200, new TastenCounter());
    }

    private class CounterText
    extends Text
    implements KeyListener {

        private int counter = 0;

        public CounterText() {
            super("You pressed 0 keys.", 2);
            this.setCenter(0,0);
        }

        @Override
        public void onKeyDown(KeyEvent keyEvent) {
            counter++;
            this.setContent("You pressed " + counter + " keys.");
            this.setCenter(0,0);
        }
    }
}

Das Interface KeyListener

Eine Klasse, die auf Tastatur-Input des Nutzers reagiert implementiert das Interface ea.event.KeyListener. Die Engine nutzt das Observer-Entwurfsmuster für alle Events.

Dieses Interface hat denselben Namen wie das Standard-Java Interface java.awt.KeyListener. Achte darauf, dass du die Zeile import ea.event.KeyListener einbindest.

Die Anmeldung des KeyListener-Interfaces hat automatisch stattgefunden, als der CounterText über add(...) angemeldet wurde. Ab dem Zeitpunkt wird die onKeyDown(KeyEvent)-Methode bei jedem Tastendruck aufgerufen. Zusätzlich hat das Interface eine optionale Methode zur Reaktion auf das Loslassen einer Taste. Du findest die Information in der Dokumentation.

Auf bestimmten Tastendruck reagieren: Moving Rectangle

Im folgenden Beispiel reagiert das "Character"-Objekt auf WASD-Input, um sich in diskreten Schritten zu Bewegen.

Das rote Rechteck bewegt sich mit WASD
import ea.Game;
import ea.Scene;
import ea.actor.Rectangle;
import ea.event.KeyListener;

import java.awt.Color;
import java.awt.event.KeyEvent;


public class MovingRectangle
extends Scene {

    public MovingRectangle() {
        this.add(new Character());
    }

    public static void main(String[] args) {
        Game.start(600, 400, new MovingRectangle());
        Util.addScreenshotKey("rectA");
    }

    private class Character
    extends Rectangle
    implements KeyListener {

        public Character() {
            super(2, 2);
            this.setCenter(0,0);
            setColor(Color.RED);
        }

        @Override
        public void onKeyDown(KeyEvent keyEvent) {
            switch (keyEvent.getKeyCode()) {
                case KeyEvent.VK_W:
                    this.moveBy(0, 0.5f);
                    break;
                case KeyEvent.VK_A:
                    this.moveBy(-0.5f, 0);
                    break;
                case KeyEvent.VK_S:
                    this.moveBy(0, -0.5f);
                    break;
                case KeyEvent.VK_D:
                    this.moveBy(0.5f, 0);
                    break;
            }
        }
    }
}

KeyEvent

Alle Informationen über den Tastendruck sind im java.awt.KeyEvent gespeichert. Die Engine nutzt hier dieselbe Schnittstelle wie Standard-Java, nachdem die auch hier gut funktioniert.

Dieses Mal gibt es eine switch/case-Struktur in der onKeyDown-Methode, um abhängig von der Eingabe (W/A/S/D) unterschiedlich zu reagieren:

@Override
public void onKeyDown(KeyEvent keyEvent) {
    switch (keyEvent.getKeyCode()) {
        case KeyEvent.VK_W:
            this.moveBy(0, 0.5f);
            break;
        case KeyEvent.VK_A:
            this.moveBy(-0.5f, 0);
            break;
        case KeyEvent.VK_S:
            this.moveBy(0, -0.5f);
            break;
        case KeyEvent.VK_D:
            this.moveBy(0.5f, 0);
            break;
    }
}