Python-Pygame-为什么没有检测到冲突?

时间:2019-05-11 13:25:02

标签: python pygame collision

我有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 :(得分:0)

PyGame中的Sprite冲突基于Sprite的rect成员。

因此,给定两个sprite,代码将针对sprite1.rectsprite2.rect进行检查,以发现坐标重叠。

子画面的self.rect需要在其移动时更新其xy的坐标,以便反映位图在屏幕上的移动。

据我从OP的代码可以看出,rect.xrect.y不会被更新,因此,比较将永远永远停留在0,0上。

要使用蒙版碰撞,精灵还需要定义.mask图像,可以很容易地从具有透明性的图像中生成图像:

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

据我所知,OP中的Sprite代码不包含掩码,因此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

显然,位图参数需要具有一定的透明度,否则,掩码将毫无意义地浪费CPU。