四元樹又稱四叉樹是一種樹狀資料結構,在每乙個節點上會有四個子區塊。四元樹常應用於二維空間資料的分析與分類。 它將資料區分成為四個象限。資料範圍可以是方形或矩形或其他任意形狀。
從定義我們可以看出重點資訊:
樹狀結構
四個區塊
分類矩形
圖示講解
講解之前需要先說明一下四叉樹是用來做什麼的,明白了原理才好理解它的行為。
使用四叉樹就是使用分類的方法,減少碰撞節點的個數,只取出與給定碰撞體相同區域或者壓在碰撞體所在區域邊上的物件。
將遊戲螢幕分為四個區域。
插入物件
插入的物件超過了我們設定的閾值時,劃分
插入的物件再次超過了我們設定的閾值時,繼續分。
分析插入
從上面的圖示我們可以很好理解四叉樹的原理。涉及的都是插入操作。
那麼插入操作具體都做了什麼呢?
從**中我們可以看出:
當插入第乙個物件的時候只走了2;這個時候沒有子樹,所以不會走1,因為objects(管理的物件)的長度還沒有超過我們設定的閾值max_objects,所以也不會走3。
一直插入,當objects中的數量,超過了我們設定的閾值max_object,就會開始劃分,產生子樹,有了nodes,劃分之後將自己管理的節點插入到子樹中。再此之前,都不會走1,因為還沒有產生子樹。
劃分之後再次插入新物件,如果物件可以獲得對應的象限,就會走1 不會走2和3,如果沒有獲得對應的象限才會走2,3(沒有獲得的情況可能是你建立的物件在螢幕外,遊戲中很多情況是敵人從螢幕外走進螢幕的,具體可參考我做的《星際迷航》或者《星際戰》遊戲)。
更新物件
我是把四插入作為了物件管理器使用,要不然物件也需要更新,所以有了這一步操作。如果不這樣你需要自己建立物件管理器,乙個乙個放進去,刪除。通過四叉樹直接管理省了不少事情。
更新象限資訊。
這是乙個遞迴操作,更新象限做的事情比較多了。
檢查物件是否存活,如果死亡就**,我這裡使用了物件池,所以物件實現了poolable介面。
判斷物件的所佔區域是否在四叉樹的區域內
這裡需要說明的是乙個四叉樹本身的區域是它管理的四個象限這麼大。也就是乙個四叉樹管理四個象限
不在管理區域的話需要判斷當前this是否為根節點,如果是說明物件已經出屏了。(這個時候可以通過物件實現的isvisible介面來控制是否**,因為不是所有在螢幕外的都要**,比如要進入螢幕的敵人,是不可能**的,所以需要自己用isvisible介面來控制)。如果不是就將物件放入根節點,重新劃分。
在管理區域內,就看看在四叉樹管理的哪個象限裡。更新象限資訊。
如果沒有變化什麼都不過,如果有變化,先判斷象限是否為-1,為什麼會出現-1,也就是不在四個象限的任何乙個象限?因為壓線了。此番操作後的結果如下圖。
根據給定矩形獲取物件列表
第乙個是步長,用於獲取深度,當然深度越長,處理的時間越長,獲取的物件也精細。這個可以根據自己遊戲的同屏四叉樹層級而定了。
如果通過obj的rect獲得物件所在象限如果獲得了對應的象限,用獲得的象限的四叉樹再獲取。如果壓線的話就需要將碰撞的兩個象限的內容都取出來。
返回四叉樹中沒有分割象限的物件。
怎麼用呢?
自然就是把要碰撞的物件傳給retrieve函式獲得需要碰撞的物件列表進行碰撞檢測了。
也就是文章靠頭說的:
使用四叉樹就目的是為了減少碰撞節點的個數。使用的是分類的方法。
至於用什麼樣的碰撞檢測函式,不是四叉樹關心的事情,
至於用幾個四叉樹管理物件,也不是四叉樹關心的事情。
結語想要demo的同學可以去我的微店或者官方creator**購買《跨引擎遊戲框架》原始碼,跟demo是乙個專案。買過的同學**我好友,群已經建好,有更新我會群裡直接發包。
FFT是幹什麼的
fft在演算法競賽中就有乙個用途 加速多項式乘法 暴言 簡單來說,形如 a0x0 a1x1 a2x2 anxna0x0 a1x1 a2x2 anxn 的代數表示式叫做多項式,可以記作f x a0x0 a1x1 a2x2 anxnf x a0x0 a1x1 a2x2 anxn,其中a0,a1,ana0...
npm是幹什麼的
網上的 npm 教程主要都在講怎麼安裝 配置和使用 npm 卻很少告訴新人 npm 是幹什麼的?為什麼要使用 npm?今天我就來講講這個話題。本文目標讀者是 不太了解 npm 的新人 老司機請繞道。社群共享 麻煩npm的思路大概是這樣的 這些可以被使用的 被叫做 包 package 這就是 npm名...
HttpContext是幹什麼的
httpcontext 類.包括說明和如何使用.於是,上網狂搜 有網路就是好啊.這是我補充的httpcontext 類 1.生存週期 從客戶端使用者點選並產生了乙個向伺服器傳送請求開始 伺服器處理完請求並生成返回到客戶端為止.注 針對每個不同使用者的請求,伺服器都會建立乙個新的httpcontext...