Python Pygame получает атрибуты спрайта в группе спрайтов

#python #pygame #sprite

#python #pygame #спрайт

Вопрос:

TL; DR: Как получить атрибут объекта, который находится в группе спрайтов

У меня есть группа спрайтов под названием ‘all_bullets’. Я пытаюсь создать движок бумеранга, поэтому, когда я стреляю (нажимаю пробел), объект bullet будет добавлен в группу all_bullets (у меня уже есть класс, закодированный). Но я не хочу иметь возможность стрелять столько бумерангов, сколько смогу. Итак, я хочу создать объект маркера только тогда, когда в группе спрайтов нет бумеранга (объекта-маркера), поэтому я знаю, что на экране нет бумеранга. Но есть и другие маркеры. Как пистолет. Итак, я хочу знать, как получить атрибут .image объекта, который находится внутри группы спрайтов; в этой группе несколько объектов, поэтому просто ввести «bullet.image» не получится, я попробовал. Есть предложения? Заранее спасибо

Ответ №1:

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

Рассмотрим простой Bullet спрайт:

 class BulletSprite( pygame.sprite.Sprite ):
    def __init__( self, filename, from_point, to_point, speed=1 ):
        pygame.sprite.Sprite.__init__( self )
        self.image = pygame.image.load( filename ).convert_alpha()
        self.rect  = self.image.get_rect()
        self.speed = speed
        self.rect.center = ( from_point )
        self.x = from_point[0]
        self.y = from_point[1]
        #...
  

С помощью группы спрайтов:

 all_bullets = pygame.sprite.Group()

# Add some bullets
for i in range( 5 ):
    from_point = ( 0, WINDOW_HEIGHT//2 )              # middle left
    to_point   = ( WINDOW_WIDTH, 100 * i )            # somewhere right
    # create the bullet
    new_bullet = Bullet( 'bullet.png', from_point, to_point ) 
    all_bullets.add( to_point ) 

# and one more:
boomerang1 = Bullet( 'boomerang.png', ( 0, 0 ), ( WINDOW_WIDTH, WINDOW_HEIGHT ) )
all_bullets.add( boomerang1 )
  

Теперь абсолютно возможно выполнить итерацию по этому списку, используя / получая доступ к отдельным .image элементам спрайта:

 for bullet in all_bullets:                               # every sprite in the group
    window.blit( bullet.image, ( bullet.x, bullet.y ) )  # paint the image
  

Обратите внимание, что это, вероятно, не лучший способ сделать это, поскольку внутренние части объекта лучше оставить объекту для использования самому. Итак, в приведенном выше случае вы должны создать bullet.draw() функцию и вызвать ее для рисования image .

Комментарии:

1. Большое вам спасибо! Я совершенно забыл об итерации…