在上一篇我們做了同屬性珠子的相連判斷並建立群組,接下來要在各群組中找到符合消除條件的珠子並做上記號,下圖是這次的目標。
將同群組中行或列相連大於3顆的珠子標記消除,同時儲存該combo的屬性及珠子數。
首先是Orb腳本新增的變數。
using UnityEngine; using System.Collections.Generic; using UnityEngine.UI; public class Orb : MonoBehaviour { . . . public bool removed = false; public Text removeText; void Start() { . . . } }Orb腳本宣告布林變數removed來對珠子是否消除做判斷,Text變數則是在珠子上做消除的文字記號,如上圖珠子左上角顯示的紅字C。
接下來是PuzzleSystem腳本。
using UnityEngine; using System.Collections.Generic; public class PuzzleSystem : MonoBehaviour { . . . public int removeCount = 3;////(1) [System.Serializable] public struct Combo////(2) { public Orb.OrbsType type; public int count; }; public Combo [] orbCombo;////(3) void Start() { InitGrid(); OrbGroup(); OrbCombo(); } void InitGrid(){...} void OrbCreate(Orb orb){...} void FindMembers(Orb orb, int groupNum){...} void OrbGroup(){...} void FindRemoveOrb(Orb orb, int dir, int length, int comboIndex)////(4) { } void OrbCombo()////(5) { orbCombo = new Combo[orbGroups.Count];////(6) foreach (List<Orb> orbGroup in orbGroups)////(7) { int comboIndex = orbGroups.IndexOf(orbGroup);////(8) orbCombo[comboIndex].type = orbGroup[0].type;////(9) orbCombo[comboIndex].count = 0;////(10) foreach (Orb orb in orbGroup)////(11) { FindRemoveOrb(orb, 1, columnCount * (orb.row + 1) - 1, comboIndex);////(12) FindRemoveOrb(orb, columnCount, columnCount * (rowCount - 1) + orb.column, comboIndex);////(13) } } } }(1)宣告珠子消除的數量門檻,這裡為3,當然可以調整成2消或4消,依個人狀況而定。
(2)宣告Combo結構,包含珠子的OrbsType變數,和計算該combo中消除珠子的總數量。
(3)宣告Combo陣列orbCombo。
(4)宣告FindRemoveOrb函式,參數依序為珠子(orb)、搜尋方向(dir)、搜尋長度(length)、combo編號(comboIndex),至於函式內容會在下面談到。
(5)宣告OrbCombo函式,並在Start中呼叫。
(6)初始化orbCombo陣列,大小與總群組數相同。
(7)針對珠子總群組執行foreach迴圈。
(8)宣告整數變數comboIndex,數值為當前群組編號。
(9)將當前combo的珠子屬性設定為當前群組屬性。
(10)combo的珠子數量為0。
(11)接著針對當前群組執行foreach迴圈。
(12)往右搜尋,呼叫FindRemoveOrb函式參數為珠子orb、搜尋方向為右方1、搜尋長度為該列最右邊的珠子、combo編號為comboIndex。
(13)往上搜尋,呼叫FindRemoveOrb函式參數為珠子orb、搜尋方向為上方columnCount、搜尋長度為該行最上面的珠子、combo編號為comboIndex。
再來是FindRemoveOrb函式中的內容。
void FindRemoveOrb(Orb orb, int dir, int length, int comboIndex) { int orbCount = 0;////(1) int orbIndex = orbs.IndexOf(orb);////(2) for (int index = orbIndex; index <= length; index += dir) {////(3) if (orbs[index].type == orb.type)////(4) orbCount++; else////(5) break; } if (orbCount >= removeCount)////(6) { for (int index = orbIndex; index < orbIndex + (orbCount * dir); index += dir)////(7) { if (orbs[index].removed == false)////(8) orbCombo[comboIndex].count += 1; orbs[index].removed = true;////(9) orbs[index].removeText.text = "C";////(10) } } }(1)宣告用來計算相連珠子數量的整數orbCount,初始值為0。
(2)宣告珠子編號orbIndex。
(3)執行迴圈,從傳入的珠子編號開始、到傳入的搜尋長度結束、增加數值為搜尋方向。
(4)當傳入的珠子屬性與當下的珠子屬性相同時、orbCount加1。
(5)若(4)的條件不成立,表示已經找完相連的珠子,就可以結束迴圈。
(6)當orbCount大於消除門檻removeCount時。
(7)執行for迴圈,起點與方向相同,但這次搜尋只到orbCount數量為止。
(8)當前珠子的removed為false時,將對應combo下的count加1,以計算該combo總數。
(9)將當前珠子的removed設為true,這時該顆珠子就會被視為需要消除的珠子。
(10)修改Text,會顯示於執行結果中。
最後執行看看,為了安全起見跑個10次結果。
http://imgur.com/mlZsadx
http://imgur.com/ixUbo3V
http://imgur.com/6GTct5q
http://imgur.com/Kn3KDNj
http://imgur.com/AjKrbvc
http://imgur.com/45KdL5v
http://imgur.com/gytSuyG
http://imgur.com/xWaOunu
http://imgur.com/GGcktDf
http://imgur.com/BwnS2NI
沒想到頭兩次都沒Combo,害我以為寫錯了‧‧‧
以上就是珠子消除判斷與Combo建立的說明,接下來會真的把這些珠子消除,然後剩餘珠子掉落,最後針對空格生成珠子。
這次就到這裡。
沒有留言:
張貼留言