Pyglet从for循环移动精灵位置而不是使用pyglet时钟

时间:2014-06-11 10:35:17

标签: python for-loop pyglet

我编写了我的第一个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窗口后。

1 个答案:

答案 0 :(得分:1)

使用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