Pygame 掩码 Python

问题描述

所以在教程中学习如何使用 pygame 制作游戏并且该游戏需要碰撞,所以他们创建了 pygame 遮罩对象,但我不明白为什么要检查两个对象之间的碰撞,我们需要找到 x 和y 坐标有人可以解释我为什么我们需要两个对象之间的 x 和 y 坐标距离

这里是代码碰撞函数

def collide(obj1,obj2):
    offset_x = obj2.x - obj1.x
    offset_y = obj2.y - obj1.y
    return obj1.mask.overlap(obj2.mask,(offset_x,offset_y)) != None # (x,y) it will return if collison else false

谁能给我解释一下 pygame 中掩码系统如何工作的逻辑以及我们为什么需要 offset_x,offset_y

解决方法

蒙版是根据图像创建的。掩码只是一个带有布尔值的网格。掩码中的一个字段对应于表面中的一个像素。如果为True,则对应图像中的像素属于彩色精灵。如果 False,则对应图像中的像素属于背景。 pygame.mask.Mask 对象没有位置。
pygame.mask.Mask.overlap 方法检查对象放置在屏幕上时是否重叠。由于对象不会完全放置在同一位置,因此您需要指定偏移量。请参阅 PyGame collision with masks is not workingCollision between masks in PyGame

+---------------+
| mask 1   .    |
|         oy    |
|          .    |
|... ox ...+-------------+
|          |    |        |
|          |    |        |
+----------|----+        |
           |             |
           | mask 2      |
           +-------------+

oxoffset_x
oyoffset_y

最小示例: repl.it/@Rabbid76/PyGame-SurfaceMaskIntersect

另见:Mask


当您使用 pygame.sprite.Sprite 对象时,您不需要计算偏移量。您可以使用 pygame.sprite.collide_mask,它计算 .rect 属性的偏移量。请参阅 How can I made a collision mask?Pygame mask collision

最小示例: repl.it/@Rabbid76/PyGame-SpriteMask

另见Sprite mask