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