Python Pyglet从for循环移动精灵位置,而不是使用Pyglet时钟
我正在编写我的第一个pyglet应用程序来可视化另一个脚本所做的一些计算。 不幸的是,我被困住了,不知道下一步该去哪里 我试图使用for循环将精灵从其位置移动到另一个位置, 所以在每个循环结束时,它会将精灵相对于旧位置的位置更改为循环计算的特定距离 这是我正在编写的代码的简化版本(我希望这将帮助其他人解决类似问题,然后复制我自己的特定项目) 我不想使用Python Pyglet从for循环移动精灵位置,而不是使用Pyglet时钟,python,for-loop,pyglet,Python,For Loop,Pyglet,我正在编写我的第一个pyglet应用程序来可视化另一个脚本所做的一些计算。 不幸的是,我被困住了,不知道下一步该去哪里 我试图使用for循环将精灵从其位置移动到另一个位置, 所以在每个循环结束时,它会将精灵相对于旧位置的位置更改为循环计算的特定距离 这是我正在编写的代码的简化版本(我希望这将帮助其他人解决类似问题,然后复制我自己的特定项目) 我不想使用pyglet.clock.schedule\u interval(update()),因为循环的计算时间可能比clock.schudule要长,所
pyglet.clock.schedule\u interval(update())
,因为循环的计算时间可能比clock.schudule
要长,所以移动不会很平稳,但这很好
我遇到的问题是,在循环完成之前,什么都不会发生,只有在python运行完它调用的
pyglet.app.run()
循环之后,但是如果我在循环之前调用pyglet.app.run()
,它只会在我关闭pyglet窗口之后运行循环。当使用pyglet
时,你不能控制程序的主循环
主循环由pyglet.app.run()
启动,您可以使用window.event
装饰器钩住事件
在主循环开始之前运行循环。这就是为什么看起来什么都没发生
如果要每0.1秒调用一次update
,则应使用clock.schedule\u interval
,它需要调用一个函数和一个interval参数。如果要为距离中的每个值移动精灵一次,可以使用迭代器和嵌套函数,如:
def update():
g = iter(distance)
def inner():
try:
update(next(g))
except StopIteration:
pass
return inner
pyglet.clock.schedule_interval(update(), .1)
根据您的评论进行编辑:
考虑到你的循环:
for i in distance:
time.sleep(0.1)
update(i)
您可以将其转换为迭代器:
def calculate():
for i in distance:
time.sleep(0.1) # just some expensive calculation
yield i
并在绘图()上的内使用它。
:
你是不是应该在循环中还是在更新中运行?不,pyglet是一个事件驱动的框架,当主循环启动时,pyglet自己用app.run()
重复调用on\u-draw
。所以我在循环中调用pyglet.clock.schedule\u interval()?我的问题是我不知道循环需要多长时间来计算,在循环结束时,我有一个变量,它包含计算时间和计算距离。这就是我试图调用update()作为循环的最后一行的原因。sleep(0.1)为了模拟循环计算所需的时间,循环中有很多与小猪无关的代码question@user2879397也许我误解了你的问题。所以你基本上有一个循环,在这个循环中你想做昂贵的计算,然后多次更新精灵的位置?如果是这样,您可以使用相同的技术(使用迭代器)并在on_draw()
中简单地使用它。我会更新我的答案。我知道了,我想,调用我在问题中所做的更新(),它会起作用。一些非常奇怪的事情正在发生,我想,当我在pyglet窗口内移动鼠标时,循环会停止,并在一些随机的地方持续。也许这应该是另一个问题?
def calculate():
for i in distance:
time.sleep(0.1) # just some expensive calculation
yield i
calc = calculate()
@window.event
def on_draw():
window.clear()
batch.draw()
try: update(next(calc))
except StopIteration: pass