2016年8月6日 星期六

【Unity】轉珠系統製作Part.4 - 珠子消除、落下和生成

Part.3    Part.5

在上一篇中我們建立了combo陣列,同時也標記了要消除的珠子,接下來要實際做珠子消除、落下和生成,下面是分階段顯示這次的目標。
上圖動作做完後,再回到分群組的步驟直到沒combo為止,就可以得到以下結果。
可以生成一個無combo的初始化盤面,這就是本篇的目標。

首先是PuzzleSystem腳本的新增變數和程式碼修改。
using UnityEngine;
using System.Collections.Generic;
public class PuzzleSystem : MonoBehaviour
{
    .
    .
    .
    public bool hasRemove = false;////(1)
    void Start()
    {
        InitGrid();
        do {////(2)
            hasRemove = false;
            OrbCreate();
            OrbGroup();
            OrbCombo();
            OrbRemove();
        } while (hasRemove);
    }
    void InitGrid()
    {
        .
        .
        .
        for (int r = 0; r < rowCount; r++)
        {
            for (int c = 0; c < columnCount; c++)
            {
                .
                .
                .
                //orb data init
                Orb orb = orbObj.GetComponent<Orb>();
                orb.type = Orb.OrbsType.Null;////(3)
                .
                .
                .
            }
        }
        .
        .
        .
    }
    void OrbCreate()
    {
        foreach (Orb orb in orbs)////(4)
        {
            orb.group = false;////(5)
            orb.removed = false;////(6)
            if (orb.type == Orb.OrbsType.Null)////(7)
            {
                int typeNum = Random.Range(0, (int)Orb.OrbsType.Null);
                orb.type = (Orb.OrbsType)typeNum;
            }
        }
    }
    .
    .
    .
    void OrbRemove() {...}////(8)
}
(1)新增布林變數hasRemove,用來判斷是否要重複執行找群組、combo等等動作。
(2)將Start中呼叫的函式丟到do while迴圈中,除了盤面初始化以外,依序為珠子屬性生成、找群組、找Combo、珠子消除與落下。
(3)修正在InitGrid中呼叫OrbCreate的地方,改成帶入Null屬性。
(4)對orbs執行foreach迴圈。
(5)初始化group變數。
(6)初始化removed變數。
(7)當珠子屬性為Null時,賦予新的屬性。
(8)宣告OrbRemove函式用來處理珠子消除與落下。

接著是OrbRemove函式的內容。
void OrbRemove()
{
    foreach (Orb orb in orbs)////(1)
    {
        if (orb.removed == true)
        {
            orb.type = Orb.OrbsType.Null;////(2)
            hasRemove = true;////(3)
            orb.removeText.text = "";////(4)
        }
        orb.groupNum.text = "";////(5)
    }
    foreach (Orb orb in orbs)////(6)
    {
        if (orb.type == Orb.OrbsType.Null)////(7)
        {
            for (int index = orbs.IndexOf(orb); index <= columnCount * (rowCount - 1) + orb.column; index += columnCount)////(8)
            {
                if (orbs[index].type != Orb.OrbsType.Null)////(9)
                {
                    orb.type = orbs[index].type;////(10)
                    orbs[index].type = Orb.OrbsType.Null;////(11)
                    break;////(12)
                }
            }
        }
    }
}
(1)針對每一個珠子重設屬性。
(2)當找到珠子為需要被移除的狀態,把珠子的屬性修改為Null。
(3)同時將hasRemove設為true,這時Start中的while迴圈就會再次執行。
(4)重設珠子群組的text,text元件與程式碼在整個流程確定沒問題後就可以刪除。
(5)同(4)。
(6)針對每一個珠子做掉落判定。
(7)當找到屬性為Null時。
(8)往珠子的上方搜尋。
(9)當找到非Null屬性的珠子時。
(10)把當前珠子屬性設定為該珠子的屬性。
(11)將該珠子設定為Null屬性。
(12)設定完屬性就代表該珠子掉落完成,結束往上搜尋的迴圈。

以上就是珠子消除、落下和生成的說明,之後或許會有程式碼修改,但邏輯上應該是不會變的,到這裡初始化盤面就算完成了,接下來是轉珠的部分。
這次就到這裡。

1 則留言:

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...