我想把时钟类皮格莱特钟模块,但我在使用schedule_interval时遇到一些问题:
下面的代码不打印任何内容,如果不勾选对象c,那么它看起来像:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyglet
class Clock(pyglet.clock.Clock):
def __init__(self):
super(Clock, self).__init__()
class Test(object):
def update(self, dt):
print dt
w = pyglet.window.Window()
@w.event
def on_draw():
w.clear()
t = Test()
c = pyglet.clock.Clock()
c.schedule_interval(t.update, 1/60.0)
pyglet.app.run()
但下一个很好。在
^{pr2}$唯一的区别是pyglet.clock.set_默认值时钟构造方法中的(self)语句。在
我认为这还不清楚,或者至少不是最好的子类化方法pyglet.clock.时钟拥有自己的派生时钟类。在
问题:
有什么方法可以用Pyglet自动设置默认时钟?在
有什么解决方案更优雅或Python?在
不需要pyglet.clock.set_默认值(自我)线?在
但我想我没用过:
你快到了。您的第一个实现可能不起作用的原因是以下几行:
在这里,您正在创建一个新的时钟实例,并计划对其进行回调。然而,实际上,您并没有将时钟实例与pyglet关联起来。所以,当你跑的时候。。。在
^{pr2}$…你从未真正告诉过pyglet关于新时钟实例
c
。相反,pyglet将使用它自己创建的实例。看看这个source code for pyglet from the clock module…:当pyglet启动时,它创建自己的时钟实例(称为
_default
)。如果您想使用自己的,您需要使用set_default()
来替换它。因此,您可能需要首先修复以下代码:……或者。。。在
上面的第二个例子毫无意义:pyglet已经给了你一个Clock的实例,所以你只需要复制pyglet已经为你做过的事情。不管怎样,你最终都会在pyglet使用的时钟上调度回调。在
所以,现在应该有意义了,是的,您确实需要调用
set_default()
。这就是告诉pyglet使用您的对象,而不是它默认使用的对象。现在,您可以将这个set_default()
调用放在当前的位置(在构造函数中)。然而,这样做可能更有意义。。。在编辑:
对于为什么要在构造函数之外执行此操作的问题:
首先,一般来说,构造函数应该只用于构造对象。通过添加set_default,不仅可以构造对象,还可以更改其他实体(皮格莱特钟模块)。这会引起混乱,我将在下面展示。假设我写的代码是这样的。。。在
在这个例子中,我以前实现了两种不同的时钟类型:}。
^{8}$NewClock
和{UnpausedClock
只考虑游戏未暂停时的时间流逝。如果我把set_default()
放在这两个新类的构造函数中,那么UnpausedClock
将成为新的默认时钟(我不想要)。通过不将set_default()
放入构造函数中,而是执行以下操作:我的代码更明确,也不那么混乱。在
当然,无论哪种方式,代码都可以工作,但是我觉得在构造函数之外使用set_default可以让您在以后需要时更灵活地使用该类。在
相关问题 更多 >
编程相关推荐