pygame遮罩mask测试练习程序.py

"""pygame遮罩mask测试练习程序.py

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检测小球是否碰到了迷宫的“墙壁”。
根据返回的像素点,判断其所在面的颜色,还能进一步进行颜色判断。


"""
__author__ = "李兴球"
__date__ = "2018年6月"

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()