第一个项目(八)碰撞检测

碰撞检测技术介绍 本文将对常用的碰撞检测算法进行介绍,并简要的进行benchmark。在planning中一般将主车以及障碍物处理为凸多边形(Polygon/Box),因此碰撞检测多是检测两个Polygon是否重叠,但是为了不失一般性,本文也将介绍Polygon和Point的位置关系计算方法,因为在两个Polygon的位置关系计算中可能会用到。... 阅读详情

碰撞检测部分的代码写了有一整天,因为地图编辑器其实很不熟悉,所以走了很多弯路,把今天的代码和细节分享给大家

首先肯定要封装到函数里面,名字就叫pengzhuang()吧,这个函数写在自定义的update里面,每帧都执行检测。

因为我的障碍物都画在地图上,所以传统的矩形检测不能用,那个是精灵对精灵的,这个精灵和地图的交互实在头疼,如果要碰撞的话,肯定要检测坐标,但是cocos2dx的坐标原点和地图的原点是不一样的,一个左下,一个左上,所以要先写一个函数来换算,point_player_to_tile()

CCPoint Stage::point_player_to_tile(CCPoint pos)
{
	CCSize mapSize=map->getMapSize();
	CCSize tileSize=map->getTileSize();
	int x= pos.x/tileSize.width;
	int y= (640-pos.y)/tileSize.height;
	return ccp(x,y);
	
}
碰撞函数如下

