前言:
在python中,我们实现两个物品的碰撞检测往往是判断两个物体的x、y坐标是否有重合,根据坐标来进行判断,但是这种判断方式往往不太准确,对于一些透明部分,会出现误判的情况,今天介绍的是一种通过使用掩码进行碰撞检测,可以更高效和准确地判断两个图像在非透明区域是否有重叠,而不仅仅是基于图像的矩形边界。
实现方式:
首先通过pygame.image.load()导入对应的图片
robot = pygame.image.load('images/robot-removebg-preview.png')
robot2 = pygame.image.load('images/robot-removebg-preview.png')
确定初始位置,定义碰撞函数:
x=100
y=300
x1=300
y1=300
#碰撞检测
def bang(x,y,x1,y1):
#画背景
screen.blit(bg,(0,0))
#画1号机器人与2号机器人
screen.blit(robot,(x,y))
screen.blit(robot2,(x1,y1))
#从图像创建掩码
robotMask = pygame.mask.from_surface(robot)
robot2Mask = pygame.mask.from_surface(robot2)
#计算两个图像的偏移量
offset = (x-x1, y-y1)
#使用 overlap 方法检查两个掩码是否有重叠部分 如果有重叠(即 result 不为 None)
result = robotMask.overlap(robot2Mask, offset)
if result:
print("撞击了")
记得在while True 种进行调用,不断循环刷新页面。
while True:
bang(x,y,x1,y1)
Handlevent()
效果展示:
通过按下a 与 d 进行控制 机器人左右移动,w 与 s 进行控制 机器人上下移动,实现碰撞效果。
完整代码:
#导入所需的模块
import sys
import pygame,easygui
# 使用pygame之前必须初始化
pygame.init()
# 设置主屏窗口
screen = pygame.display.set_mode((1100,600))
bg = pygame.image.load('images/bg.png')
robot = pygame.image.load('images/robot-removebg-preview.png')
robot2 = pygame.image.load('images/robot-removebg-preview.png')
# 设置窗口的标题,即游戏名称
pygame.display.set_caption('hello world')
# 引入字体类型
f = pygame.font.Font('C:/Windows/Fonts/simhei.ttf',50)
# 生成文本信息,第一个参数文本内容;第二个参数,字体是否平滑;
# 第三个参数,RGB模式的字体颜色;第四个参数,RGB模式字体背景颜色;
text = f.render("我爱编程",True,(255,0,0),(0,0,0))
#获得显示对象的rect区域坐标
textRect =text.get_rect()
# 设置显示对象居中
textRect.center = (200,200)
# 将准备好的文本信息,绘制到主屏幕 Screen 上。
# screen.blit(text,textRect)
# 固定代码段,实现点击"X"号退出界面的功能,几乎所有的pygame都会使用该段代码
x=100
y=300
x1=300
y1=300
#碰撞检测
def bang(x,y,x1,y1):
screen.blit(bg,(0,0))
screen.blit(robot,(x,y))
screen.blit(robot2,(x1,y1))
robotMask = pygame.mask.from_surface(robot)
robot2Mask = pygame.mask.from_surface(robot2)
offset = (x-x1, y-y1)
result = robotMask.overlap(robot2Mask, offset)
if result:
print("撞击了")
def Handlevent():
global x
global y
# 循环获取事件,监听事件状态
for event in pygame.event.get():
# 判断用户是否点了"X"关闭按钮,并执行if代码段
if event.type == pygame.QUIT:
#卸载所有模块
pygame.quit()
#终止程序,确保退出程序
sys.exit()
if event.type ==pygame.KEYDOWN and event.key == pygame.K_a:
x=x-10
elif event.type ==pygame.KEYDOWN and event.key == pygame.K_d:
x=x+10
elif event.type ==pygame.KEYDOWN and event.key == pygame.K_w:
y=y-10
elif event.type ==pygame.KEYDOWN and event.key == pygame.K_s:
y=y+10
pygame.display.flip() #更新屏幕内容
while True:
bang(x,y,x1,y1)
Handlevent()