Пиглет Субклассинг Спрайт в 3.7 - PullRequest
0 голосов
/ 27 марта 2020

В python 3.7.7 с Pyglet 1.5.2 Я пытаюсь наследовать от Sprite Pyglet

, однако, если я ввожу изображение, x, y, которые являются первыми 3 аргументами, необходимыми для инициации спрайта учебный класс. Он сразу же собирает мусор

Я хочу унаследовать спрайт Пиглета без этого

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

. Единственный способ выяснить эту проблему - не унаследовать класс и создать спрайт внутри object

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)

Есть ли решение, чтобы избежать необходимости делать то, что ниже?

1 Ответ

0 голосов
/ 30 апреля 2020

Так что это работает для меня, и вот как я настраиваю унаследованный спрайт.
По умолчанию я создам пакет, если не был указан, который иногда помогал немного.

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 до последней на сегодня версии) , оставьте комментарий и отредактируйте свой вопрос, чтобы показать, как вы инициализируете свой класс .

...