使用四叉樹優化碰撞檢測

四叉樹是幹什麼的?

百度百科
四元樹又稱四叉樹是一種樹狀數據結構,在每個節點上會有四個子區塊。四元樹常應用於二維空間數據的分析與分類。 它將數據區分紅爲四個象限。數據範圍能夠是方形或矩形或其餘任意形狀。
從定義咱們能夠看出重點信息: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

歡迎掃碼關注公衆號《微笑遊戲》,瀏覽更多內容。

相關文章
相關標籤/搜索