Как добавить подкласс в группу спрайтов в Pygame - PullRequest
2 голосов
/ 28 апреля 2020

У меня есть базовый класс с именем 'Block', в котором для групп спрайтов заданы game.all_sprites и game.blocks. У меня есть 'ground' подкласс, унаследованный от класса блока, но я не могу получить основания для изменения групп спрайтов. Кто-нибудь знает как это сделать? Класс блока:

class Block(pygame.sprite.Sprite):
    def __init__(self, game, x, y, collidable=True):
        self.groups = game.all_sprites, game.blocks
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.game = game
        self.image = pygame.Surface((SCALE, SCALE))
        self.rect = self.image.get_rect()
        self.x = x
        self.y = y
        self.collidable = collidable

    def update(self):
        self.rect.x = self.x * SCALE
        self.rect.y = self.y * SCALE

Класс земли:

class Ground(Block):
    def __init__(self, game, x, y, collidable=False):
        self.groups = game.all_sprites, game.grounds
        Block.__init__(self, game, x, y, collidable)

Спасибо!

1 Ответ

2 голосов
/ 28 апреля 2020

Вы можете использовать метод, который вы можете переопределить, чтобы определить группы:

class Block(pygame.sprite.Sprite):
    def __init__(self, game, x, y, collidable=True):
        pygame.sprite.Sprite.__init__(self, self.get_groups(game))
        self.game = game
        ...

    def get_groups(self, game):
        return game.all_sprites, game.blocks


class Ground(Block):

    def __init__(self, game, x, y, collidable=False):
        Block.__init__(self, game, x, y, collidable)

    def get_groups(self, game):
        return game.all_sprites, game.grounds

или сохранить имена атрибутов групп спрайтов в качестве атрибута класса и динамически искать их, например:

class Block(pygame.sprite.Sprite):
    groups = ['all_sprites', 'blocks']

    def __init__(self, game, x, y, collidable=True):
        pygame.sprite.Sprite.__init__(self, (getattr(game, g) for g in self.groups))
        self.game = game
        ...


class Ground(Block):
    groups = ['all_sprites', 'grounds']

    def __init__(self, game, x, y, collidable=False):
        Block.__init__(self, game, x, y, collidable)

или передать группы в качестве параметра из подкласса в родительский класс:

class Block(pygame.sprite.Sprite):
    def __init__(self, game, x, y, collidable=True, groups=None):
        pygame.sprite.Sprite.__init__(self, groups or (game.all_sprites, game.blocks))
        self.game = game
        ...


class Ground(Block):

    def __init__(self, game, x, y, collidable=False, groups=None):
        Block.__init__(self, game, x, y, collidable, groups or (game.all_sprites, game.grounds))

На самом деле возможности безграничны:

class Block(pygame.sprite.Sprite):
    def __init__(self, game, x, y, collidable=True):
        groups = game.all_sprites, getattr(game, self.__class__.__name__.lower() + 's')
        pygame.sprite.Sprite.__init__(self, groups)
        self.game = game
        ...

Я бы, наверное, используйте вариант 3, потому что он явный и в нем нет причудливых умных частей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...