使用四叉树优化碰撞检测

四叉树是干什么的?

百度百科
四元树又称四叉树是一种树状数据结构,在每个节点上会有四个子区块。四元树常应用于二维空间数据的分析与分类。 它将数据区分红为四个象限。数据范围能够是方形或矩形或其余任意形状。
从定义咱们能够看出重点信息:node

  1. 树状结构
  2. 四个区块
  3. 分类
  4. 矩形

图示讲解

讲解以前须要先说明一下四叉树是用来作什么的,明白了原理才好理解它的行为。
使用四叉树就是使用分类的方法,减小碰撞节点的个数,只取出与给定碰撞体相同区域或者压在碰撞体所在区域边上的对象。数据结构

  1. 将游戏屏幕分为四个区域。
    916005-20160612193213793-1006655096.png
  2. 插入对象
    916005-20160612193357043-1288525697.png
  3. 插入的对象超过了咱们设置的阈值时,划分
    916005-20160612193417902-1220978536.png
  4. 插入的对象再次超过了咱们设置的阈值时,继续分。
    916005-20160612193502902-1720204858.png

分析

插入

从上面的图示咱们能够很好理解四叉树的原理。涉及的都是插入操做。
那么插入操做具体都作了什么呢?
image.png
image.png
从代码中咱们能够看出:框架

  1. 当插入第一个对象的时候只走了2;这个时候没有子树,因此不会走1,由于objects(管理的对象)的长度尚未超过咱们设置的阈值MAX_OBJECTS,因此也不会走3。
  2. 一直插入,当objects中的数量,超过了咱们设置的阈值MAX_OBJECT,就会开始划分,产生子树,有了nodes,划分以后将本身管理的节点插入到子树中。再此以前,都不会走1,由于尚未产生子树。
  3. 划分以后再次插入新对象,若是对象能够得到对应的象限,就会走1 不会走2和3,若是没有得到对应的象限才会走2,3(没有得到的状况多是你建立的对象在屏幕外,游戏中不少状况是敌人从屏幕外走进屏幕的,具体可参考我作的《星际迷航》或者《星际战》游戏)。

更新对象

image.png
我是把四插入做为了对象管理器使用,要否则对象也须要更新,因此有了这一步操做。若是不这样你须要本身建立对象管理器,一个一个放进去,删除。经过四叉树直接管理省了很多事情。函数

更新象限信息。

这是一个递归操做,更新象限作的事情比较多了。this

  1. 检查对象是否存活,若是死亡就回收,我这里使用了对象池,因此对象实现了poolAble接口。
    image.png3d

  2. 判断对象的所占区域是否在四叉树的区域内
    这里须要说明的是一个四叉树自己的区域是它管理的四个象限这么大。也就是一个四叉树管理四个象限
    83792-20170717120708910-531711251.jpg
    image.png
    不在管理区域的话须要判断当前this是否为根节点,若是是说明对象已经出屏了。(这个时候能够经过对象实现的isVisible接口来控制是否回收,由于不是全部在屏幕外的都要回收,好比要进入屏幕的敌人,是不可能回收的,因此须要本身用isVisible接口来控制)。若是不是就将对象放入根节点,从新划分。对象

  3. 在管理区域内,就看看在四叉树管理的哪一个象限里。更新象限信息。
    image.png
    若是没有变化什么都不过,若是有变化,先判断象限是否为-1,为何会出现-1,也就是不在四个象限的任何一个象限?由于压线了。此番操做后的结果以下图。
    83792-20170717120718847-65956331.jpgblog

根据给定矩形获取对象列表

image.png

  1. 第一个是步长,用于获取深度,固然深度越长,处理的时间越长,获取的对象也精细。这个能够根据本身游戏的同屏四叉树层级而定了。
  2. 若是经过obj的rect得到对象所在象限若是得到了对应的象限,用得到的象限的四叉树再获取。若是压线的话就须要将碰撞的两个象限的内容都取出来。
  3. 返回四叉树中没有分割象限的对象。

怎么用呢?

image.png
天然就是把要碰撞的对象传给retrieve函数得到须要碰撞的对象列表进行碰撞检测了。
也就是文章靠头说的:
使用四叉树就目的是为了减小碰撞节点的个数。使用的是分类的方法。
至于用什么样的碰撞检测函数,不是四叉树关心的事情,
image.png
至于用几个四叉树管理对象,也不是四叉树关心的事情。
image.png教程

结语

想要demo的同窗能够去个人微店或者官方creator商城购买《跨引擎游戏框架》源码,跟demo是一个项目。买过的同窗请加我好友,群已经建好,有更新我会群里直接发包。递归

源码购买入口:
image.png
demo展现:
image.png

项目截图:
image.png
框架的相关模块教程能够到《个人专辑》游戏开发进阶教程中获取。
后续还会推出更多与框架有关的教程:如:战斗框架,教学框架等等。并附带完整的游戏实现(飞行射击游戏为例,学会作飞行射击游戏不是目的,目的是经过这一款游戏,你能够得到作其余全部类型的游戏的思路)。但愿能够在不饿死本身的前提下帮助更过的朋友们快速找到开发思路。

长按下方二维码,关注《微笑游戏》公众号,获取更多精彩内容。
image

欢迎扫码关注公众号《微笑游戏》,浏览更多内容。

相关文章
相关标签/搜索