Использовать функцию маски (для обнаружения столкновений) с несколькими спрайтами - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в Pygame и создаю игру для своего уровня A-level. Я пытаюсь иметь несколько летучих мышей, с которыми я могу порождаться и сталкиваться. Я использую функцию маски Pygames для «идеального столкновения с пикселями», но я не могу одновременно создать несколько бит, с работающей системой столкновений. Я пытался использовать группы, но я не смог заставить это работать. Кто-нибудь знает, как исправить мой код / ​​лучше обойти эту проблему? Спасибо! Соответствующий код ниже ...

class Bat(pygame.sprite.Sprite):
    def __init__(self, bat_x, bat_y):
        pygame.sprite.Sprite.__init__(self)
        self.bat1 = pygame.image.load("Sprites\Bat_enemy\Bat-1.png").convert_alpha() # For hit registration for bat
        self.bat1 = pygame.transform.scale(self.bat1, (80, 70))
        self.bat_mask = pygame.mask.from_surface(self.bat1)
        self.bat_rect = self.bat1.get_rect()
        self.bat_x = bat_x
        self.bat_y = bat_y
    bats = pygame.sprite.Group()

Затем в основном l oop:

num_of_bats = [1]

#Bat#
for i in num_of_bats:
    bat_x = (random.randint(0, 600))
    bat_y = (random.randint(0, 600))
    bat = Bat(bat_x, bat_y, i)
    bats.add(bat) 

for bat in bats:  
    offsetP2B = (int(x - batx), int(y - self.baty)) #Player to Bat
    resultP2B = bat_mask.overlap(player_mask, offsetP2B)

1 Ответ

1 голос
/ 27 марта 2020

Сначала запустите столкновение на основе прямоугольника, а затем беспокойтесь о точности битовой маски!

У вашего 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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...