Python - Pygame - почему коллизии не обнаружены? - PullRequest
1 голос
/ 11 мая 2019

У меня есть 2 спрайта, каждый из которых имеет свою собственную pygame.sprite.Group () и имеет rect.x и rect.y. Однако, когда я пытаюсь обнаружить столкновения между ними, нет никаких результатов. Помимо использования pygame.sprite.collide_mask, но он обнаруживает только первое столкновение, но не другие. Хотя спрайты сталкиваются на экране. Функции, которые проверяют столкновения, являются потоками. Я пробовал многие функции столкновений с pygame, такие как pygame.sprite.collide_mask, pygame.sprite.spritecollideany (),. , без результатов.

Когда я печатаю собственную личность каждого из спрайтов этих групп, он печатает, что все они являются спрайтами:

<attack1 sprite(in 1 groups)>

Основной код, который проверяет столкновения:

 class attack1(pygame.sprite.Sprite,threading.Thread):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        threading.Thread.__init__(self)
        self.image = self.imageAttack1.get_image(503 ,468 ,20 ,19)
        self.image  = pygame.transform.scale(self.image,(60,57)).convert_alpha()
        self.lsAttack1.append(self.image)
        self.rect = self.image.get_rect()

        self.rect.y = 0
        self.rect.x = 0
        vr.spriteGroupAttack1.add(self)
        self.start()

   def run(self):
        while vr.managementDisplay :
            self.result = pygame.sprite.spritecollide(self,vr.spriteGroupCaracter1,False)
            if self.result :
                print('Yes')

или с группами:

def run(self):
   while vr.managementDisplay :
        self.result = pygame.sprite.groupcollide(vr.spriteGroupAttack1,vr.spriteGroupCaracter1,False)
        if self.result :
            print('Yes')

или с pygame.sprite.collide_mask

def run(self):
   while vr.managementDisplay :
        self.result = pygame.sprite.collide_mask(self,vr.lsCaracter[0])
        if self.result :
            print('Yes')

Ожидаемый результат - обнаружение столкновения.

1 Ответ

0 голосов
/ 13 мая 2019

Столкновение спрайта в PyGame основано на элементе rect спрайта.

Таким образом, с учетом двух спрайтов код будет проверять sprite1.rect против sprite2.rect для перекрывающихся координат.

Спрайту self.rect необходимо иметь x и yкоординаты обновляются, когда он перемещается, так что он отражает любое движение растрового изображения на экране.

Насколько я могу судить по коду OP, rect.x и rect.y не обновляются,поэтому сравнение всегда будет на 0,0, навсегда.

Чтобы использовать маскированное столкновение, спрайт также должен определить .mask изображение, которое может быть сгенерировано из изображения с прозрачностью довольно легко:

self.mask = pygame.mask.from_surface( self.image )

Насколько я могу судить, код спрайта в OP не содержит маску, поэтому pygame.sprite.collide_mask() не будет работать.

Вот примеркласс спрайта:

class MaskedSprite( pygame.sprite.Sprite ):
    def __init__( self, bitmap ):
        pygame.sprite.Sprite.__init__( self )
        self.image       = bitmap
        self.mask        = pygame.mask.from_surface( self.image )
        self.rect        = self.image.get_rect()
        self.rect.x      = random.randrange( 0, WINDOW_WIDTH )
        self.rect.y      = random.randrange( 0, WINDOW_HEIGHT ) )

    def moveTo( self, x, y ):
        self.rect.x      = x
        self.rect.y      = y

    def update( self ):
        pass #TODO

Очевидно, что параметр bitmap должен иметь некоторую прозрачность, в противном случае маска является бессмысленной тратой ресурсов процессора.

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