【问题标题】:Python turtle moving platformPython海龟移动平台
【发布时间】:2018-05-20 19:35:54
【问题描述】:

我正在使用海龟开发 Python 游戏。

我有一个在按键时上下移动(跳跃)的玩家对象。我正在尝试添加一个玩家必须跳上的移动平台。

我尝试将移动平台置于while 循环中。问题是因为 while 循环正在运行以保持平台移动,所以程序没有检测到按键。

我尝试将 turtle.listen() 移动到主 while 循环中,但没有成功。

如何在while True 循环中保持平台移动,并使监听器处于活动状态?

# moving platform
while True:
    s13.backward(3)
    if s13.xcor() > 250:
        s13.setheading(0)
    if s13.xcor() < -200:
        s13.setheading(180)

...
turtle.listen()
turtle.onkey(jump, "Up")

感谢任何建议...

【问题讨论】:

  • 我发布时代码没有保留格式...turtle.listen() 和onkey 在while 循环之外

标签: python while-loop turtle-graphics


【解决方案1】:

while True: 语句在诸如 turtle 之类的事件驱动环境中没有位置。至少有几个解决方案可供您使用。最直接的方法是使用turtle 内置的ontimer() 事件让函数以固定(或可变)间隔独立运行。

另一种选择是在程序中引入线程。但是,由于 turtle 是基于 tkinter 的,因此您必须通过主线程引导所有图形操作,这使事情变得复杂。

尝试在 * 中搜索:

  • 蟒蛇定时定时器

  • python海龟线程

一个粗略的例子:

from turtle import Turtle, Screen

screen = Screen()

s13 = Turtle('square')
s13.color('red', 'blue')
s13.shapesize(1, 3, 2)
s13.penup()

def jump():
    s13.color(*reversed(s13.color()))

# moving platform
def move_platform():
    s13.backward(3)

    if s13.xcor() > 250:
        s13.setheading(0)
    if s13.xcor() < -200:
        s13.setheading(180)

    screen.ontimer(move_platform, 100)

# ...
screen.onkey(jump, "Up")
screen.listen()

move_platform()

screen.mainloop()

平台来回浮动。如果您点击向上箭头(在单击窗口使其处于活动状态后),您将看到平台在浮动时交换其填充和轮廓颜色。

【讨论】:

  • 谢谢...这是有道理的...线程的使用越过我的脑海,但我从未使用过它们。我想是时候学习如何...我删除了 main 中的 while 循环并添加了 ontimer。它可以工作,但 s13 在玩家“跳跃”时停止移动。
  • 阅读其他一些帖子,其中也建议使用 ontimer() 但也有 100% 的解决方案。线程是使两个单独的 obj 移动而不会相互干扰的唯一方法吗?它们很难使用吗?
  • @chappie,我无法说明为什么您的平台在玩家跳跃时停止移动,因为我没有看到代码。也许ontimer() 仍然是一个选项。
  • @chappie,您可以编辑您的问题以扩充它或开始一个新问题。取决于我们是在处理新问题还是当前问题的另一个方面。
【解决方案2】:

你需要移动:

turtle.listen()
turtle.onkey(jump, "Up")

到顶部。像这样:

    turtle.listen()
    turtle.onkey(jump, "Up")

while True:
    s13.backward(3)
    if s13.xcor() > 250:
        s13.setheading(0)
    if s13.xcor() < -200:
        s13.setheading(180)

...

【讨论】: