使用 Turtle 绑定按键事件
Binding Key Press Events Using Turtle
我是 Python 的新手,正在尝试学习许多不同的项目。我想使用 Turtle 来创建游戏,我在 YouTube 上找到了这个人,他正在重新创建 Space Invaders。
我正在使用 IDLE 和 Python 3. 屏幕和播放器已创建,但按下某个键时没有任何反应。我查了这个问题并尝试了很多方法,但我不确定我做错了什么。
另一个不寻常的事情是每个函数都是运行一次。我在每个函数中包含了一个打印语句来发现这一点。为什么 运行每个按键事件只触发一次,但没有绑定到我的实际键盘?
import turtle
#Screen setup
screen = turtle.Screen()
screen.bgcolor('black')
screen.title("Space Invaders")
#Create player
player = turtle.Turtle()
player.color('blue')
player.shape('triangle')
player.penup()
player.speed(0)
player.setposition(0, -250)
player.setheading(90)
playerspeed = 15
#Move the player left and right
def move_left():
x = player.xcor()
x -= playerspeed
player.setx(x)
screen.listen()
print("Move left.") #for debugging
def move_right():
x = player.xcor()
x += playerspeed
player.setx(x)
screen.listen()
print("Move right.") #for debugging
#Create keyboard binding
screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
screen.listen()
#Play game
screen.mainloop()
问题出在这两行代码上:
screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
您不想调用 move_left()
,您希望传递 move_left
以在按键按下时由事件处理程序调用:
screen.onkey(move_left, 'Left')
screen.onkey(move_right, 'Right')
通过包含括号,您传递了 move_left()
的 return 值,即 None
,有效地禁用事件而不是启用它!
这是对您的代码进行的修改,其中包含上述修复和另一个技巧:space 入侵者类型的游戏非常适合利用很少使用的 turtle.settiltangle()
方法。这种方法允许我们使海龟看起来垂直指向,而实际上是水平定向的。所以我们可以简单地使用 forward()
和 backward()
在屏幕上移动它:
from turtle import Screen, Turtle
PLAYER_SPEED = 15
# Move the player left and right
def move_left():
player.backward(PLAYER_SPEED)
def move_right():
player.forward(PLAYER_SPEED)
# Screen setup
screen = Screen()
screen.bgcolor('black')
screen.title("Space Invaders")
# Create player
player = Turtle('triangle')
player.speed('fastest')
player.color('blue')
player.penup()
player.sety(-250)
player.settiltangle(90)
# Create keyboard binding
screen.onkey(move_left, 'Left')
screen.onkey(move_right, 'Right')
screen.listen()
# Play game
screen.mainloop()
当然,当你发射弹丸时,你必须记住你的乌龟指向正确,并相应地改变它的方向!
我认为您在 YouTube 上找到的那个人可能一直在使用 python 2.7 而不是 python 3,后者会更改按键命令。
而不是
screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
screen.listen()
你应该使用
screen.listen()
screen.onkeypress(move_left, 'Left')
screen.onkeypress(move_right, 'Right')
我是 Python 的新手,正在尝试学习许多不同的项目。我想使用 Turtle 来创建游戏,我在 YouTube 上找到了这个人,他正在重新创建 Space Invaders。
我正在使用 IDLE 和 Python 3. 屏幕和播放器已创建,但按下某个键时没有任何反应。我查了这个问题并尝试了很多方法,但我不确定我做错了什么。
另一个不寻常的事情是每个函数都是运行一次。我在每个函数中包含了一个打印语句来发现这一点。为什么 运行每个按键事件只触发一次,但没有绑定到我的实际键盘?
import turtle
#Screen setup
screen = turtle.Screen()
screen.bgcolor('black')
screen.title("Space Invaders")
#Create player
player = turtle.Turtle()
player.color('blue')
player.shape('triangle')
player.penup()
player.speed(0)
player.setposition(0, -250)
player.setheading(90)
playerspeed = 15
#Move the player left and right
def move_left():
x = player.xcor()
x -= playerspeed
player.setx(x)
screen.listen()
print("Move left.") #for debugging
def move_right():
x = player.xcor()
x += playerspeed
player.setx(x)
screen.listen()
print("Move right.") #for debugging
#Create keyboard binding
screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
screen.listen()
#Play game
screen.mainloop()
问题出在这两行代码上:
screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
您不想调用 move_left()
,您希望传递 move_left
以在按键按下时由事件处理程序调用:
screen.onkey(move_left, 'Left')
screen.onkey(move_right, 'Right')
通过包含括号,您传递了 move_left()
的 return 值,即 None
,有效地禁用事件而不是启用它!
这是对您的代码进行的修改,其中包含上述修复和另一个技巧:space 入侵者类型的游戏非常适合利用很少使用的 turtle.settiltangle()
方法。这种方法允许我们使海龟看起来垂直指向,而实际上是水平定向的。所以我们可以简单地使用 forward()
和 backward()
在屏幕上移动它:
from turtle import Screen, Turtle
PLAYER_SPEED = 15
# Move the player left and right
def move_left():
player.backward(PLAYER_SPEED)
def move_right():
player.forward(PLAYER_SPEED)
# Screen setup
screen = Screen()
screen.bgcolor('black')
screen.title("Space Invaders")
# Create player
player = Turtle('triangle')
player.speed('fastest')
player.color('blue')
player.penup()
player.sety(-250)
player.settiltangle(90)
# Create keyboard binding
screen.onkey(move_left, 'Left')
screen.onkey(move_right, 'Right')
screen.listen()
# Play game
screen.mainloop()
当然,当你发射弹丸时,你必须记住你的乌龟指向正确,并相应地改变它的方向!
我认为您在 YouTube 上找到的那个人可能一直在使用 python 2.7 而不是 python 3,后者会更改按键命令。
而不是
screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
screen.listen()
你应该使用
screen.listen()
screen.onkeypress(move_left, 'Left')
screen.onkeypress(move_right, 'Right')