void Stage::pengzhuang()
{

	CCSize PlayerSize=player->getContentSize();
	CCPoint PlayerPoint=player->getPosition();

	CCPoint P=ccp(PlayerPoint.x,PlayerPoint.y);
	CCPoint tilecoord = this->point_player_to_tile(P);//将坐标转换成tile坐标
	CCTMXLayer *layer = map->layerNamed("block2") ; //获取地图层
	int tilegid = layer->tileGIDAt(tilecoord);//获取图素GID值
	CCLOG("tilegid: %f %f", tilecoord.x,tilecoord.y);
	if (tilegid)
	{
		CCDictionary *properties  = map->propertiesForGID(tilegid)  ;//根据GID值获取图素属性键值集合
		if (properties)
		{
			const CCString *str = properties->valueForKey("ShiTou");//键值名称
			if (str && str->compare("true") == 0)    //如果键值是true
				player->runAction(getRunAction());
		}
	}
注释已经很清楚了,首先转换坐标,然后获得该坐标处的GId(该值为每个方块的唯一id,就像身份证),判断身份证存在与否,存在的话判断这个键值是不是ture。

如果都符合,就执行动作。

但是我就是很奇怪,这个判断是无效的,但是明明逻辑没问题,官网也是这么给的,于是一遍一遍的debug,才发现...............地图是向左滚的啊!!!方块的x坐标要加上滚出屏幕外的!!!!

于是在updat里面加入了帧值,每过一帧加一,然后用这个值乘以速度,乘积加上要判断点的x之和再除以小方块长,这才是小方块相对于地图的坐标。

CCPoint Stage::point_player_to_tile(CCPoint pos)
{


	CCSize mapSize=map->getMapSize();
	CCSize tileSize=map->getTileSize();
	int x= (map_time*10+pos.x)/tileSize.width;
	int y= (640-pos.y)/tileSize.height;

	return ccp(x,y);
	
}
这样和地图的交互就完成了,当然,我只是用一个点来做实验,因为是跑酷类游戏,主角的好多地方都可能发生碰撞,所以要多加几个点吧,能想到的暂时就这样,如果点太多了,反而帧率又下降了。


RRT与碰撞检测 RRT与碰撞检测 在基于采样的路径规划算法中,快速搜索随机树(RRT)可以说是一个最为经典的算法。围绕RRT的改进算法几乎每年都有,就如同基于搜索的规划算法中的A*。 RRT的规划算法流程很简单,如下所示: 首先RRT会初始化一个列表V,用于存放候选路径。在最开始,算法会把起点vstartv_{start}vstart​加入到列表V中; 然后RRT会在地图的free区域上随机生成一个节点vrandv_{rand}vrand​,通过V表找到与新节点vrandv_{rand}vrand​距离最近的节点vnea 阅读详情

相关推荐

碰撞检测-apollo

关于aplollo的碰撞检测算法分析

zgh 3212

关于QGraphicsItem检测碰撞时 获取到与其碰撞的item的名称(QGraphicsItem::toolTip())

这两天做程序的时候碰到的问题,两个QGraphicsItem和一个QGraphicsPixmapItem放到一个场景中QGraphicsPixmapItem作为背景,两个普通item为两个小方块,其中一个可以移动 我要的效果是当那个可以移动的方块与另一个方块碰撞时 可以检测出来然后输出。QGraphicsItem::toolTip()会将给Item设置的提示以QString类型返回出来,这样就可以在程序中通过得到的item的指针来获取其提示信息,然后就能够进行判断 发生碰撞的是否是自己希望碰撞的。

m0_68925706的博客 674

碰撞检测 | 详解矩形AABB与OBB碰撞检测算法(附ROS C++可视化)

AABB由两个对角点的坐标定义:一个是左下角的最小点(minPoint),另一个是右上角的最大点(maxPoint)。这两个点共同确定了一个轴对齐的矩形边界框。为了判断两个AABB是否发生碰撞,算法会检查它们在各个轴上的投影是否重叠。A由minPointA(minX_A, minY_A)和maxPointA(maxX_A, maxY_A)定义。B由minPointB(minX_B, minY_B)和maxPointB(maxX_B, maxY_B)定义。

loveting99的博客 5998

谁说数学没用——基元碰撞检测(2)

 这里介绍的是“基元”之间的碰撞检测,所谓“基元”就是线段、三角形、矩形、平面、圆、椭圆等各种常见的、能用一两个数学公式表示的图形。“基元碰撞检测”是游戏开发中常用的手段,用数学公式求解碰撞结果,能让我们系统性的理解其中的原理。大家也不用担心,里面用到的数学公式,充其量高中、大一都学过,都属于“空间解析几何”范畴。------------------------------------------...

ayu的专栏 796

Unity物理碰撞检测详解

碰撞检测是 Unity 物理系统的核心功能,用于检测和处理游戏对象之间的交互。下面我将从基础到高级全面解析 Unity 的碰撞检测机制。

2302_76776557的博客 2039

静态碰撞检测

静态碰撞检测是游戏和物理模拟中不可或缺的一部分,主要用于检测静态对象与动态对象之间的碰撞。通过预计算边界、使用简单的几何形状和空间划分技术,可以显著提高碰撞检测的效率。静态碰撞检测在角色与环境的交互、物理模拟等方面发挥着重要作用,为游戏的真实感和可玩性提供了基础。静态碰撞检测是游戏开发中至关重要的一部分,涉及到静态对象与动态对象之间的交互。通过选择合适的碰撞体、使用高效的碰撞检测算法、集成物理引擎、处理碰撞响应以及进行性能监测与调优,可以显著提高碰撞检测的效率和准确性。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1495

QGraphicsScene的碰撞检测

实现效果如下 图1 移动的Item碰撞显示 图2 碰撞的Item都显示使用Scene的碰撞检测函数QList< QGraphicsItem *> collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const文档解释Returns a list of

柠檬柠檬C的博客 9152

精确碰撞检测

精确碰撞检测是动态碰撞检测中的关键环节,通过在初步检测后进行详细计算,能够提供高精度的碰撞响应和物理反馈。使用GJK、MPR、分离轴定理等算法,开发者可以在复杂的场景中实现真实的物理交互,提升游戏和应用的沉浸感和真实感。接下来我们将更深入地探讨精确碰撞检测的实现细节、优化策略以及在不同类型游戏中的具体应用。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 819

Pygame:碰撞检测

文章目录(一)碰撞检测的原理(二)手动写代码实现碰撞检测1️⃣版本一2️⃣版本二(三)使用sprite 提供的现成的碰撞检测函数 ????大家好!我是近视的脚踏实地,虽然近视,但是脚踏实地,这一篇来学习游戏中的碰撞检测,然后继续完善未完成的小游戏 (一)碰撞检测的原理 大部分游戏都是要做碰撞检测的,因为你要知道小球是否发生了碰撞,子弹是否击中了目标等等。那么其实碰撞原理也很简单,事实就是检测两个精...

Monster丶ZF的博客 1万+

基于八叉树的机械臂碰撞检测

本文提出一种基于八叉树算法与包围盒技术的机械臂碰撞检测方法,通过分解模型并构建覆盖盒,有效降低计算量。该方法在Rhino平台上实现,适用于工业自动化仿真,能够在不依赖高成本GPU的情况下,实现高效、低成本的防碰撞检测,适应多机械臂与复杂环境的实时检测需求。

r7s8t的博客 877

一个很好的碰撞检测例子(精确到球和面片)

opengl碰撞检测例子,球和三角面片的碰撞检测

CocosCreator中的碰撞检测

大家好,今天要给大家介绍的是CocosCreator中如何使用碰撞组件(Collider)来实现碰撞检测。CC中这块做的还是非常好的,不仅能够支持圆形(Circle Clidder),矩形(Box Clidder)和多边形(Polygon Clidder),对于碰撞的边界还是可以自由编辑的。接下来,我们就实现一个正方形单色Sprite和一个星星(spriteFrame)的碰撞检测。创建一个ClidderTest的项目工程,导入相关的图片资源,创建这两个Sprite。效果如下: 先说一下碰撞检测的原理。在c

weixin_42547469的博客 4244

详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解

声明:本文为原创文章,发表于nebulaf91的csdn博客。欢迎转载,但请务必保留本信息,注明文章出处。 本文作者: nebulaf91 本文原始地址:最大似然估计(Maximum likelihood estimation, 简称MLE)和最大后验概率估计(Maximum a posteriori estimation, 简称MAP)是很常用的两种参数估计方法,如果不理解这两种方法的思路,很

nebulaf91的博客 33万+

多边形碰撞检测算法

对于上面两个相交的多边形例子,实际应用中,其实不需要求出完整的闵可夫斯基差,只需要在闵可夫斯基差内形成一个多边形,如下图所示,并使这个多边形尽可能包围原点,这个多边形就称为单纯形。如下图所示,在给定向量 a 方向上,shape1 的最远点为(4,2),在向量 -a 的方向上,shape2 的最远点为(5,3),这两个点作差即得到点(-1,-1)。实际应用中,遍历所有角度的分离轴是不现实的,受益于多边形的性质,对于两个都是多边形的物体,只需要依次在每条边的垂直线做投影即可,如下图所示。

gghhb12的博客 7015

层层剥开Allegro skill--快速抓取并写入Allegro软件【呕血创作,转载注明】

Allegro skill eda pcb

qq_36492361的博客 1255

STM32F4使用CUBEMX ADC定时采样+DMA

STM32、FFT、ADC、TIM

m0_62379750的博客 4223

Apollo中Lattice轨迹碰撞检测

今天又向大佬们迈向一步~~~~~ Apollo中Lattice规划器的碰撞检测实现在HasOverlap中: for (const auto& obstacle_box : predicted_bounding_rectangles_[i]) { if (ego_box.HasOverlap(obstacle_box)) { return true; } } 轨迹碰撞检测目的 目的:剔除存在同障碍物碰撞风险的轨迹…如下,大致就是对于每个采样点,自车采

王不二的路 9261

适合初学者的ROS机器人教程(1): Ubuntu下ROS创建自己的包和使用github下载的包

ROS如何创建自己的包 1. 首先创建catkin工作空间(如果你以及有了请忽略) $ mkdir catkin_ws # 创建一个文件夹里面计划放我们的项目,ws是workspace的缩写 $ cd catkin_ws # 将当前工作文件夹切换到catkin_ws这个文件夹 ~/catkin_ws$ catkin_make # 执行catkin_make创建一ROS项目 此时你的catkin_...

@司南牧|知乎|博客|易懂教程|李韬 3245

碰撞检测算法

用于正确输出物体2碰撞后的速度情况。碰撞响应基于物理定律和预先设定的规则,当检测到两个物体发生碰撞后,根据物体的属性(如质量、速度、弹性系数等)以及碰撞的具体情况(如碰撞点、碰撞角度等)来确定物体在碰撞后的运动状态变化,包括速度、位置等方面的改变。:计算碰撞后物体2在 x 方向的速度,将碰撞前物体2在 x 方向的速度减去根据碰撞后速度变化量计算得到的减量,减量通过速度变化量乘以物体1的质量得到。:计算两物体碰撞前的相对速度在 x 方向的分量,通过物体2在 x 方向的速度减去物体1在 x 方向的速度得到。

qq_40844444的博客 1736

技术文档的语言表达:简洁、准确与易懂的平衡艺术

技术文档的语言表达不仅要简洁、准确,还需要能够打破技术壁垒,使不同背景的读者都能理解。这是一项需要技巧和经验的工作,它要求技术作者既要具备扎实的专业知识,又要具备清晰的表达能力。通过不断打磨语言的简洁性、准确性和易懂性,我们能够创造出一份高质量的技术文档,让知识的传递不再受限于语言的障碍。

人心有反复,好在山水有重逢。 4678

【Unity 实用工具篇】✨| I2 Localization 实现本地化及多种语言切换,快速上手

Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的插件:I2 Localization 。

努力前行,总会成为自己心中的那道光 3万+

碰撞检测 matlab,碰撞检测 - LearnOpenGL CN

碰撞检测Note本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,...

weixin_39845220的博客 2427

FISCO BCOS(八)——— 一键部署 WeBase

环境 版本 Java Oracle JDK 8 至 14 MySQL MySQL-5.6及以上 Python Python3.6及以上 PyMySQL 1、获取部署安装包: wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.4/webase-deploy.zip 2、解压安装包: unzip webase-deploy.zip 3、进入目录: c...

林中有神君 3607

OpenGL学习笔记一之实战篇八 2D游戏(Breakout)之碰撞检测

转载自https://learnopengl-cn.github.io/06%20In%20Practice/2D-Game/05%20Collisions/02%20Collision%20detection/ 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 当试图判断两个物体之间是否有碰撞发生时,我们通常不使用...

飞飞飞的博客 935

大疆前端开发面试题及参考答案(4万字长文)

在前端项目中,难点和性能优化的挑战无处不在。比如在处理复杂交互界面时,实现流畅的动画效果和实时反馈就是一大难点。当界面中有大量元素需要同时进行交互和动态更新,像电商平台的商品筛选和排序功能,不仅要保证操作的即时响应,还要确保界面在各种设备和网络环境下的稳定性,这就需要对事件处理、DOM 操作和数据更新机制有深入理解。在性能优化方面,首屏加载速度是常见的难点。当页面包含大量图片、脚本和样式文件时,如何合理地进行资源压缩、合并与缓存,以减少加载时间,是需要精心考虑的。

大模型大数据攻城狮的专栏 1155

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 第一个项目(七)添加地图
下一篇: cocos2dx_3.X项目重新写(一)帧动画的改变
Fried_potatoes
博客等级 码龄12年 5粉丝 38原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值