我写了我的第一个pyglet应用程序来可视化另一个脚本所做的一些计算。不幸的是,我被困住了,不知道下一步该去哪里。
我正在尝试使用for循环将精灵从其位置移动到另一个位置,所以在每个循环结束时,它会根据循环计算出的特定距离改变精灵相对于旧位置的位置。
这是我正在编写的代码的简化版本(我希望这将帮助其他人解决类似的问题,然后复制我自己的特定项目)。
@window.event
def on_draw():
window.clear()
batch.draw()
def update(yd):
Ball.y += yd
distance = [2,1,3,-2,-3,2,4,-5,1,2,3,-4,3,5,2,-2,3,2,3,-2,]
### test update in loop ###
for i in distance:
time.sleep(0.1)
update(i)
### Run app ##
pyglet.app.run()
我不想使用pyglet.clock.schedule_interval(update())
,因为循环可能需要更长的时间来计算clock.schudule
,移动将不平滑,但这很好。
我的问题是什么都没有发生,直到循环完成,只有在python通过循环调用pyglet.app.run()
之后,但如果我在循环之前调用pyglet.app.run()
,它只会在我关闭pyglet窗口后运行循环。
使用pyglet
时,您无法控制程序的主循环。
主循环是由pyglet.app.run()
启动的,你可以用window.event
装饰器钩入事件。
在主循环开始之前运行循环。这就是为什么看起来什么都没发生。
如果您想每0.1秒调用一次update
,您应该使用clock.schedule_interval
,它接受一个要调用的函数和一个interval参数。如果你想为distance
中的每个值移动一次精灵,你可以使用迭代器和嵌套函数,如:
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
并在on_draw()
:
calc = calculate()
@window.event
def on_draw():
window.clear()
batch.draw()
try: update(next(calc))
except StopIteration: pass