Jython HomeDruckenJava-Online

Tastatursteuerung


Viele Spiele verwenden die Tastatur zum Steuern der Spielfiguren. In den nachfolgenden Beispielen beschreiben wir zwei Möglichkeiten der Tastensteuerung:

  • Verwendung vom Key-Events (Beispiel 1)
  • Pollen: man prüft ständig mit der Methode isKeyPressed() aus der Klasse GameGrid, ob eine Taste gedrückt wurde (Beispiel 2)

Key-Events führen zum Aufruf der Callbackfunktion keyCallback, wenn die Funktion mit dem benannten Parameter keyPressed oder keyReleased in makeGamegrid() registriert werden. Die Callbackfunktion erhält den Parameter e, aus dem man mit getKeyCode() den Code der gedrückten Taste ermitteln kann. Bei den Cursortasten sind es die Zahlencodes 37, 38, 39 und 40.

Beispiel 1: Pacman mit den Cursotasten steuern

Der Pacman kann mit den Cursortasten UP, DOWN, LEFT bzw. RIGHT bewegt werden. Ziel ist es, möglichst schnell alle Pillen zu schlucken.

Die Klassen Pacman und Pill können wir aus dem vorhergehenden Beispiel übernehmen.

 
Je nach dem, welche Cursortaste gedrückt wurde, bewegt sich der Pacman in eine der 4 benachbarten Zellen. Die Richtung kann mit der Methode setDirection() festgelegt werden.

 

 
Ausführen mit Webstart
# Gg6.py

from gamegrid import *

# --------------------- class Pacman ---------------------
class Pacman(Actor):
    def __init__(self):
        Actor.__init__(self, True, "sprites/pacman.gif", 2);

    def tryToEat(self):
        self.show(0)
        actor = getOneActorAt(self.getLocation(), Pill);
        if (actor != None):
            actor.hide()
            self.show(1)

# --------------------- class Pill ---------------------
class Pill(Actor):
    def __init__(self):
        Actor.__init__(self, "sprites/pill_0.gif");

def keyCallback(e):
      keyCode = e.getKeyCode()
      if keyCode == 37: # left
          paki.setDirection(180)
      elif keyCode == 38: # up
          paki.setDirection(270)
      elif keyCode == 39: # right
          paki.setDirection(0)
      elif keyCode == 40: # down
          paki.setDirection(90) 
      paki.move()
      paki.tryToEat() 
 
makeGameGrid(10, 10, 60, Color.red, False, keyPressed = keyCallback)
paki = Pacman()
addActor(paki, Location(0,0))
for i in range(10):
    addActor(Pill(), getRandomEmptyLocation())
show()
doRun()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

def keyCallback(e): die Callbackfunktion definiert, was geschehen soll wenn Cursortasten gedrückt werden
getKeyCode() gibt den nummerischen Code der gedrückten Taste zurück
setDirection(270): Der Pacman dreht sich gegen Norden
doRun() bewirkt dasselbe, wie wenn die Schaltfläche Run im Navigationsbalken gedrückt wird. Der Simulationszyklus startet automatisch beim Programmstart

 

Beispiel 2: Pollen (ständiges Prüfen, ob Taste gedrückt ist)

Man verwendet die Methode isKeyPressed(). Diese liefert True, wenn eine bestimmte Taste gedrückt wurde. Als Parameter werden die numerischen Codes der Cursotasten angegeben.

Der Fisch schwimmt hin und her. Mit den Cursortasten UP und DOWN kann seine vertikale Position verändert werden.

 

 

 
Ausführen mit Webstart
# Gg6a.py

from gamegrid import *


# ---------------- Fish ----------------
class Fish(Actor):
    def __init__(self):
        Actor.__init__(self, "sprites/nemo.gif")
    
    def act(self):
        self.move()
        if isKeyPressed(38): # UP
            self.setY(self.getY() - 1);
        if isKeyPressed(40): # DOWN
            self.setY(self.getY() + 1);
        if self.getX() == 0 or self.getX() == 9:
            self.turn(180)
            self.setHorzMirror(not self.isHorzMirror())
        
# --------------------- main ---------------------------------
makeGameGrid(10, 10, 60, Color.red, "sprites/reef.gif", False)
setTitle("Push cursor to move up/down")
nemo = Fish()
addActor(nemo, Location(1, 3))
show()
doRun()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

isKeyPressed(38): Gibt True zurück, wenn die Taste Cursor-UP gedrückt ist
isKeyPressed(40): Gibt True zurück, wenn die Taste Cursor-DOWN gedrückt ist

 

Beachte:
Verwendet man die standardmässige Simulationsperiode, so wird act() nur alle 200 Millisekunden aufgerufen. Klickt man nur kurz auf die Cursortasten, so ist das Risiko gross, dass dieses Ereignis verpasst wird. Verkleinert man die Simulationsperiode, so ist das Risiko gross, dass ein Tastendruck den Fisch um mehrere Zeilen verschiebt.