首页 > 解决方案 > Pyglet 3.7 中的 Sprite 子类化

问题描述

在带有 Pyglet 1.5.2 的 python 3.7.7 中,我试图从 pyglet 的 Sprite 继承

但是,如果我输入图像 x, y,它们是初始化 sprite 类所需的前 3 个参数。它会立即收集垃圾

我想继承 pyglet 的 Sprite 而不会发生这种情况

class BaseEntity(pyglet.sprite.Sprite):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

解决这个问题的唯一方法是不继承类并在对象内部创建精灵

class BaseEntity:
    def __init__(self, *args, **kwargs):
        # This works because the sprite object is referenced, so it won't be GC'd
        # I don't want to do this though
        self.Sprite = pyglet.sprite.Sprite(*args, **kwargs)

有没有一种解决方案可以防止必须执行以下操作?

标签: python-3.xpyglet

解决方案


所以这对我有用,这就是我设置继承精灵的方式。
默认情况下,如果没有指定批处理,我将创建一个批处理,这有时会有所帮助。

class genericSprite(pyglet.sprite.Sprite):
    def __init__(self, image, *args, **kwargs):
        if not 'batch' in kwargs: kwargs['batch'] = pyglet.graphics.Batch()
        if not 'x' in kwargs: kwargs['x'] = 0
        if not 'y' in kwargs: kwargs['y'] = 0

        self.texture = pyglet.image.load(image)

        pyglet.sprite.Sprite.__init__(self, self.texture, **kwargs)

    def render(self):
        self.batch.draw()

我对这段代码的垃圾收集没有任何问题。现在,我运行了您的代码,但无法重现该问题,因此我怀疑这与您设置BaseEntity呼叫的方式有关。因此,如果这对您不起作用(我还建议将 Python 和 Pyglet 更新到今天的最新版本),请发表评论并编辑您的问题以显示您如何初始化您的类。


推荐阅读