pygame的mask测试_作者:李兴球

本文介绍使用Python的Pygame库实现Mask碰撞检测的方法。通过一个迷宫与小球的例子,详细展示了如何创建并利用Mask来检测两个物体间的碰撞,并进行像素级的颜色碰撞判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李兴球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值