HarmonyOS小游戲項(xiàng)目—數(shù)獨(dú)Sudoku(六)
??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??
前言
本期筆者將在游戲內(nèi)導(dǎo)入更多題目,并實(shí)現(xiàn)游戲處于關(guān)卡選擇頁面時(shí)進(jìn)入不同關(guān)卡的頁面跳轉(zhuǎn)邏輯。
正文
利用xml布局創(chuàng)建UI
打開entry>src>main>resouce>base>graphic,并在graphic目錄下新創(chuàng)建一個(gè)xml文件(可以通過復(fù)制粘貼graphic目錄下的其他xml文件來實(shí)現(xiàn)),將其命名為select_text.xml,最后在文件內(nèi)將代碼修改為如下:
接著,在graphic目錄下再次新創(chuàng)建一個(gè)xml文件,將其命名為select_text_exit.xml,并在文件內(nèi)添加如下代碼:
這樣以后,我們就完成了兩類組件背景元素的創(chuàng)建,而這兩類組件背景元素所實(shí)現(xiàn)的UI效果是:當(dāng)組件處于被點(diǎn)擊的狀態(tài)時(shí),組件改變顏色;當(dāng)組件未處于被點(diǎn)擊的·狀態(tài)時(shí),組件保持初始的顏色。
之后,打開entry>src>main>resouce>base>layout,并在layout目錄下新創(chuàng)建一個(gè)xml文件(可以通過復(fù)制粘貼layout目錄下的其他xml文件來實(shí)現(xiàn)),將其命名為select.xml。
最后在文件內(nèi)將代碼修改為如下:
這樣以后,我們就完成了基本的組件布局,當(dāng)然,此xml文件在后文是要與關(guān)卡選擇界面相綁定的。此時(shí)可以打開previewer預(yù)覽UI效果。
在SelectAbilitySlice內(nèi)完善交互邏輯
打開先前創(chuàng)建的SelectAbilitySlice(目錄路徑:entry\src\main\java\com.example.project\slice\SelectAbilitySlice),將代碼修改為如下:
在此次的代碼添加中,筆者先是擴(kuò)展了SelectAbilitySlice的框架,并將SelectAbilitySlice與select.xml綁定,這樣以后SelectAbilitySlice就可以顯示select.xml內(nèi)設(shè)定的布局元素;接著,我們?cè)趏nActive()函數(shù)內(nèi)聲明了已在select.xml設(shè)定的6個(gè)text組件,并為每個(gè)text組件都設(shè)定了點(diǎn)擊監(jiān)聽器;最后,我們創(chuàng)建了一個(gè)intent對(duì)象,并在每個(gè)text對(duì)象的點(diǎn)擊監(jiān)聽器內(nèi)加入指令:將需要傳遞的數(shù)字信息以字符串的形式儲(chǔ)存在inent中,并調(diào)用present()函數(shù)執(zhí)行頁面跳轉(zhuǎn)(從SelectAbilitySlice跳轉(zhuǎn)至新創(chuàng)建的GameAbilitySlice)。由于intent是兩個(gè)AbilitySlice的信息傳遞媒介,故當(dāng)頁面導(dǎo)航至新生成的GameAbilitySlice時(shí),GameAbilitySlice可以接收到來自SelectAbilitySlice的intent,而這個(gè)intent也是攜帶重要的數(shù)字信息的(點(diǎn)擊不同的text組件,intent所攜帶的數(shù)字信息也不同)。關(guān)于intent的接收,筆者將在后文闡述。
完成上述操作后,我們打開MainAbilitySlice,設(shè)置其頁面導(dǎo)航路由,使得我們?cè)谥鹘缑纥c(diǎn)擊“開始游戲”后,系統(tǒng)界面可以從主界面跳轉(zhuǎn)至關(guān)卡選擇界面:
再打開MainAbility,將PageAbility默認(rèn)展示界面改為InitialAbilitySlice:
完成以上操作后,我們可以打開模擬機(jī)查看效果:當(dāng)界面跳轉(zhuǎn)至游戲的主界面時(shí),我們點(diǎn)擊“開始游戲”,游戲則會(huì)跳轉(zhuǎn)到關(guān)卡選擇的畫面。
點(diǎn)擊:
導(dǎo)入更多的數(shù)獨(dú)題目
在GameAbilitySlice合適的位置加入如下八個(gè)數(shù)組(局部變量),其中,前四個(gè)數(shù)組用做數(shù)獨(dú)題答案,后四個(gè)數(shù)組則將用于題目的初始化、與用戶交互。
之后,定義一個(gè)新的二維數(shù)組grids_initial(可以是局部變量也可以是局部變量):
先找到之前用于創(chuàng)建網(wǎng)格區(qū)域的二重for循環(huán):
然后進(jìn)行如下修改(即將數(shù)組grid_c0改為數(shù)組grids_initial):
這樣以后,grids_initial就作為唯一用于生成游戲題目的數(shù)組變量了。
最后,刪除之前在onStart()函數(shù)內(nèi)添加的以下賦值代碼:
獲取intent
終于來到最后一個(gè)環(huán)節(jié)了。在前文的內(nèi)容中,我們已經(jīng)實(shí)現(xiàn)了一個(gè)功能:系統(tǒng)從SelectAbilitySlice導(dǎo)航至GameAbilitySlice時(shí),GameAbilitySlice可以接收到包含數(shù)字信息的intent。
那么如何獲取intent中的信息呢?如下列代碼所示,我們通過getStringParam方法接收從SelectAbilitySlice傳入的intent,并提取其攜帶的字符串信息(其所對(duì)應(yīng)的鍵是"level"),再將此字符串轉(zhuǎn)化為整形數(shù)據(jù),最后存儲(chǔ)在一個(gè)新聲明的整型變量L中。因?yàn)閕ntent中存儲(chǔ)的字符串代表用戶想要進(jìn)入的關(guān)卡,所以在得到L以后,我們通過switch來判斷用戶點(diǎn)擊的是第幾關(guān),并將對(duì)應(yīng)關(guān)卡的題目與答案分別賦給三個(gè)數(shù)組變量:grids_win,grids_input與grids_initial。
這樣以后,當(dāng)用戶進(jìn)入不同關(guān)卡時(shí),GameAbilitySlice的題目會(huì)根據(jù)grids_initial初始化,判斷游戲成功與否的Gamesuccess()函數(shù)也會(huì)獲取對(duì)應(yīng)的信息與成功條件,我們也就實(shí)現(xiàn)了游戲處于關(guān)卡選擇頁面時(shí)進(jìn)入不同關(guān)卡的頁面跳轉(zhuǎn)邏輯與功能。
此時(shí)我們可以打開模擬器查看交互效果:
點(diǎn)擊“第二關(guān)”:
進(jìn)入第二關(guān):
結(jié)語
本期的內(nèi)容就先分享到這里,更多關(guān)于數(shù)獨(dú)小游戲項(xiàng)目精彩的內(nèi)容我將在下期繼續(xù)為大家揭曉。