Сначала запустите столкновение на основе прямоугольника, а затем беспокойтесь о точности битовой маски!
У вашего Sprite есть пара проблем. Самое важное, что PyGame использует sprite.image
для рисования растрового изображения. Ваш спрайт-код использует bat1
вместо. Также необходимо расположить sprite.rect
по координатам летучей мыши. Кроме того, маска столкновения должна называться mask
, а столкновение / позиция спрайта pygame.Rect
должна называться rect
.
Я не уверен, что это просто вставка, но определение группы спрайтов не должно быть внутри класса Sprite.
Итак ... с небольшими исправлениями:
class Bat(pygame.sprite.Sprite):
def __init__(self, bat_x, bat_y, bat_image):
pygame.sprite.Sprite.__init__(self)
self.image = bat_image
self.rect = self.image.get_rect()
self.mask = pygame.mask.from_surface( self.image )
self.rect.centre = ( bat_x, bat_y )
def update( self ):
# TODO: code to make this bat move/flat whatever
pass
Здесь есть только незначительные различия. Лучше загрузить изображение за один раз, вне класса спрайтов, чем загружать его сотни (?) Раз - один раз для каждой летучей мыши.
Теперь довольно легко создать колонию летучих мышей:
import os.path
START_BAT_COUNT = 30
BAT_IMAGE_PATH = os.path.join( 'Sprites', 'Bat_enemy', 'Bat-1.png' )
# group to hold all the bat sprites
all_bats = pygame.sprite.Group()
# Going Batty!
bat_image = pygame.image.load( BAT_IMAGE_PATH ).convert_alpha()
for i in range( START_BAT_COUNT ):
bat_x = (random.randint(0, 600))
bat_y = (random.randint(0, 600))
new_bat = Bat( bat_x, bat_y, bat_image )
all_bats.add( new_bat )
В вашей главной л oop:
# move every bat
all_bats.update()
...
# paint every bat
all_bats.draw( screen )