Pygame详解(十八):mask 模块

pygame.mask

Pygame 中处理图形遮罩的模块。

函数

  • pygame.mask.from_surface()  ——  从指定 Surface 对象中返回一个 Mask
  • pygame.mask.from_threshold()  ——  从给定阈值的 Surface 对象中创建一个 Mask

  • pygame.mask.Mask  ——   用于表示 2d 位掩码(遮罩)的 Pygame 对象

用于快速实现完美的碰撞检测,Mask 可以精确到 1 个像素级别的判断。

Pygame 1.8 新增加的。

函数详解

pygame.mask.from_surface()

从指定 Surface 对象中返回一个 Mask。

from_surface(Surface, threshold = 127) -> Mask

Surface 对象中透明的部分设置为 1,不透明部分设置为 0。

检查每个像素的 alpha 值是否大于 threshold 参数指定的值。(alpha 通道使用 0 ~ 255 描述像素的透明度)

如果 Surface 对象是基于 colorkeys 实现的透明(而不是基于 pixel alphas),则忽略 threshold 参数。

注:关于 Surface 对象的透明实现,可参考:Pygame详解(十二):Surface 对象

pygame.mask.from_threshold()

从给定阈值的 Surface 对象中创建一个 Mask。

from_threshold(Surface, color, threshold = (0,0,0,255), othersurface = None, palette_colors = 1) -> Mask

从 Surface 对象中获取 Mask,这个方法更有特色。如果只提供一个 Surface 对象,那么 Surface 对象中所有与 threshold 参数提供颜色匹配的像素均被选入 Mask 中。如果指定了 othersurface 可选参数,那么被选入 Mask 中的像素不仅需要与 threshold 参数提供颜色匹配,还需要包含在 othersurface 指定的 Surface 对象中。

class pygame.mask.Mask

用于表示 2d 位掩码(遮罩)的 Pygame 对象。

Mask((width, height)) -> Mask

方法

  • pygame.mask.Mask.get_size()  ——  返回 Mask 的大小
  • pygame.mask.Mask.get_at()  ——  如果像素 (x, y) 被设置,返回值是非 0
  • pygame.mask.Mask.set_at()  ——  设置 Mask 中给定位置的值
  • pygame.mask.Mask.overlap()  ——  返回两个 Mask 在指定偏移处的重叠坐标(如果没有返回 None)
  • pygame.mask.Mask.overlap_area()  ——  返回两个 Mask 重叠的像素数量
  • pygame.mask.Mask.overlap_mask()  ——  将两个 Mask 重叠的部分创建一个新的 Mask
  • pygame.mask.Mask.fill()  ——  将所有的位设置为 1
  • pygame.mask.Mask.clear()  ——  将所有的位设置为 0
  • pygame.mask.Mask.invert()  ——  翻转 Mask 中所有的位(0 变 1,1 变 0)
  • pygame.mask.Mask.scale()  ——  缩放 Mask 的尺寸
  • pygame.mask.Mask.draw()  ——  将 Mask 绘制到另一个 Mask 上边
  • pygame.mask.Mask.erase()  ——  用另一个 Mask 擦除 Mask
  • pygame.mask.Mask.count()  ——  返回 Mask 被设置(为 1)的像素的数量
  • pygame.mask.Mask.centroid()  ——  返回 Mask 的重心点
  • pygame.mask.Mask.angle()  ——  返回像素的方向
  • pygame.mask.Mask.outline()  ——  用列表的形式返回组成对象轮廓的点
  • pygame.mask.Mask.convolve()  ——  返回其它 Mask 的卷积
  • pygame.mask.Mask.connected_component()  ——  返回与某像素区域的连接的 Mask
  • pygame.mask.Mask.connected_components()  ——  返回一组连接某像素区域的 Mask 的列表
  • pygame.mask.Mask.get_bounding_rects()  ——  返回一组像素边界矩形的列表

方法详解

pygame.mask.Mask.get_size()

返回 Mask 的大小。

get_size() -> width,height

pygame.mask.Mask.get_at()

如果像素 (x, y) 被设置,返回值是非 0。

get_at((x,y)) -> int

跟 Surface 对象一样,(0, 0) 表示左上角坐标。

pygame.mask.Mask.set_at()

设置 Mask 中给定位置的值。

set_at((x,y),value) -> None

pygame.mask.Mask.overlap()

返回两个 Mask 在指定偏移处的重叠坐标(如果没有返回 None)。

overlap(othermask, offset) -> x,y

