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