0

注意:我不想使用 pygame 精灵。

我正在制作一个简单的游戏,我需要一种方法来使用 pygame 中的像素完美碰撞来检测两个图像是否重叠。到目前为止,我找到的所有答案都要求我使用 pygame sprites,我不喜欢使用它,因为我对对象的控制较少。

(这些图像具有透明背景)

4

1 回答 1

3

首先,不要害怕精灵。

ASprite只是一个简单的类,其中包含一个图像(aSurface存储在image属性中)以及图像的大小和位置(aRect存储在 rect 属性中)。

因此,当您使用这样的类时:

class Player:
    def __init__(self, image, pos):
        self.image = image
        self.pos = pos

    def draw(self, screen):
        screen.blit(self.image, self.pos)

您可以简单地使用Sprite该类,因为不会有太大变化:

class Player(pygame.sprite.Sprite):
    def __init__(self, image, pos):
        super().__init__()
        self.image = image
        self.rect = image.get_rect(center=pos)

相反,它变得更简单了,因为我们可以让 pygame 处理将图像传送到屏幕上。

因此,要使用像素完美碰撞,您可以使用 pygame 的Mask类。用于从您的pygame.mask.from_surface中创建一个,并用于检查两个掩码是否重叠。MaskSurfacepygame.mask.Mask.overlap

当你使用 Sprite 类时,它更容易使用,因为你可以使用像spritecollidewith一样的函数collide_mask

但是如果您不想使用Sprite该类,只需查看如何collide_mask实现即可了解如何使用掩码:

def collide_mask(left, right):
    xoffset = right.rect[0] - left.rect[0]
    yoffset = right.rect[1] - left.rect[1]
    try:
        leftmask = left.mask
    except AttributeError:
        leftmask = from_surface(left.image)
    try:
        rightmask = right.mask
    except AttributeError:
        rightmask = from_surface(right.image)
    return leftmask.overlap(rightmask, (xoffset, yoffset))
于 2020-06-16T08:23:38.680 回答