python pygame如何实现碰撞检测

前言:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我要当前端工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值