pygame遮罩mask的本质


为了表示一张图片透明度分布情况,每个像素都多加了一个alpha值。所以我们常常看到用4元组表示的像素值。 即,在一个每像素透明度的surface中。像素值表示为(r,g,b,a)。如果a 的值为0,那么这个像素点渲染到其它surface上时将不会渲染。如果值为255,那么这个像素点将完全渲染到另一个surface上。如果介于0到255之间,则按比例进行渲染,从而我们就能看到半透明效果。

在Pygame模块中有遮罩这个概念,它的英文为mask,也可以叫做掩膜。它的设计目的是用来进行像素级别的碰撞检测的。我们把能接受“碰撞”的地方的mask的位设置为True,即1,把不能授受“碰撞”的mask的位设置为0。那么哪些地方能接受碰撞? 我们规定,透明的地方不接受碰撞,不透明的地方才接受碰撞。所以通过分析alpha值就能设置一张图片每个像素的mask值了。如果一张图片不是每像素模式,那么它可能设置了colorkey颜色。如果这个颜色和colorkey颜色相同,那么就把mask位设置为0,否则为1。为了获取每个位置的mask值,Pygame提供了get_at命令来得到位值或set_at命令来设置位值。它们的使用方法和surface几乎一样,在此不再赘述。我们可以把mask想像成蒙在图像上的薄膜,当然,透明的地方是不会蒙的。surface有宽高,所以mask也有宽高。

默认情况下,所谓的透明的地方指的是alpha值小于等于127。不透明的地方指的是alpha值大于127。这个127是一个阈值。在Pygame中有pygame.mask.from_surface命令。它能从一个surface创建一个mask。这个命令有两个参数,第一个就是surface,第二个是threshold,即阈值。如果一个surface所有像素的alpha值都是60,表示了这张图是一张比较透明的图。但由于在使用pygame.mask.frame_surface命令创建mask时把threshold设为了50,所以它的每一个mask位仍会被设置为1。这个“门槛”可真有点低啊。下面我们编个程序,实践一下。

下面还有好长好长好长,如需要查看完整教程及源代码,请扫码付款:

VIP免费查看

已有0人支付

本站所有作品,教程等皆为原创,盗版必究。一旦付款,表示同意本站知识付费原则:数字商品,不支持退款。亦可直接向微信号scratch8付款购买。QQ群免费教学群:225792826 (提供真实姓名可入群)
李兴球的博客_Python创意编程技术前沿 » pygame遮罩mask的本质
scratch

学本领,探索更大的世界!

李兴球博客 风火轮编程主页