碰撞检测分为两个步骤,一个是筛选目标,一个是进行计算是否碰撞。
一:网格碰撞
网格碰撞检测筛选目标的经典传统算法,英雄无敌,三国志这类SLG,甚至是MOBA类游戏中都常用这种方法。思路就是在大地图中划分格子形成网格,每个战斗单位占据一个格子,当地图生成对象的时候,在对应的格子里面添加对象,删除的时候移除出来,对象位置,模型改变的时候,更新格子信息。检测碰撞只要单位时间内把以角色为中心点的9个格子的所有对象添加到列表中,然后遍历列表对象和角色进行碰撞检测。
A位置的对象 获取周边的格子对象得到的列表是[B],只需要检测A和B是否碰撞就可以了,减少了不必要的A和别的对象的碰撞检测,这样确保了即使对象很多,只要不再相邻格子里都无需计算,只需要更新位置信息即可,网格的优点是当数据比较疏松,格子大小均匀的时候效率高,缺点是1:对于大场景特别消耗内存,而且不太适合做无限延展的场景,2:查询每个对象周围的东西时候,不太方便,格子的粒度越细,速度越慢。3:如果数据比较精密,冗余数据多,重复计算碰撞。
二:四叉树