#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. Большое вам спасибо! Я совершенно забыл об итерации…