重叠检测的偏移原理如下(偏移可以为负数):

+----+----------..
|A   | yoffset
|  +-+----------..
+--|B
|xoffset
|  |
:  :

pygame.mask.Mask.overlap_area()

返回两个 Mask 重叠的像素数量。

overlap_area(othermask, offset) -> numpixels

返回两个 Mask 重叠的像素数量,这可以用于查看在某方向上发生碰撞的部分,或者查看两个 Mask 有多少部分发生碰撞。相似的碰撞一般会通过计算重叠部分的梯度差分被发现。

dx = Mask.overlap_area(othermask,(x+1,y)) - Mask.overlap_area(othermask,(x-1,y))
dy = Mask.overlap_area(othermask,(x,y+1)) - Mask.overlap_area(othermask,(x,y-1))

pygame.mask.Mask.overlap_mask()

将两个 Mask 重叠的部分创建一个新的 Mask。

overlap_mask(othermask, offset) -> Mask

返回的 Mask 尺寸是原始 Mask 和 othermask 参数指定的 Mask 重叠部分。

pygame.mask.Mask.fill()

将所有的位设置为 1。

fill() -> None

将 Mask 中所有的位设置为 1。

pygame.mask.Mask.clear()

将所有的位设置为 0。

clear() -> None

将 Mask 中所有的位设置为 0。

pygame.mask.Mask.invert()

翻转 Mask 中所有的位(0 变 1,1 变 0)。

invert() -> None

翻转 Mask 中所有的位(0 变 1,1 变 0)。

pygame.mask.Mask.scale()

缩放 Mask 的尺寸。

scale((x, y)) -> Mask

Mask 根据指定尺寸缩放后返回一个新的 Mask。

pygame.mask.Mask.draw

将 Mask 绘制到另一个 Mask 上边。

draw(othermask, offset) -> None

将 Mask 绘制到另一个 Mask 上边,执行的是按位 or 操作。

pygame.mask.Mask.erase()

用另一个 Mask 擦除 Mask。

erase(othermask, offset) -> None

从 Mask 上擦除 othermask 指定的像素。

pygame.mask.Mask.count()

返回 Mask 被设置(为 1)的像素的数量。

count() -> pixels

返回 Mask 被设置(为 1)的像素的数量。

pygame.mask.Mask.centroid()

返回 Mask 的重心点。

centroid() -> (x, y)

找到 Mask 的重心点。如果 Mask 是空的,那么返回值是 (0, 0)。

pygame.mask.Mask.angle()

返回像素的方向。

angle() -> theta

找到图像中像素的大致方向(-90 度 ~ 90 度),这对于实现像素对接很有用。如果 Mask 是空的,那么返回值是 0.0。

pygame.mask.Mask.outline()

用列表的形式返回组成对象轮廓的点。

outline(every = 1) -> [(x,y), (x,y) ...]

返回值是一个由点组成的列表,用于描绘穿过 Mask 的第一个对象的轮廓线。

every 可选参数用于设置点的跨度,默认是每 1 个像素。

pygame.mask.Mask.convolve()

返回其它 Mask 的卷积。

convolve(othermask, outputmask=None, offset=(0,0)) -> Mask

返回一个由位组 (i-offset[0], j-offset[1]) 组成的 Mask,如果转换的 othermask 参数在右下角 (i, j) 处,那么会与自身重叠。

如果 outputmask 参数被指定,那么就会在 outputmask 参数上进行绘制,outputmask 参数会被返回。否则这个 Mask 的大小是 self.get_size() + othermask.get_size() - (1, 1)。

pygame.mask.Mask.connected_component()

返回与某像素区域的连接的 Mask。

connected_component((x,y) = None) -> Mask

它会使用 SAUF 算法进行连接需要连接的 Mask。它会连通 8 个点。默认情况下,它会返回在连接图像中最大的 Mask。可选项: 一对指定的坐标,与其相连的组件会被返回。如果像素位置没有被设置,那么返回的这个 Mask 就是空的。这个 Mask 的大小会与原始 Mask 一样。

pygame.mask.Mask.connected_components()

返回一组连接某像素区域的 Mask 的列表。

connected_components(min = 0) -> [Masks]

返回一组连接某像素区的 Mask 的列表。min 可选参数用于对每个连接区的指定部分过滤噪点。

pygame.mask.Mask.get_bounding_rects()

返回一组像素边界矩形的列表。

get_bounding_rects() -> Rects

它会获取连接着像素块的边界矩形。每个边界矩形都是一个连接每个像素的内矩形。

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值