OpenHarmony羊了個羊復刻學習
一、明確玩法
演示視頻:https://www.bilibili.com/video/BV1ig41127T3。
開源地址:https://gitee.com/cheng-wan-orz/olgh。
- 通過點擊選擇對應的目標
- 點擊目標后界面中消失,移動到欄中
- 當目標連續(xù)湊夠三個(左或右),進行消除
- 第一層消除后顯示出第二層
- 當儲存欄滿了后失敗
二、簡易邏輯搭建
因為這個內(nèi)容是半個下午實現(xiàn)的(拖到現(xiàn)在才發(fā)而已),僅僅搭建了框架,若有大的問題也請大家諒解,該內(nèi)容僅做學習使用。
(1)確定層數(shù)、欄目數(shù)以及種類
在這里我選擇使用兩層、4種類型,總個數(shù)36個,界面選擇6*6的方格,下面存儲的格數(shù)選擇為6個(PS:本來打算3層8種60個,后來嫌麻煩)。
(2)建立類型標志
這里選擇使用單維36數(shù)組,代表總數(shù)36個,其中1-4代表四種類型,此時將數(shù)組進行打亂。
此時經(jīng)過打亂后得到一個隨機的數(shù)組排序,即實現(xiàn)完全隨機的游戲體驗。
(3)建立層次
在得到打亂后的數(shù)組后需要進行分層,此時使用隨機數(shù)。
得到第一層是[0,10]+10,即得到一個10-20的數(shù)作為第一層的個數(shù)。
(4)位置排序
在確定第一層和第二層數(shù)目以及整體類型數(shù)組后,需要考慮怎么樣進行隨機位置的擺放,單純的按數(shù)排序是我們不希望看到的,這里引入坐標的概念,因為我使用的是6*6的單元格,這里創(chuàng)建一個36成員的數(shù)組。
此時進行第一次打亂,同樣使用打亂函數(shù)。
打亂后即可得到一個亂序的位置排序,此時將第一層的內(nèi)容進行放入即可。
(5)建立棋盤
在位置和類型確定后建立棋盤。
將上方確定的內(nèi)容進行導入,此時fisrt_set和Second_set代表兩層棋盤的擺放情況。
(6)點擊判定
點擊判定這里簡化為坐標實現(xiàn)(具體實現(xiàn)看下午技術(shù)部分),通過6*6單元格的分析,當點擊后得到一個XY軸,此時首先判斷該層數(shù)的XY軸處有沒有放置圖片,如果有則讀取當前點的類型(1-4),并將其消除進入消除判定。
(7)消除判定
當點擊到類型后,該圖片進入欄目中,此時需要對欄目進行判定,是否出現(xiàn)連續(xù)三個的情況,引入一維數(shù)組。
當點擊判定后,首先判斷當前第一位是否存在,沒有的話點擊的內(nèi)容成為第一位,有的話成為第二位。
在前兩位都存在的情況下,判斷前三位是否一致,一致的話消除,不一致的話成為第三位。
當前三位的存在的情況下,判斷第二第三和點擊的是否一致,不一致判斷第一第二和點擊的項目是否一致,都不一致則成為第四位,一致則消除。
當欄目數(shù)為5的情況下,且點擊項目左右都不一致,則游戲失敗(判斷程序如下)。
(8)第一層完成
每次操作后都判斷一次棋盤數(shù)組是否都為0,如果都為0的話代表當前層數(shù)被清空,進入下一層。
三、OpenHarmony程序編寫
我們主要使用到了Canvas畫布組件:https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/reference/arkui-ts/ts-components-canvas-canvas.md/。
Canvas
說明: 該組件從API Version 8開始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標單獨標記該內(nèi)容的起始版本。
提供畫布組件,用于自定義繪制圖形。
(1)主要函數(shù)
drawImage
drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number): void
drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number, dWidth: number, dHeight: number): void
drawImage(image: ImageBitmap | PixelMap, sx: number, sy: number, sWidth: number, sHeight: number, dx: number, dy: number, dWidth: number, dHeight: number):void
進行圖像繪制。
- 參數(shù)
參數(shù) | 類型 | 必填 | 默認值 | 描述 |
image | ??ImageBitmap???或??PixelMap?? | 是 | null | 圖片資源,請參考ImageBitmap或PixelMap。 |
sx | number | 否 | 0 | 裁切源圖像時距離源圖像左上角的x坐標值。 |
sy | number | 否 | 0 | 裁切源圖像時距離源圖像左上角的y坐標值。 |
sWidth | number | 否 | 0 | 裁切源圖像時需要裁切的寬度。 |
sHeight | number | 否 | 0 | 裁切源圖像時需要裁切的高度。 |
dx | number | 是 | 0 | 繪制區(qū)域左上角在x軸的位置。 |
dy | number | 是 | 0 | 繪制區(qū)域左上角在y 軸的位置。 |
dWidth | number | 否 | 0 | 繪制區(qū)域的寬度。 當繪制區(qū)域的寬度和裁剪圖像的寬度不一致時,將圖像寬度拉伸或壓縮為繪制區(qū)域的寬度。 |
dHeight | number | 否 | 0 | 繪制區(qū)域的高度。 當繪制區(qū)域的高度和裁剪圖像的高度不一致時,將圖像高度拉伸或壓縮為繪制區(qū)域的高度。 |
clearRect
clearRect(x: number, y: number, w: number, h: number): void
刪除指定區(qū)域內(nèi)的繪制內(nèi)容。
- 參數(shù)
參數(shù) | 類型 | 必填 | 默認值 | 描述 |
x | number | 是 | 0 | 指定矩形上的左上角x坐標。 |
y | number | 是 | 0 | 指定矩形上的左上角y坐標。 |
width | number | 是 | 0 | 指定矩形的寬度。 |
height | number | 是 | 0 | 指定矩形的高度。 |
fillRect
fillRect(x: number, y: number, w: number, h: number): void
填充一個矩形。
- 參數(shù)
參數(shù) | 類型 | 必填 | 默認值 | 說明 |
x | number | 是 | 0 | 指定矩形左上角點的x坐標。 |
y | number | 是 | 0 | 指定矩形左上角點的y坐標。 |
width | number | 是 | 0 | 指定矩形的寬度。 |
height | number | 是 | 0 | 指定矩形的高度。 |
(2)游戲開局渲染
導入背景圖片:
(3)設置單元格
我的模擬器參數(shù)為:
所以設置單元格大小為100*100,圖片大小為80x80,同時需要確定下方的欄的坐標位置(可自行摸索)。
(4)開局兩層擺放
由第二部分內(nèi)容確定邏輯,即可實現(xiàn)游戲初始的渲染部分。
(5)點擊判定
該部分是引入onTouch函數(shù),得到對應的XY軸坐標,再進行分析得到6*6單元格的坐標進行判定。
事件
名稱 | 是否冒泡 | 功能描述 |
onTouch(callback: (event?: TouchEvent) => void) | 是 | 觸摸動作觸發(fā)該方法調(diào)用,event參數(shù)見??TouchEvent??介紹。 |
得到坐標后需要判斷是否為單元格區(qū)域,如果超出該區(qū)域則不進行響應。
(6)第二層繪制
當通過第一層時,因為在第一層和第二層之間有一個灰色圖層。需要進行一次全局刷新,此時通過提前記錄的第一次生成的數(shù)據(jù),進行一次更新即可。
(7)游戲成功
如果正確游戲且通過的話,會提示游戲成功(因為有較大的隨機性,不一定一定成功哦,下一期會教大家怎么使用背景音樂!)