0

使用以下代码

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。我希望每次调用都会更新该值。我错过了什么?

4

1 回答 1

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()

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

这通常也是您将使用时间表的目的,进行播放器/游戏/动画更新。

于 2018-10-25T05:54:43.657 回答