
??想了解更多關于開源的內容,請訪問:??
??51CTO 開源基礎軟件社區??
??https://ost.51cto.com??
一、引言
大家也經常看到市面上有斗地主,麻將,飛行棋等不是很復雜的棋類游戲;然后作為沒有開發過游戲的我,在思考一款游戲是如何開發的?
于是就想在openharmony 上嘗試一下。
最近發現一個有意思的棋類游戲 軍棋翻翻棋。
它是軍棋游戲的拓展玩法,風靡民間,膾炙人口。主要形式為2人游戲,輪流翻起軍棋確定陣營,最后根據軍棋玩法走棋獲勝。該游戲除了掌握軍棋的基本玩法外,還需要一些運氣和創造性思維方能取勝,妙趣橫生。
二、部分效果圖

三、實現思路
本次重點在于分享我的思路和方法;具體市面上大多游戲是不是這套思路我也不知道;完全自己我構想。
無論是什么語言應該都是分二大塊:游戲圖像的繪制,邏輯的運算處理。
1、游戲的繪制
openharmony 里面是用canvas的繪制 把各種圖像用數據記錄下來,當前狀態及位置 最后用繪制API繪制。
保存數據的結構,無非都是 數組,二維數組,集合,HashMap,隊列這些;語言不同,編寫方式有點差異。
openharmony 是如何選擇的可以參考下文:
??openharmony 軍棋開發帶你了解如何選擇數據結構-開源基礎軟件社區-51CTO.COM??
2、邏輯的運算處理
整體代碼流程
觸摸點有效性 -----》移動可行性 -----》fire有效性 -----》游戲結束or繼續。
下面是openharmony 實現的參考代碼。
用戶觸摸到canvas時,對坐標點的判斷。
Canvas(this.context)
.width('100%')
.height('100%')
.onReady(() => {
this.isReady = true
this.canvasDraw(Code.INIT, 0, 0)
}).onTouch((event) => {
let clickPoint = this.checkValidClickPoint(event)
Logger.d(TAG, `onTouch click ${JSON.stringify(clickPoint)}`)
if (clickPoint[0] != -1 && clickPoint[1] != 6) {
this.chessListManager.clickPoint(clickPoint[0], clickPoint[1])
}
})
檢測用戶手指觸摸時該點的有效性。
private checkValidClickPoint(event?: TouchEvent) {
let clickPoint = [-1, -1]
if (event) {
let touches = event.touches
if (touches.length == 1) {
let etype = event.type
if (etype === TouchType.Down.valueOf()) {
this.downTouchXY[0] = touches[0].x
this.downTouchXY[1] = touches[0].y
} else if (etype === TouchType.Up.valueOf()) {
let tx = touches[0].x
let ty = touches[0].y
let cx = Math.abs(this.downTouchXY[0] - tx)
let cy = Math.abs(this.downTouchXY[1] - ty)
if (cx < 30 && cy < 30) { // 有效位置
// 計算 具體的 poinrtx ,poinrty 位置
let poinrtx = Math.floor((tx - this.marginRight + this.cellColumnCentrePadding / 2) / this.cellColumnCentrePadding)
let poinrty = Math.floor((ty - this.marginTop + this.cellRowCentrePadding / 2) / this.cellRowCentrePadding)
let validXMin = this.marginRight + this.cellColumnCentrePadding * poinrtx - CHESS_WIDTH / 2 + 3
let validXMax = validXMin + CHESS_WIDTH - 6
let validYMin = this.marginTop + this.cellRowCentrePadding * poinrty - CHESS_HEIGHT / 2 + 3
let validYMax = validYMin + CHESS_HEIGHT - 6
if (tx >= validXMin && tx <= validXMax) {
if (ty >= validYMin && ty <= validYMax) {
clickPoint[0] = poinrtx
clickPoint[1] = poinrty
}
}
}
}
}
}
return clickPoint
}
返回的坐標點是合理的將進入觸摸流程。
let clickPoint = this.checkValidClickPoint(event)
Logger.d(TAG, `onTouch click ${JSON.stringify(clickPoint)}`)
if (clickPoint[0] != -1 && clickPoint[1] != 6) {
this.chessListManager.clickPoint(clickPoint[0], clickPoint[1])
}

移動判斷還是比較復雜的,里面還涉及到工兵的特殊性。

大小判斷。

四、總結
1,根據效果,其實openharmony 開發游戲類的還是達不到商用要求的。
2,本文根據該場景可以很好的了解openharmony的一些基礎,如canvas的繪制,數據結構,代碼風格。
3,openharmony 在動畫上目前基本屬于雞肋。
4,基本按照上面思維在其他更適合游戲開發上,斗地主,麻將等其他棋類也是大同小異。
??想了解更多關于開源的內容,請訪問:??
??51CTO 開源基礎軟件社區??
??https://ost.51cto.com??