所以我尝试使用 python 中的海龟 GUI 库创建一个蛇游戏。然而,当我使用海龟库的跟踪器功能和屏幕类来实现平滑的动画时,我的事件侦听器(键盘输入)响应出现了很多延迟。每当我关闭跟踪器时,事件侦听器都会立即做出响应。任何人都可以帮助我并解释为什么会发生这种情况以及我该怎么做才能在屏幕上正确处理即时键盘输入。提前致谢!这是程序供您参考。
import turtle
from snake import Snake
import time
turtle.mode("standard")
window = turtle.Screen()
window.setup(width=600, height=600)
window.bgcolor("black")
window.title("Snake game")
window.tracer(n=0)
window.listen()
snake = Snake()
window.onkey(fun=snake.goup, key="Up")
window.onkey(fun=snake.godown, key="Down")
window.onkey(fun=snake.goleft, key="Left")
window.onkey(fun=snake.goright, key="Right")
window.onkey(fun=snake.goup, key="w")
window.onkey(fun=snake.godown, key="s")
window.onkey(fun=snake.goleft, key="a")
window.onkey(fun=snake.goright, key="d")
game_is_on = True
while game_is_on:
window.update()
time.sleep(1)
snake.move()
window.update()
window.exitonclick()
虽然很常见,但这不是一个好的事件循环:
game_is_on = True
while game_is_on:
window.update()
time.sleep(1)
snake.move()
window.update()
time.sleep(1)
表示您正在以每秒 1 帧(或大约)的速度运行。但睡眠会占用一些时间,因此帧速率不太一致。另外,每帧最后调用 update()
一次。
这是一个更好的事件循环:
def tick():
snake.move()
window.update()
window.ontimer(tick, 1000 // 60) # 60 FPS
tick()
window.exitonclick()
如果蛇跑得太快或太慢,请根据口味进行调整。