骑士之旅:一款关于流氓(国际象棋)骑士的游戏

主要观点:作者制作了名为 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); }
阅读 8
0 条评论