Ursprungsmitteilung
Thema Mehrere Turtles über Tastatur steuern 
Autor Klaus Berger 
Eingangsdatum 2021-03-31 21:05:53.0 
Mitteilung Hallo

Meine SuS entwickeln Spielchen mit mehreren Turtles, die sie über die Tastatur steuern wollen. Wenn nur eine Turtle erzeugt wird ( makeTurtle(keyPressed=onKeyPressed) ), dann ist das Argument key ein Int, genau wie in der Doku. Wenn aber benamste Turtleobjekte erzeugt werden (t =Turtle(tf, keyPressed=onKeyPressed), ist key ein Objekt, das, wenn ich print key mache, folgendes ausgibt:

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=37,keyText=Links,keyChar=Undefiniert keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=37,primaryLevelUnicode=0,scancode=75,extendedKeyCode=0x25] on ch.aplu.turtle.Playground[,0,0,1601x1101,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=8,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=1601,height=1101]]

Ich habe meinen SuS gesagt, sie sollen statt mit key mit int(str(key)[44:46]) arbeiten. Gibt's da eine elegantere Lösung?

Vielen Dank für eure Hilfe.

Gruss

Klaus 
 
      
Antworten
Thema Mehrer Turtles steuern 
Autor Jarka 
Eingangsdatum 2021-04-01 15:13:39.0 
Mitteilung Hallo Klaus

Du hast recht, es ist ein Fehler in der Turtle-Bibliothek. Wenn man keyEvent beim Erzeugen des TurtleFrames instanziert, gibt die Methode keyPressed nicht den nummerischen Code der gedrückten Taste, sondern die Java-Event-Rückmeldung zurück. Bei den einzelnen Turtles ist der KeyCode aus Java-Event richtig extrahiert. Wir versuchen es in der nächsten Version zu verbessern.

Deine Idee mit str ist sicher nicht schlecht. Eine andere Idee wäre, nicht mit TurtleFrame zu arbeiten, sondern die erste Turtel mit t1 = makeTurte() zu erzeugen und dann die zweite Turtle im Playground der ersten Turtle zu erstellen t2 = Turtle(t1).

Dann kannst du mit getKyeCodeWait() den nummerischen Code bei jedem Tastendruck abfangen. Im unten stehenden Beispiel wechseln die Turtles nach jedem Tastendruck, ich denke, dass ist bei den Spielen immer der Fall, dass die Spieler abwechseln. Wenn man noch mehrere Spieler braucht muss man sie in einer Liste anordnen und diese wiederholt durchgehen. Mit den Cursor-Tasten kann man die Turtle bewegen.


from gturtle import *

def go(t):
if k == 37:
t.setHeading(-90)
elif k == 39:
t.setHeading(90)
elif k == 38:
t.setHeading(0)
elif k == 40:
t.setHeading(180)
t.fd(20)

t1 = makeTurtle()
t1.setPos(-50, 0)
t2 = Turtle(t1)
t2.setColor("red")
t2. setPos(50, 0)
t = t1

while True:
k = getKeyCodeWait()
print(k)
go(t)
if t == t1:
t = t2
else:
t = t1


Ich hoffe, dass es deinen Schülern etwas weiter hilft.

Freundliche Grüsse
Jarka 
 
Thema Mehrere Turtel mit Tastetut steuern 
Autor Jarka 
Eingangsdatum 2021-04-01 16:06:18.0 
Mitteilung Hallo Klaus

Noch ein Beispiel. Wenn du Code mit code = tf.getKeyCode() abfragst, funktioniert es auch mit TurtleFrame.

from gturtle import *

def move(t):
t.forward(30)

def onKeyPressed(key):
code = tf.getKeyCode()
print(code)
if code == 88: # x
move(t1)
elif code == 89: # y
move(t2)

tf = TurtleFrame(keyPressed = onKeyPressed)
t1 = Turtle(tf)
t2 = Turtle(tf)
t1.setPos(100,-300)
t2.setPos(-100,-300)
tf.addStatusBar(20)
tf.setStatusText("Press x or y")

Freundliche Grüsse
Jarka