Как использовать группы спрайтов в pygame

Итак, я добрался до точки в моей программе, где мне нужно создать группу для некоторых спрайтов, с которыми игрок может столкнуться, не умирая (как и некоторые другие спрайты, которые у меня могут быть на экране).

Я просмотрел Google, но похоже, что официальная документация pygame бесполезна и / или трудна для понимания. Я ищу немного помощи от тех, кто знает немного об этом.

во-первых, мне нужно узнать, как создать группу. Идет ли он в начальном настройки игры?

затем добавление спрайта в группу при ее создании. Сайт pygame имеет это сказать по этому вопросу:

Sprite.add(*groups)

Так... как это использовать? Допустим у меня есть спрайт по имени Перл. Мне нужно добавить gem в группу gems. Это:

gem = Sprite.add(gems)

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

кроме того, я хотел бы иметь возможность редактировать атрибуты для определенной группы. Это делается путем определения группы как я класс? Или это то, что я определяю в определении существующего спрайта, но если спрайт в группе?

4 ответов


чтобы ответить на ваш первый вопрос; чтобы создать группу, вы сделали бы что-то вроде этого:

gems = pygame.sprite.Group()

затем добавить спрайт:

gems.add(gem)

Что касается атрибутов для группы, которую вы хотите отредактировать, это зависит от того, что они собой представляют. Например, вы можете определить что-то вроде этого, чтобы указать направление группы:

gems.direction = 'up'

Я знаю, что на этот вопрос уже дан ответ, но лучший метод-это то, что предложил кельвинфк. Я уточню, чтобы было понятнее.

# First, create you group
gems = pygame.sprite.Group()

class Jewel (pygame.sprite.Sprite): # Inherit from the Sprite
    def __init__ (self, *args): # Call the constructor with whatever arguments...
        # This next part is key. You call the super constructor, and pass in the 
        # group you've created and it is automatically added to the group every 
        # time you create an instance of this class
        pygame.sprite.Sprite.__init__(self, gems) 

        # rest of class stuff after this.

>>> ruby = Jewel()  
>>> diamond = Jewel()  
>>> coal = Jewel()

# All three are now in the group gems. 
>>> gems.sprites()
[<Jewel sprite(in 1 groups)>, <Jewel sprite(in 1 groups)>, <Jewel sprite(in 1 groups)>]

вы также можете добавить больше с gems.add(some_sprite) и аналогично удалите их с помощью gems.remove(some_sprite).


просто позвоните супер __init__ функция со списком групп. Например:

def __init__(self):
    pygame.sprite.Sprite.__init__(self, self.groups)

затем в каждом классе вашей иерархии вы должны определить атрибут self.группы и супер конструктор сделают работу по добавлению каждого экземпляра в свои группы. На мой взгляд, это самое чистое решение. В противном случае просто вызовите супер конструктор явно со списком групп в каждом классе.


проще, но вы можете передать спрайты непосредственно в конструктор:

gems = pygame.sprite.Group(gem1, gem2)