Что делает pygame.sprite.Group()?

avatar
GitCalydryl
13 августа 2021 в 02:03
325
1
1

Я смотрю видео о pygame и вижу этот код

crosshair = pygame.sprite.Group()

Кто-нибудь может мне это объяснить?

Источник
kkgarg
14 августа 2021 в 19:40
0

Вы можете погуглить, SO - не тот форум для таких вопросов. См. Как задать хороший вопрос

Ответы (1)

avatar
Rabbid76
13 августа 2021 в 06:31
2

Прочитайте документацию pygame.sprite.Group.

pygame.sprite.Group.update() и pygame.sprite.Group.draw() — это методы, предоставляемые <3901278000>3212>. Первый делегирует метод update содержащегося pygame.sprite.Sprites — вы должны реализовать этот метод.

pygame.sprite.Group.update()

Вызывает метод update() для всех спрайтов в группе.

Последний использует атрибуты image и rect содержащихся pygame.sprite.Sprite для рисования объектов - вы должны убедиться, что pygame.sprite.Sprite имеют необходимые атрибуты

pygame.sprite.Group.draw()

Рисует содержащиеся спрайты в аргументе Surface. При этом используется атрибут Sprite.image для исходной поверхности и Sprite.rect для положения.

Спрайты в Группах можно удалить и, таким образом, уничтожить, вызвав pygame.sprite.Sprite.kill<39003276>. Когда на объект больше не ссылаются, он уничтожается:

.

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

См. также Группы спрайтов


Минимальный пример:

import pygame

class Player(pygame.sprite.Sprite):
    def __init__(self, center_pos):
        super().__init__() 
        self.image = pygame.Surface((40, 40))
        self.image.fill((255, 255, 0))
        self.rect = self.image.get_rect(center = center_pos)

class Bullet(pygame.sprite.Sprite):
    def __init__(self, center_pos):
        super().__init__() 
        self.image = pygame.Surface((20, 10))
        self.image.fill((0, 255, 255))
        self.rect = self.image.get_rect(center = center_pos)
    
    def update(self):
        self.rect.x += 10
        if self.rect.right > 300:
            self.kill()

pygame.init()
window = pygame.display.set_mode((400, 300))
clock = pygame.time.Clock()

player = Player((25, window.get_height() // 2))
all_sprites = pygame.sprite.Group(player)

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                all_sprites.add(Bullet(player.rect.center))

    all_sprites.update()
    print(len(all_sprites))

    window.fill(0)
    pygame.draw.rect(window, (255, 0, 0), (300, 0, 10, window.get_height()))
    all_sprites.draw(window)
    pygame.display.flip()

pygame.quit()
exit()