我正在尝试创建一个海龟穿越游戏,但每次运行程序时,
screen.listen()
都没有被执行,screen.exitonclick()
也没有被执行
单击乌龟窗口运行程序后,它不会关闭,乌龟也不会向前移动
import turtle
from turtle import Screen
from player import Player
import time
screen = Screen()
screen.setup(width=600, height=600)
screen.tracer(0)
player = Player()
screen.listen()
screen.onkey(player.go_up(), "Up")
turtle.TurtleScreen._RUNNING = True
game_is_on = True
while game_is_on:
time.sleep(0.1)
screen.update()
screen.exitonclick()
虽然我尝试添加 ._RUNNING 方法,但没有任何区别
这里有几个问题:
while game_is_on:
是一个无限循环,因为 game_is_on
永远不会从 True
更改为 False
。循环之后的任何内容都将永远不会运行。避免使用这种模式;在turtle中进行实时渲染循环的典型方法是ontimer
。turtle.TurtleScreen._RUNNING = True
与未记录的内部属性混淆。除非绝对需要,否则不应触及库中的内部属性,因为您可能会破坏实例的状态,并且该属性可能会在更新后消失。我不确定你想在这里做什么,但是要么找到一种使用公共 API 的方法,要么完全删除此代码(如果不是真正需要的话)(我不认为是这样——我从未使用过它)在海龟计划中)。Player
的代码没有发布,但screen.onkey(player.go_up(), "Up")
可能是不正确。它立即调用 go_up()
方法并将其返回值(可能是 None
)设置为 onkey
处理程序。您可能指的是 screen.onkey(player.go_up, "Up")
,它不会立即调用该方法,而是将其传递给处理程序,以便稍后在按下按键时由海龟库调用。有了
Player
的小存根,我建议如下设置:
from turtle import Screen, Turtle
class Player:
def __init__(self):
self.turtle = Turtle()
def go_up(self):
self.turtle.setheading(90)
self.turtle.forward(10)
def tick():
#### the main loop; move/update entities here ####
screen.update()
screen.ontimer(tick, 1000 // 30)
screen = Screen()
screen.setup(width=600, height=600)
screen.tracer(0)
player = Player()
screen.onkey(player.go_up, "Up")
screen.listen()
tick()
screen.exitonclick()
现在,您在
tick
中还没有任何代码。这是主要的更新/渲染循环。玩家的动作会很不稳定,因为它直接连接到键盘的重新触发机制。如果这种行为不是您想要的,我建议对按键做出反应并仅在 tick
内更改玩家的位置。有关示例,请参阅如何在海龟图形中将多个按键绑定在一起?。