一焚虱、 掃雷游戲?qū)崿F(xiàn)核心思路解析
數(shù)據(jù)和視圖盡量分離。采用面向?qū)ο蟮膶?shí)現(xiàn)設(shè)計(jì)數(shù)據(jù)模塊懂版。格子作為一類對(duì)象鹃栽,雷場(chǎng)作為一類對(duì)象,雷場(chǎng)由格子構(gòu)成躯畴。
二民鼓、 掃雷游戲核心數(shù)據(jù)模塊
1. Cell.js單元格類
2. MineField.js雷場(chǎng)類
【1】畫格子
雷場(chǎng)由Cell的對(duì)象構(gòu)成的數(shù)組組成,實(shí)質(zhì)就是給雷場(chǎng)的cells數(shù)組賦值蓬抄。
【2】藏地雷
實(shí)質(zhì)就是修改雷場(chǎng)的cells數(shù)組中的隨機(jī)一些索引的cell的info屬性值丰嘉。
【3】留暗號(hào)
實(shí)質(zhì)就是在地雷周邊8個(gè)格子中標(biāo)上數(shù)字,數(shù)值為此單元格周邊8個(gè)單元格中雷的數(shù)量嚷缭。如下圖所示:
【3-1】獲取某顆地雷周圍所有單元格
如下圖所示供嚎,假如要獲取(0,0)周圍8個(gè)單元格峭状,則偏移量就
是其周邊8個(gè)單元格的坐標(biāo):
同時(shí)克滴,偏移后,我們還要判斷這個(gè)格子是否超出雷場(chǎng)优床。即便宜后x劝赔、y值不能小于0,且不能大于行或列的最大值胆敞。
偏移量offset和判斷是否超出雷場(chǎng)區(qū)域的方法如下:
【3-2】更新所有地雷周圍所有非雷(數(shù)字)單元格的數(shù)字標(biāo)記
三着帽、 ArrayUtils.js數(shù)組工具類(直接使用)
四杂伟、 數(shù)據(jù)校驗(yàn)測(cè)試
1. Game_mgr.js掛載到Canvas節(jié)點(diǎn)上
掛載到Canvas節(jié)點(diǎn)上,運(yùn)行測(cè)試結(jié)果如下:
2. 優(yōu)化測(cè)試-驗(yàn)證數(shù)據(jù)正確與否
發(fā)現(xiàn)顯示結(jié)果不便于核實(shí)數(shù)據(jù)是否正確仍翰,我們優(yōu)化下赫粥,在MineField中添加printResult方法:
五、 數(shù)據(jù)與視圖綁定
新建一個(gè)空節(jié)點(diǎn)MineField作為雷場(chǎng)予借,將res中的block拖到MineField內(nèi)越平,作為地磚,在block節(jié)點(diǎn)內(nèi)新建空節(jié)點(diǎn)around_bombs灵迫,在此節(jié)點(diǎn)上添加Label組件秦叛,用于顯示此地磚的信息info。之后將block做成預(yù)制體瀑粥,便于動(dòng)態(tài)生成雷場(chǎng)所有地磚挣跋。
動(dòng)態(tài)生成的過(guò)程中,將每個(gè)地磚跟MineField的cells數(shù)組中的元素綁定狞换。
在Game_mgr.js的properties中添加屬性避咆,同時(shí)通過(guò)編輯器綁定屬性值:
編譯運(yùn)行,結(jié)果如下:
將信息顯示到地磚上:
block.cell = this.mineField.cells[index];
// 顯示地磚內(nèi)部信息
this.showBlockInnerInfo(block);
信息顯示到地磚上的實(shí)現(xiàn)方法(便于后續(xù)觸摸調(diào)用):
// 顯示地磚內(nèi)部信息
showBlockInnerInfo(block){
block.getChildByName("around_bombs").getComponent(cc.Label).string = block.cell.info;
},
編譯運(yùn)行結(jié)果如下:
仔細(xì)思考修噪,發(fā)現(xiàn)剛才Game_mgr.js其實(shí)就是控制MineField這個(gè)節(jié)點(diǎn)的查库,故我們將其修改為MineField_Ctrl.js。將Canvas上的用戶自定義組件remove割按,在MineField節(jié)點(diǎn)上添加MineField_Ctrl組件膨报,將其中block_root屬性去掉磷籍,將代碼中this.block_root替換為this.node适荣。
點(diǎn)擊鏈接加入群聊【Unity/Cocos交流群】