这是一个有点奇怪的问题,但我有一个海龟游戏,我希望每次用户按下向上箭头键时,海龟都会移动,但如果你按住它,它不会继续移动。有没有办法用乌龟做到这一点?EG:onkeyrelease 或 onkeypress,以便它只执行一次所需的功能,直到您再次单击该键才再次执行?
问问题
653 次
2 回答
0
当您制作游戏并希望用户即使一直按下键也只移动一次,您应该在任何编程语言中使用 onkeyrelease 事件。
模块 turtle 有它自己的事件,你不需要导入任何其他模块。
这是一个简单的例子
import turtle
m = turtle.Turtle()
def step():
m.forward(50)
window = turtle.Screen()
window.onkeyrelease(step, "Right")
window.listen()
window.mainloop()
我在这里做这个是为了好玩,你应该试试看:)
import turtle
t = turtle.Turtle()
step = 25
t.speed(0)
# set the angles according to the mode
t_angles = [180, 0, 90, 270] if turtle.mode() == "standard" else [270, 90, 0, 180]
# standard mode | logo mode
# 0 -> east | 0 -> north
# 90 -> north | 90 -> east
# 180 -> west | 180 -> south
# 270 -> south | 270 -> west
def t_left():
t.seth(t_angles[0])
t.forward(step)
def t_right():
t.seth(t_angles[1])
t.forward(step)
def t_up():
t.seth(t_angles[2])
t.forward(step)
def t_down():
t.seth(t_angles[3])
t.forward(step)
def t_hide(a, b): t.penup()
def t_show(a, b): t.pendown()
def t_white(): t.color("white")
def t_red(): t.color("red")
def t_green(): t.color("green")
def t_blue(): t.color("blue")
def t_yellow(): t.color("yellow")
def t_default(): t.color("black")
window = turtle.Screen()
# press arrows to move around
window.onkeyrelease(t_right, "Right")
window.onkeyrelease(t_left, "Left")
window.onkeyrelease(t_up, "Up")
window.onkeyrelease(t_down, "Down")
# press these for changing color
window.onkeyrelease(t_white, "w")
window.onkeyrelease(t_red, "r")
window.onkeyrelease(t_green, "g")
window.onkeyrelease(t_blue, "b")
window.onkeyrelease(t_yellow, "y")
window.onkeyrelease(t_default, "d")
# press Esc to quit
window.onkeyrelease(window.bye, "Escape")
# press left button of the mouse to put the pen
window.onclick(t_show, 1)
# press right button of the mouse to hold the pen
window.onclick(t_hide, 3)
# listen to all the events
window.listen()
# keep the window open
window.mainloop()
于 2020-04-05T20:20:03.220 回答
0
我尝试了@SaymoinSam 的大量onkeyrelease()
示例,但它们对我不起作用。我相信问题是操作系统实现了键重复,你不能直接从 Python 乌龟打败它。
另一种方法是简单地禁用事件处理程序中的事件处理程序:
from turtle import Screen, Turtle
turtle = Turtle()
def step():
screen.onkey(None, 'Right')
turtle.forward(50)
screen = Screen()
screen.onkey(step, 'Right')
screen.listen()
screen.mainloop()
这将触发一次,并且仅触发一次。如果你想重新武装它,只需重新screen.onkey(step, 'Right')
设置另一个射击。
于 2020-04-10T01:30:05.187 回答