我添加了一个函数定义,告诉您当按空格键时乌龟会跳。我的代码中还有一个while True
循环,每当按下空格键时,while True
循环就会暂时冻结,直到跳转完成然后继续。
我尝试在while True
循环中和外部添加函数定义。我只能将函数定义放在while True
循环之前,因为如果将其放在while True
之后,代码将永远无法到达它。
#making the player jump
def jump():
player.fd(100)
player.rt(180)
player.fd(100)
player.lt(180)
turtle.listen()
turtle.onkey(jump, "space")
我期望while True
循环不会冻结,但是无论我尝试将def
放在哪里,它似乎都不起作用。
我也看到了与此类似的另一个答案,但不明白如何将其应用于代码。
任何其他建议都很好。
答案 0 :(得分:2)
直到您可以使异步工作正常工作,这是一个使用乌龟自己的计时器事件的极简实现,即使在跳跃时也可以保持障碍前进:
from turtle import Screen, Turtle
def jump():
screen.onkey(None, 'space') # disable handler inside handler
if jumper.ycor() == 0: # if jumper isn't in the air
jumper.forward(150)
jumper.backward(150)
screen.onkey(jump, 'space')
def move():
hurdle.forward(6)
if hurdle.xcor() > -400:
screen.ontimer(move, 100)
jumper = Turtle('turtle')
jumper.speed('slowest')
jumper.penup()
jumper.setheading(90)
hurdle = Turtle('turtle')
hurdle.speed('fastest')
hurdle.penup()
hurdle.setheading(180)
hurdle.setx(400)
screen = Screen()
screen.onkey(jump, 'space')
screen.listen()
move()
screen.mainloop()
通过搜索“ [turtle-graphics] jump”,您可以在SO上找到几个更充实的版本
避免在乌龟基于事件的环境中使用while True:
循环。
答案 1 :(得分:1)
我期望使用async
可能很难,但是我建立了一个可行的示例。
在jump
内部,我使用asyncio.sleep
,因此当一只乌龟正在睡觉时,另一只乌龟可以行走。没有asyncio.sleep
的情况下,第一只乌龟一直行走。
import asyncio
import turtle
t1 = turtle.Turtle()
t2 = turtle.Turtle()
async def jump1():
while True:
t1.fd(100)
await asyncio.sleep(0.01)
t1.left(90)
async def jump2():
while True:
t2.fd(100)
await asyncio.sleep(0.01)
t2.right(90)
tasks = [jump1(), jump2()]
# Python 3.6.7
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
# Python 3.7
#asyncio.run(asyncio.wait(tasks))
但是构建更复杂的东西可能会更加困难。
我还发现了aioturtle-使用async
的乌龟。也许使用aioturtle
会更容易。
答案 2 :(得分:0)
问题如下:
跳转事件的代码被同步调用。这意味着,所有内容都必须等待jump()完成才能继续。这可以通过异步声明/调用jump()方法来解决。该网站在解释异步python的含义以及如何实现方面做得很好:https://hackernoon.com/asynchronous-python-45df84b82434
简而言之,这是它的实现方式(在python 3.3或更高版本中):
async def jump():
#your code here
这只会使jump()函数异步运行。
现在,无论何时调用它,都必须像这样调用它:
await jump()
这可能不起作用,具体取决于您的确切设置。
我希望这会有所帮助。 请问我是否还有其他问题。
编辑:示例