Python - Pygame - 为什么没有检测到碰撞?

标签 python pygame collision

我有 2 个 Sprite ,每个 Sprite 都在不同的 pygame.sprite.Group() 中,并且有 rect.x 和 rect.y。然而,当我试图检测它们之间的碰撞时,没有结果。除了使用 pygame.sprite.collide_mask 之外,它只检测第一次碰撞,而不检测其他碰撞。 虽然 Sprite 在屏幕中发生了碰撞。 测试冲突的函数是线程。我尝试过许多 pygame 碰撞功能,例如 pygame.sprite.collide_mask、pygame.sprite.spritecollideany()、。 。 .没有结果。

当我打印这些组中每个 Sprite 的自身时,它会打印出它们都是 Sprite :

<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')

预期结果是检测到碰撞。

最佳答案

PyGame 中的 Sprite 碰撞基于 Sprite 的 rect成员。

因此,给定两个 Sprite ,代码将检查 sprite1.rect反对sprite2.rect对于重叠坐标。

Sprite 的self.rect需要有它的 xy坐标在移动时更新,以便反射(reflect)位图在屏幕上的任何移动。

据我从OP的代码中可以看出,rect.xrect.y未更新,因此比较始终位于 0,0 ,永远。

要使用 mask 碰撞, Sprite 还需要定义 .mask图像,可以很容易地从具有透明度的图像生成:

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

据我所知,OP中的 Sprite 代码包含掩码,因此pygame.sprite.collide_mask()不会工作。

这是一个示例 Sprite 类:

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

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

关于Python - Pygame - 为什么没有检测到碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090758/

相关文章:

c++ - 挣扎于碰撞检测。如何正确检测碰撞?

python - 从计算机 visio 调用 ocr api 时没有得到预期结果

python - 如何更有效地求平方和?

Python 和 Pygame 循环不递增

python - 运行字符串中包含的 Python 代码

button - Godot:检测按下的鼠标是否在按钮上方

python - raspberry pi 和 teensy 之间的串行通信(使用 UART/GPIO 引脚)

python - 不可变列表属性

python - pygame双显示器和全屏

ios - 如何知道哪个 SKSpriteNode 受到 Swift 中碰撞检测的影响?