如何在Pyglet中对时钟进行子类化?

2024-05-19 08:10:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把时钟类皮格莱特钟模块,但我在使用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_默认值(自我)线?在


Tags: 方法testselfinitdefdtupdate时钟
1条回答
网友
1楼 · 发布于 2024-05-19 08:10:50

但我想我没用过:

你快到了。您的第一个实现可能不起作用的原因是以下几行:

c = pyglet.clock.Clock()
c.schedule_interval(t.update, 1/60.0)

在这里,您正在创建一个新的时钟实例,并计划对其进行回调。然而,实际上,您并没有将时钟实例与pyglet关联起来。所以,当你跑的时候。。。在

^{pr2}$

…你从未真正告诉过pyglet关于新时钟实例c。相反,pyglet将使用它自己创建的实例。看看这个source code for pyglet from the clock module…:

# Default clock.
_default = Clock()

def set_default(default):
    '''Set the default clock to use for all module-level functions.

    By default an instance of `Clock` is used.

    :Parameters:
        `default` : `Clock`
            The default clock to use.
    '''
    global _default
    _default = default

def get_default():
    '''Return the `Clock` instance that is used by all module-level
    clock functions.

    :rtype: `Clock`
    :return: The default clock.

当pyglet启动时,它创建自己的时钟实例(称为_default)。如果您想使用自己的,您需要使用set_default()来替换它。因此,您可能需要首先修复以下代码:

c = pyglet.clock.get_default()
c.schedule_interval(t.update, 1/60.0)

……或者。。。在

c = pyglet.clock.Clock()
pyglet.clock.set_default(c)
c.schedule_interval(t.update, 1/60.0)

上面的第二个例子毫无意义:pyglet已经给了你一个Clock的实例,所以你只需要复制pyglet已经为你做过的事情。不管怎样,你最终都会在pyglet使用的时钟上调度回调。在

所以,现在应该有意义了,是的,您确实需要调用set_default()。这就是告诉pyglet使用您的对象,而不是它默认使用的对象。现在,您可以将这个set_default()调用放在当前的位置(在构造函数中)。然而,这样做可能更有意义。。。在

class Clock(pyglet.clock.Clock):
    def __init__(self):
        super(Clock, self).__init__()

...

c = Clock()
pyglet.clock.set_default(c)

编辑

对于为什么要在构造函数之外执行此操作的问题:

首先,一般来说,构造函数应该只用于构造对象。通过添加set_default,不仅可以构造对象,还可以更改其他实体(皮格莱特钟模块)。这会引起混乱,我将在下面展示。假设我写的代码是这样的。。。在

c = MyClock()
c2 = UnpausedClock()

在这个例子中,我以前实现了两种不同的时钟类型:NewClock和{}。UnpausedClock只考虑游戏未暂停时的时间流逝。如果我把set_default()放在这两个新类的构造函数中,那么UnpausedClock将成为新的默认时钟(我不想要)。通过不将set_default()放入构造函数中,而是执行以下操作:

^{8}$

我的代码更明确,也不那么混乱。在

当然,无论哪种方式,代码都可以工作,但是我觉得在构造函数之外使用set_default可以让您在以后需要时更灵活地使用该类。在

相关问题 更多 >

    热门问题