主要观点:作者制作了名为 Knight Ride 的简单谜题游戏,用 Godot 学习游戏开发后将一个项目的机制转化为浏览器游戏,游戏通过移动骑士在棋盘上到达目标并捕获棋子得分,阐述了游戏开发过程中的各种技术实现细节,包括使用 HTML、JS、SVGs 和 Sounds,处理棋盘布局、棋子位置、合法移动、状态管理、视觉与逻辑分离、添加各种奖励和音效等,还提到了在不同浏览器上遇到的音效问题及解决方案,源代码可在 Github 上获取。
关键信息:
- 游戏玩法:在有随机敌人棋子和目标方块的棋盘上移动骑士,捕获不同棋子得不同分数,到达目标时分数乘剩余移动次数进入下一关。
- 技术实现:从 Wikipedia 获取 SVG 格式棋子,用 CSS grid layout 布局棋盘,通过 2D 数组表示棋盘计算合法移动,用全局 state 对象存储游戏状态,直接操作 DOM 同步状态变化,添加各种奖励如 streak bonus 和清理棋盘 bonus,使用 soundjs 库解决 Safari 上的音效问题。
- 遇到问题:在 Safari 上音效播放存在延迟和不播放的问题,iOS 上默认无声需翻转物理铃声开关。
重要细节:
- 棋子移动的偏移量定义:
const moveOffsets = [ { row: -2, col: -1 }, { row: -2, col: 1 }, { row: -1, col: -2 }, { row: -1, col: 2 }, { row: 1, col: -2 }, { row: 1, col: 2 }, { row: 2, col: -1 }, { row: 2, col: 1 } ];
- 检查合法移动的方式:
gameState.possibleMoves.some(move => move.row === row && move.col === col)
- 确定单元格是否有敌人棋子的方法:
const capturePiece = newCell.querySelector('.piece:not([data-type="knight"])');
- 播放音效的代码:
gameState.sounds[soundKey].currentTime = 0; gameState.sounds[soundKey].play().catch(e => console.log("Audio play error:", e));
及预注册音效文件的代码:for (const [soundID, sound] of Object.entries(gameState.sounds)) { createjs.Sound.registerSound(sound, soundID); }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。