Skip to content

KeyStrokeListener (Tastatureingabe)1

Tastatureingaben erstellen

Der Counter im Gange

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

Zum Java-Code: demos/tutorials/user_input/KeyStrokeCounterDemo.java

public class KeyStrokeCounterDemo extends Scene
{
    public KeyStrokeCounterDemo()
    {
        add(new CounterText());
    }

    private class CounterText extends Text implements KeyStrokeListener
    {
        private int counter = 0;

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

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

Das Interface KeyStrokeListener

Eine Klasse, die auf Tastatur-Eingaben des Nutzers reagieren soll, implementiert das Interface KeyStrokeListener Die Engine nutzt das Observer(Beobachter)-Entwurfsmuster, um auf alle eingehenden Ereignisse reagieren zu können.

Die korrekte Anweisung, um das Interface einzubinden, lautet:

import pi.event.KeyStrokeListener

Die Anmeldung des KeyStrokeListener-Interfaces hat automatisch stattgefunden, als das Objekt der Klasse CounterText über add(...) angemeldet wurde. Ab diesem Zeitpunkt wird die onKeyDown(KeyEvent e) -Methode bei jedem Tastendruck aufgerufen.

Soll reagiert werden, wenn eine Taste losgelassen wird, kann die onKeyUp(KeyEvent e)-Methode implementiert werden.

Alle Informationen über den Tastendruck sind im Objekt keyEvent der Klasse java.awt.event.KeyEvent gespeichert. Die Engine nutzt hier dieselbe Schnittstelle wie Java.

Im folgendem Beispiel wird mit Hilfe der vier Cursor-Tasten ein kleines Rechteck bewegt:

Das rote Rechteck bewegt sich mit WASD

Zum Java-Code: demos/tutorials/user_input/KeyEventDemo.java

import java.awt.event.KeyEvent;

import pi.Game;
import pi.Scene;
import pi.actor.Actor;
import pi.Rectangle;
import pi.event.KeyStrokeListener;

public class KeyEventDemo extends Scene implements KeyStrokeListener
{
    Actor rectangle;

    public KeyEventDemo()
    {
        rectangle = new Rectangle(2, 2).setColor("blue");
        add(rectangle);
    }

    @Override
    public void onKeyDown(KeyEvent keyEvent)
    {
        switch (keyEvent.getKeyCode())
        {
        case KeyEvent.VK_UP:
            rectangle.moveBy(0, 1);
            break;

        case KeyEvent.VK_RIGHT:
            rectangle.moveBy(1, 0);
            break;

        case KeyEvent.VK_DOWN:
            rectangle.moveBy(0, -1);
            break;

        case KeyEvent.VK_LEFT:
            rectangle.moveBy(-1, 0);
            break;
        }
    }
}

Java ordnet jeder Taste eine Ganzzahl, einen sogenannten KeyCode, zu. Mit der Methode KeyEvent#getKeyCode() kann dieser Code abgefragt werden. Außerdem stellt die Klasse KeyEvent eine Vielzahl von statischen Attributen bzw. Klassenattributen bereit, dessen Name VK_ vorangestellt ist. VK steht dabei für Virtual Key. Diese Klassenattribute können in einer switch-Kontrollstruktur zur Fallunterscheidung verwendet werden.

Das nächste Beispiel zeigt den entsprechenden Namen des VK-Klassenattributs an, nachdem eine Taste gedrückt wurde. Wird zum Beispiel die Leertaste gedrückt, erscheint der Text VK_SPACE.

Zum Java-Code: demos/tutorials/user_input/KeyEventDisplayDemo.java

public class KeyEventDisplayDemo extends Scene
{
    public KeyEventDisplayDemo()
    {
        add(new KeyText());
    }

    private class KeyText extends Text implements KeyStrokeListener
    {
        public KeyText()
        {
            super("Press a key", 1);
            setCenter(0, 0);
        }

        @Override
        public void onKeyDown(KeyEvent keyEvent)
        {
            String text = KeyEvent.getKeyText(keyEvent.getKeyCode());
            text = text.replace(" ", "_");
            text = text.toUpperCase();
            setContent("VK_" + text);
            setCenter(0, 0);
        }
    }
}

  1. Der Abschnitt stammt aus dem Engine-Alpha-Wiki: https://engine-alpha.org/wiki/v4.x/User_Input