python pygame如何实现碰撞检测

news2025/1/25 9:13:56

前言:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2041065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

古印度的未解之谜——哈拉帕印章文字

关注我们 - 数字罗塞塔计划 - 在之前的文章中,我们知晓了古埃及莎草纸的制作工艺(参见《莎草纸——数千年前的信息记录载体》),也了解了由粘土变为陶片可保存数千年的苏美尔泥板书(参见《泥板书:两河文明传…

暑期破防实录——捡漏腾讯

序 经历了整整三个月的折磨,暑期实习终于尘埃落定。 其实还没收到 offer 的时候,还会想着到时候录用了该怎么大写特写小作文,但真到了这一天,只剩下一种解脱感,一种摆脱了漫长的焦虑与压抑的淡淡喜悦。 或许就像久病…

Java垃圾收集底层算法实现

垃圾收集底层算法实现 三色标记 在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。漏标的问题主要引入了三色标记算法来解决。 三色标记算法是把Gc roots可达性分析遍历对象过…

QT翻金币小游戏

目录 QT翻金币小游戏 效果展示 图片 视频 实现代码 main.cpp mymainwindow.h mymainwindow.cpp startscene.h startscene.cpp selectscene.cpp playscene.h playscene.cpp mypushbutton.h mypushbutton.cpp dataconfig.h dataconfig.cpp QT翻金币小游戏 效果展示…

什么是进程?C语言

进程的概念 进程就是执行中的程序,是系统资源分配的最小单位。 进程的内存分配 进程的作用 宏观上是并行的,微观上是串行的 进程的状态 对于基本的操作系统:有三个状态: 就绪态->执行态-> 阻塞态 在LInux中有四种&am…

docker数据卷、资源控制

一、docker数据卷: 1.容器和宿主机之间数据共享----挂载卷----容器内的目录和宿主机的目录进行挂载。实现数据文件共享容器的生命周期有限,一旦重启所有对容器内部文件数据的修改以及保存的数据都会被初始化,所以为了防止数据丢失重要的组件…

前端学习大纲 | 主流前端技术 | 学习路线

需要完整的学习路线的宝子可以点击获取:点击即可获取完整的学习路线 第一阶段(页面还原能力) HTML5、CSS3、Git 第二阶段(专攻 JS 逻辑能力) JavaScript 基础、JavaScript 进阶、JavaScript 高级、ES6 第三阶段&a…

【Java】如何使用jdbc连接并操作MySQL,一文读懂不迷路,小白也能轻松学会

JDBC的原理 JDBC(Java Database Connectivity)是Java提供的用于连接和操作数据库的API。它允许Java应用程序与各种数据库进行交互,以下是JDBC的基本原理: 驱动程序管理:JDBC使用不同的数据库驱动程序来连接不同类型的…

微信小程序--24(列表渲染)

一、wx&#xff1a;for 1.作用 根据指定数组&#xff0c;循环渲染重复的组件结构 2.语法 <view wx:for"{{data中的数据}}"> 索引是&#xff1a;{{index}}, item项是&#xff1a;{{item}}</view> index:表索引item&#xff1a;表当前循环项 …

【网络】局域网LAN、广域网WAN、TCP/IP协议、封装和分用

文章目录 局域网 LAN广域网 WAN网络中的重要概念IP 地址端口号 认识协议协议分层是什么OSI 七层网络模型TCP/IP 五层网络模型&#xff08;或四层&#xff09;物理层传输层网络层数据链表层应用层网络设备所在分层 封装和分用[站在发送方视角]&#xff08;封装&#xff09;[站在…

新工种,AI商业化变现思路

本文由 ChatMoney团队出品 AI变现&#xff0c;你我都能成为创收高手! 不必是科技大咖&#xff0c;也无需深厚背景&#xff0c;让我们一起探索Chatmoney全能知识库AI的奥秘&#xff0c;轻松步入收益之门! 想象一下&#xff0c;你的智慧和创意通过ChatmoneyAI技术转化为可观的收益…

如何使用 Go 连接 MO

MatrixOne 是一款超融合异构分布式数据库&#xff0c;与 MySQL 高度兼容&#xff0c;通过云原生化和存储、计算、事务分离的架构构建 HSTAP 超融合数据引擎&#xff0c;实现单一数据库系统支持 OLTP、OLAP、流计算等多种业务负载&#xff0c;通过为用户提供一站式超融合数据解决…

【数据结构与算法】最短路径算法

最短路径算法目录 一.什么是最短路径二.最短路径算法的实现1.准备工作2.拆解为子问题——递归 三.完整代码 一.什么是最短路径 顾名思义根据需求,可以获取的最优的路径. 比如说: 我标的数值,就是时间,那么假如我们是A点到D点. 那么我们可以看到有三条路径: A->E->D所花…

AI绘画:一篇文章带你解析Stable Diffusion 原理!

前言 Stable Diffusion原理 1. Stable Diffusion能做什么 直白地说&#xff0c;SD是一个text-to-image模型&#xff0c;通过给定text prompt&#xff08;文本提示词&#xff09;&#xff0c;它可以返回一个匹配文本的图片。 2. Diffusion 模型 Stable Diffusion属于深度学习…

2003-2023年高铁线路信息数据

2003-2023年高铁线路信息数据 1、时间&#xff1a;2003-2023年 2、来源&#xff1a;高铁航线数据库&#xff08;Chinese High-speed Rail and Airline Database&#xff0c;CRAD&#xff09; 3、指标&#xff1a;高铁线路名称、起点名、终点名、开通时间、线路长度(km)、设计…

直接插入排序(C语言)

一、图解 思想: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为 止&#xff0c;得到一个新的有序序列 。 当插入第i(i>1)个元素时&#xff0c;前面的array[0],array[1],…,array[i-1]已经排好序&#xff0c;此时…

解决idea中注释部分的中文乱码问题

问题背景&#xff1a; application.properties注释部分突然出现中文乱码问题&#xff0c;重启idea仍乱码&#xff0c;如下&#xff1a; 解决方案&#xff1a;设置UTF-8 注意不要漏步骤&#xff0c;设置好后重启idea 如果还不行&#xff0c;说明可能是在文件保存的时候没有按U…

vue3 快速入门 (七) : Vue打包并部署到Nginx服务器上

1. 本文环境 Vue版本 : 3.4.29Node.js版本 : v20.15.0系统 : Windows11 64位IDE : VsCode 2. vue打包&#xff0c;减少体积 打包之前我们可以对包的体积进行一些优化&#xff0c;比如可以实现自动按需引入、开启图片压缩、文件压缩等&#xff0c;具体详见这篇文章 : 分享基…

C++类模版中限定模版参数类型

1.模版类 这里我们实现一个大小比较的的模版类&#xff0c;如下。 template<class T> class Myless { public:bool operator()(const T& x,const T& y){return x < y;} }; 然而这样的实现方式&#xff0c;当传入模版参数为指针时&#xff0c;比较的就是指针…

LVS+Keepalived 双机热备

LVSKeepalived 双机热备 Keepalived案例分析Keepalived工具介绍Keepalived工具介绍一、功能特点 一、理解Keepalived实现原理实验报告资源列表一、安装keepalived以及ipvsadm Keepalived案例分析 企业应用中&#xff0c;单台服务器承担应用存在单点故障的危险单点故障一旦发生…