如何在pyglet中使用计划功能将值分配给变量?

时间:2018-10-22 18:07:13

标签: python pyglet pymunk

使用以下代码

x=1.0
def update(dt):
    space.step(dt)
def xprinter(self, x):
    print (x)
    return x+1

if __name__ == "__main__":


    x=pyglet.clock.schedule(xprinter,x)
    pyglet.clock.schedule_interval(update, 1.0/60)
    pyglet.app.run()

我的回报只是1.0遍。我希望每次调用都更新该值。我想念什么?

1 个答案:

答案 0 :(得分:1)

此处的设计基于您的函数依赖于返回结果。
这引起了一个问题,因为Pyglet的内部函数负责按一定间隔执行该函数,这意味着您不是执行该调用的那个人-而且那里的Pyglet也不是获得该返回值的人。

并且由于Pyglet没有有意义的方法来中继返回的值(有很多方法,但是它们涉及到挂钩和覆盖某些内部函数),所以您将永远看不到该返回值。

>

快速简便的解决方法是:

x=1.0
def update(dt):
    space.step(dt)

def xprinter(self):
    global x
    print(x)
    x += 1

if __name__ == "__main__":
    pyglet.clock.schedule(xprinter)
    pyglet.clock.schedule_interval(update, 1.0/60)
    pyglet.app.run()

通过这种方式,计划调用将更新全局变量x,而不是返回数学方程式的结果。

一种更简洁的方法是使用x属性定义一个类,并将一个类实例传递给pyglet.clock.schedule()

class player():
    def __init__(self):
        self.x = 0

def update(dt):
    space.step(dt)

def xprinter(self, p):
    print(p)
    p.x += 1

if __name__ == "__main__":
    p = player()
    x = pyglet.clock.schedule(xprinter, p)
    pyglet.clock.schedule_interval(update, 1.0/60)
    pyglet.app.run()

如果我还没有完全脱离球场,这会因为实例而记住时钟滴答声中的值。

通常这也是您使用时间表进行玩家/游戏/动画更新的方式。