Ursprungsmitteilung
Thema isKeyPressed oder ähnlich in gturtle? 
Autor Matthias Amberg 
Eingangsdatum 2020-09-03 08:10:39.0 
Mitteilung Guten Morgen zusammen

Das gturtle Modul bietet ja ein paar wenige Funktionen zum auslesen von Tastatureingaben [ getKey(), getKeyWait()... ].

Da man weder mehrere Keys gleichzeitig abfragen kann, noch festellen kann ob ein Key noch gedrückt ist, respektive die Abfrage von dem Auto-Repeat des OS abhängt. Ist es leider schwierig, ein einfaches Spiel und trotzdem reaktives Spiel zu programmieren.

Gibt es irgendwelche versteckten Funktionen wie etwa:
- getKeyPressed('w') git True/False zurück falls, ob dieser Key gedrückt wird
- Callbacks: wie keyPress / keyRelease -> dann könnte man sich zumindest den Zustand selber merken?


Falls ich das übersehen habe: Entschuldigung im voraus.

Beste Grüsse

Matthias 
 
      
Antworten
Thema keyPressed 
Autor Jarka 
Eingangsdatum 2020-09-03 11:46:31.0 
Mitteilung Hallo Matthias

Im Modul gturtle gibt es eine Callbackfunktion "keyPressed", die True zurückgibt, wenn eine Taste gedrückt wurde und gleichzeitig den Tastaturcode der gedrückten Taste. Ich sehe gerade, dass diese Funktion in der gturtle-Dokumentation fehlt. Wir werden es ergänzen.

Du definiert also eine Callbackfunktion, in der beschreibst, was geschehen soll, wenn eine Taste gedrückt wird:

def onKeyPressed(key):
if key == 37:
forward(10)
elif key == 39:
....

Der Callback wird beim Erzeugen der Turtle registriert:
makeTurtle(keyPressed = onKeyPressed)

Einige Beispiele dazu findest du unter jython.ch
(jython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=turtle/keyevents.inc.php)

Freundliche Grüsse

Jarka






 
 
Thema isKeyPressed oder ähnlich in gturtle?  
Autor Matthias Amberg 
Eingangsdatum 2020-09-07 08:22:03.0 
Mitteilung Hallo Jarka

vielen Dank für deine Antwort.

Leider ist genau dieses Verhalten nicht sehr angehnehm für die Spieleprogrammierung. Es lässt sich damit einfach nicht eine saubere Steuerung bauen.

onKeyPressed wird immer wieder aufgerufen, wenn man eine Taste gedrückt hält, initial mit einer Verzögerung und danach mit einer Frequenz welche von der Keyboard Einstellung im OS abhängig ist.

Man bräuchte sowas:

repeat :
if keyIsPressed("w"):
forward(10)
if keyIsPressed("s"):
back(10)
if keyIsPressed("a"):
left(10)
if keyIsPressed("d"):
right(10)

Das ist erstens einfach zu verstehen und zu programmieren und gibt eine völlig andere Dynamik.

Übrigens ist der Tigerjython Code Open-Source?

Besten Dank
Matthias