想做一个格斗游戏,碰撞检测是用物理引擎还是手写轮子比较简单?

如果是物理引擎,我打算进入游戏时就为人物和所有怪物设置监听,如果两者接触,就为人物内部的vector添加怪物指针。
如果是手写轮子,我打算攻击的时候,获取所有怪物位置,判断是否在攻击区域内。
感觉这两种办法都太笨了,求指导

新手同看意见~~~

N:1的话,最原始的做法就是遍历所有对象判断是否相交。

如果撸主的情况是N:M而且两者都很大的话再而且N和M都是二维坐标系里的物体,若还用最原始的双重循环遍历,而且还要计算两点之间的距离,就算不开方也会有乘法(包围球。。。撸主总不会用包围盒吧),MN的复杂度是很可能造成效率瓶颈。若出现这种情况,建议使用街机射击类游戏的算法,我称之为“盖章”,即将屏幕等分为多个细小的网格(譬如88像素),在每一帧中先将N坐标转换成网格坐标(亦可以是根据一个N对象的形状将其转化到多个网格,这样不仅可以判断碰撞,还可以大概知道碰撞的部位。你可以理解这样处理后的N对象就变成了网格中的马赛克- -|||),再遍历M的网格坐标(即对整个存储了N信息的网格单位逐个“盖章”),若一个网格内既有M也有N,那么就是相交。算法的复杂度是M+N,且不需要计算距离所以没有乘法,坐标的转换全是位移操作,但是会消耗额外的内存空间(但是远远小于一张普通纹理),因此M和N越大,该算法的效率就越高。缺点是精度问题,权衡精度和效果才是最大的难点。
增强版的话,如果参与碰撞的对象在碰撞发生后就统统失效,我想至少可以用遍历网格的起始位置来提高那么一点点效率,而改进型的盖章算法可以使用原始算法大致获得“盖章”周围的物体,然后再根据距离进行精确判断

倘若场景够大,目标分布够广,那么还可以结合使用空间分割的算法,二维空间分割算法相对简单且轮子相对易造。

原则就是,在效果可以接受的情况下,算法的维度越低,效率越高;若参与计算的对象过多,先使用高效算法粗略拣选,缩小精选范围,再做精确判断。空间换时间!!!

cocos2dx里的box2d我不甚了解。。。也许大佬们早就造好了飞机,也就容不得我辈敲轮子了

那我觉得还是用物理引擎里面的EventListenerPhysicsContactWithBodies比较容易。怪物生成时就为英雄和怪物生成监听,把碰撞回调写在onContactBegin

想起物理引擎里面的一个神器了,Vector<PhysicsShape*> PhysicsWorld::getShapes(const Vec2& point),这样获取攻击判定范围内的敌人简单多了。