首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyglet将sprite位置从for循环移出而不是使用pyglet时钟。

Pyglet将sprite位置从for循环移出而不是使用pyglet时钟。
EN

Stack Overflow用户
提问于 2014-06-11 10:35:16
回答 1查看 1.5K关注 0票数 0

我编写了我的第一个pyglet应用程序来可视化另一个脚本所做的一些计算。不幸的是,我被困住了,不知道下一步该去哪里。

我试图使用for循环将sprite从其位置移动到另一个位置,因此在每个循环的末尾,它会更改sprite位置相对于旧位置的位置,即循环计算的特定距离。

这是我正在编写的代码的简化版本(我希望这将帮助其他有类似问题的人,然后复制我自己的特定项目)。

代码语言:javascript
复制
@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窗口之后运行循环。

EN

回答 1

Stack Overflow用户

发布于 2014-06-11 11:29:32

当使用pyglet时,您无法控制程序的主循环。

主循环由pyglet.app.run()启动,您可以用window.event装饰器连接事件。

在主循环启动之前运行您的循环。这就是为什么似乎什么都没发生。

如果您想每0.1秒调用一次update,您应该使用clock.schedule_interval,它需要调用一个函数和一个interval参数。如果您想对distance中的每个值移动一次sprite,可以使用迭代器和嵌套函数,例如:

代码语言:javascript
复制
def update():
   g = iter(distance)
   def inner(): 
       try:
           update(next(g))    
       except StopIteration:
           pass
   return inner

pyglet.clock.schedule_interval(update(), .1)

编辑回应您的评论:

给出你的循环:

代码语言:javascript
复制
for i in distance:
    time.sleep(0.1)
    update(i)

您可以将其转换为迭代器:

代码语言:javascript
复制
def calculate():
    for i in distance:
        time.sleep(0.1) # just some expensive calculation
        yield i

并在on_draw()中使用

代码语言:javascript
复制
calc = calculate()

@window.event
def on_draw():
    window.clear()
    batch.draw()
    try: update(next(calc)) 
    except StopIteration: pass
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24160732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档