Столкновение спрайтовой маски не работает - PullRequest
0 голосов
/ 18 января 2019

Столкновение работает, когда я использую:

pygame.sprite.collide_rect 

но это не работает, когда я использую:

pygame.sprite.collide_mask 

Вот мои 2 класса:

class Ball():
    def __init__(self):
        self.rect = balltexture.get_rect()
        self.rect.x=225
        self.rect.y=400
        self.radius = 100
        self.velx=0
        self.vely=0
        self.action=False
        self.switchx=0
        self.switchy=0        
        pygame.sprite.Sprite.__init__(self)
        self.mask = pygame.mask.from_surface(balltexture)
    def draw(self):
        win.blit(balltexture, self.rect)


class rock():
    def __init__(self, y):
        self.rect = rocktexture.get_rect()
        self.rect.x = screensize.current_w
        self.rect.y = y
        self.width = 120
        pygame.sprite.Sprite.__init__(self)
        self.mask = pygame.mask.from_surface(rocktexture)


    def draw(self, win):
        win.blit(rocktexture, self.rect)

и вот проверка столкновения

for i in rocks:
    if pygame.sprite.collide_rect(i, Player):
        print(1)
        if pygame.sprite.collide_mask(i, Player):
            print(2)

Поэтому, когда они сталкиваются, он печатает 1 все время.

Кстати, я перемещаю прямоугольные координаты (например, Player.rect.x), чтобы переместить игрока / камни, и я также попробовал метод наложения маски, но он тоже не сработал

offset = (Player.rect.x-i.rect.x, Player.rect.y-i.rect.y)
if i.mask.overlap(Player.mask, offset):
    print(2)

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Одно из моих изображений не имело прозрачности, вот в чем проблема

0 голосов
/ 22 января 2019

Не совсем уверен, что происходит, но вот несколько вещей, которые нужно попробовать:

Вы можете установить маску для всех единиц с помощью self.mask.fill (). На этом этапе столкновение маски должно быть идентичным столкновению на основе прямоугольника.

Вы можете вызвать print (self.mask.count ()), которая покажет количество установленных пикселей. Убедитесь, что это не 0 или что-то еще.

Вы можете вызвать i.mask.overlap (Player.mask (0, 0)) и подтвердить, что они перекрываются, когда имеют одинаковый верхний левый угол.

Это может быть проблемой при создании маски, или смещения в некотором роде неверны; это должно сузить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...