注意:我不想使用 pygame 精灵。
我正在制作一个简单的游戏,我需要一种方法来使用 pygame 中的像素完美碰撞来检测两个图像是否重叠。到目前为止,我找到的所有答案都要求我使用 pygame sprites,我不喜欢使用它,因为我对对象的控制较少。
(这些图像具有透明背景)
注意:我不想使用 pygame 精灵。
我正在制作一个简单的游戏,我需要一种方法来使用 pygame 中的像素完美碰撞来检测两个图像是否重叠。到目前为止,我找到的所有答案都要求我使用 pygame sprites,我不喜欢使用它,因为我对对象的控制较少。
(这些图像具有透明背景)
首先,不要害怕精灵。
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
中创建一个,并用于检查两个掩码是否重叠。Mask
Surface
pygame.mask.Mask.overlap
当你使用 Sprite 类时,它更容易使用,因为你可以使用像spritecollide
with一样的函数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))