"""
mask测试,mask就是膜或罩的意思,可以从一个图片创建一个mask,但要转换alpha的,否则就失去了意义.
我们可以想像给一个透明的图片覆一层膜,也就是mask,但是透明的地方这层膜是不会覆盖的。
mask.overlap的offset偏移量是设置两个mask之间的x和y距离。例:
Amask是一个迷宫的mask,Bmask是一个小球的mask
那么
Amask.overlap(Bmask,offset) 会返回交叉点的坐标,Amask.overlap_area方法会返回交叉了多少像素。
offset的值是(Bmask.x - Amask.x,Bmask.y - Amask.y)
当我们操作这个小球,小球在迷宫中移动时,就可以用Amask.overlap检测小球是否碰到了迷宫的“墙壁”。
根据返回的像素点,判断其所在面的颜色,还能进一步进行颜色判断。
"""
import pygame
from pygame import *
pygame.init()
screen = pygame.display.set_mode((480,360))
pygame.display.set_caption("pygame的mask测试_作者:李兴球")
小红块 = pygame.image.load("小红块.png").convert_alpha()
小红块rect = 小红块.get_rect()
测试图 = pygame.image.load("测试图.png").convert_alpha()
测试图rect = 测试图.get_rect()
小红块mask = pygame.mask.from_surface(小红块)
测试图mask = pygame.mask.from_surface(测试图)
while True:
for event in pygame.event.get():
if event.type ==QUIT:pygame.quit()
if event.type == KEYDOWN:
if event.key ==K_RIGHT:
小红块rect.x = 小红块rect.x + 10
if event.key ==K_LEFT:
小红块rect.x = 小红块rect.x -10
if event.key ==K_UP:
小红块rect.top = 小红块rect.top - 10
print(小红块rect)
if event.key ==K_DOWN:
小红块rect.move_ip(0,10)
screen.fill((0,0,0))
offsetX = 小红块rect.x - 测试图rect.x
offsetY = 小红块rect.y - 测试图rect.y
point = 测试图mask.overlap(小红块mask,(offsetX,offsetY))
someArea = 测试图mask.overlap_area(小红块mask,(offsetX,offsetY))
#如果碰到了,返回点,区域的像素数,测试图碰点像素值,小红块碰点像素植,这样还能做颜色碰撞检测。
#由于point是相对于是screen的坐标,所以这产生了坐标转换的问题,
if point:
px,py = point
cx,cy = px - 测试图rect.x , py - 测试图rect.y
pixel1 = 测试图.get_at((cx,cy))
qx,qy = px - 小红块rect.x ,py - 小红块rect.y
pixel2 = 小红块.get_at((qx,qy))
print(point,someArea,pixel1,pixel2)
mx,my = pygame.mouse.get_pos()
screen.blit(测试图,(0,0))
screen.blit(小红块,小红块rect)
pygame.display.set_caption(str(mx) + "," + str(my))
pygame.display.update()