1. 程式人生 > >(藍圖)虛幻4重製俄羅斯方塊(一)二維陣列構建地圖

(藍圖)虛幻4重製俄羅斯方塊(一)二維陣列構建地圖

老規矩,先上效果圖

(一)內容簡介:

主要就是在藍圖中利用結構體宣告,設定,呼叫二(多)維陣列(矩陣)

最終構建出俄羅斯方塊的整塊畫布

(二)建立資源

GameMode和PlayerController

內容瀏覽器中右鍵建立這兩個東西並命名

右邊世界設定裡面設定GameMode和PlayerController為剛才自己建立的兩個,如果沒有世界設定,在左上角視窗中可以設定

BP_Blocks

新建一個Actor類,開啟並新增一個立方體(Cube)元件,這個就是地圖和方塊的基本單位

接下來定義兩個函式,一個顯示方塊一個隱藏方塊,注意別打錯√

S_A_Col_Array

建立一個結構體變數,將裡面的元素型別該為整型和Array(陣列)形式

這個變數是最重要的記錄了整個地圖的資料,後面主要圍繞這個變數展開

S_Block_Col_Arry

同樣的方法,再建立一個結構體變數,不過型別是Actor陣列

這個結構體後面將用來儲存方塊,和前面的S_A_Col_Array結構體建立一一對應的關係,A數組裡面不等於0就顯示方塊

(三)建立二維陣列

開啟剛才建立好的PlayerController藍圖,因為遊戲並不是很複雜,所以以後的操作都在這個裡面進行,後面就不贅述了

1.增加兩個變數,length(長度)和width(寬度),我是以水平方向為長的(這個長表示哪條邊一定要分辨開來,不然很容易亂),設定預設值length=12,width=24

為什麼設定這個值看下圖就一目瞭然了,後面對陣列序號不理解的時候就回頭看這個圖

 再建立兩個變數,型別是剛才我們建立的兩個結構體,同時改成陣列型別

 ReStart函式

新建一個函式命名為ReStart,用來初始化地圖,方便後面遊戲結束後重新開始遊戲

解釋一下,之前建立的A_Col_Array陣列中存放的就是一行中的元素,第一個resize設定A中有24個元素,就相當於存放了24行,

而第二個resize設定了每一行的元素數量為14,後面的Blocks和A陣列道理是一樣的,後面就不囉嗦了

在上面的遍歷結束後,接下來遍歷設定A陣列全部元素為0(特別小心一定是連Completed,這裡可能沒事後面就要出大問題)

這樣ReStart函式就暫時完成了,後續如果還需要增加再補充說明,可能有些囉嗦,但等下一章介紹了巨集之後,上圖裡面很多的迴圈就會變成下面這樣,程式碼將會變得很簡潔

BulidMap函式

接下來是構造地圖函式BulidMap,spawn中的class設定成最開始建立的BP_Blocks的Actor

生成方塊,新增到陣列不難理解,這個地方關鍵是為什麼要遍歷A,用A的index 設定

目的還是想使A陣列和Blocks陣列建立一一對應的聯絡,第一個Foreachloop其實遍歷的行,第一行,第二行。。。而第二個遍歷的是一行的列,第一行第一列、第一行第二列。。。

比如第一次執行的時候,第一個index為0,後面獲取的Block陣列的index也是0,第二個foreachloop會執行12次,那麼就生成了12個方塊的同時,添加了12個方塊到Block陣列的第0個元素中,於是Block第0個元素就成了一個有12個元素的陣列

不囉嗦了,自行體會吧,直接事件列表中執行這兩個函式看一下效果

沒問題的話就這個樣子了,可能你覺得一個數組就能搞定,沒有這麼麻煩,恩,也這麼認為,但是可控性不太好,燒腦。。。

(四)總結:

多維陣列在Java,C++,Python等非視覺化程式語言中,不管是定義還是實用都挺簡單的,一句話搞定,但到了藍圖這裡感覺變得複雜了,只能通過結構體來轉一道,也沒辦法,既然是視覺化程式設計,強調的就是一個視覺化上,命名,圖,函式,變數,一目瞭然,大概就這樣子吧,

下一篇講述巨集的運用,和根據地圖陣列A的數值來顯示和隱藏方塊。