mcpField
P
phaser-gamedev

phaser-gamedev

github.com/chongdashu开发8649 次安装40 周前更新
代码仓库

关于 phaser-gamedev

面向使用 Phaser 3 开发 2D 浏览器游戏的编码 Agent 技能,涵盖场景架构、物理系统和资源加载规范,并提供针对精灵表、瓦片地图与性能的参考指南。

主要功能

  1. 01Phaser 3 场景架构指导
  2. 02Arcade 与 Matter 物理选择
  3. 03精灵表尺寸与间距检查
  4. 04瓦片地图和碰撞参考
  5. 05性能与对象池建议

适用场景

  1. 01规划游戏场景及场景切换
  2. 02检查精灵表加载参数
  3. 03选择物理系统与碰撞方案
  4. 04排查性能问题并使用对象池

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/chongdashu/phaserjs-oakwoods --skill phaser-gamedev

安装后在 Claude Code 中输入/phaser-gamedev确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
arcade-physics.md
performance.md
spritesheets-nineslice.md
tilemaps.md

详细介绍

Phaser 游戏开发

使用 Phaser 3 基于场景的架构和物理系统,构建 2D 浏览器游戏。


停止:加载任何精灵表之前

请先阅读 spritesheets-nineslice.md。

精灵表加载很脆弱——几像素的偏差就会造成静默损坏,并逐步累积,最终导致画面出错。参考文件中包含必须遵循的检查流程。

快速规则(详见参考文件):

  1. 先测量资源,再编写加载器代码——绝不要猜帧尺寸
  2. 角色精灵使用正方形帧:如果计算得出 frameWidth=56,先尝试将高度也设为 56
  3. 不同动画的帧尺寸各不相同:跑步循环需要比待机更宽的帧;攻击动作需要为武器挥动留出额外宽度。分别测量每个精灵表
  4. 检查间距:帧与帧之间的空隙需要在加载器配置中设置 spacing: N
  5. 验证计算结果:imageWidth = (frameWidth × cols) + (spacing × (cols - 1))

参考文件

开始处理相关功能之前,请先阅读:

工作内容首先阅读
加载任何精灵表spritesheets-nineslice.md
九宫格 UI 面板spritesheets-nineslice.md
Tiled 瓦片地图、碰撞图层tilemaps.md
物理参数调校、分组、对象池arcade-physics.md
性能问题、对象池performance.md

架构决策(尽早确定)

物理系统选择
系统适用场景
Arcade平台游戏、射击游戏和大多数 2D 游戏。AABB 碰撞检测速度快
Matter物理谜题、布娃娃效果、真实感碰撞。速度较慢,但精度更高
无菜单场景、视觉小说、卡牌游戏
场景结构
scenes/
├── BootScene.ts      # Asset loading, progress bar
├── MenuScene.ts      # Title screen, options
├── GameScene.ts      # Main gameplay
├── UIScene.ts        # HUD overlay (launched parallel)
└── GameOverScene.ts  # End screen, restart
场景切换
this.scene.start('GameScene', { level: 1 });     // Stop current, start new
this.scene.launch('UIScene');                     // Run in parallel
this.scene.pause('GameScene');                    // Pause
this.scene.stop('UIScene');                       // Stop

核心模式

游戏配置
const config: Phaser.Types.Core.GameConfig = {
  type: Phaser.AUTO,
  width: 800,
  height: 600,
  scale: {
    mode: Phaser.Scale.FIT,
    autoCenter: Phaser.Scale.CENTER_BOTH
  },
  physics: {
    default: 'arcade',
    arcade: { gravity: { y: 300 }, debug: false }
  },
  scene: [BootScene, MenuScene, GameScene]
};
场景生命周期
class GameScene extends Phaser.Scene {
  init(data) { }      // Receive data from previous scene
  preload() { }       // Load assets (runs before create)
  create() { }        // Set up game objects, physics, input
  update(time, delta) { }  // Game loop, use delta for frame-rate independence
}
与帧率无关的移动
// CORRECT: scales with frame rate
this.player.x += this.speed * (delta / 1000);

// WRONG: varies with frame rate
this.player.x += this.speed;

反模式

反模式问题解决方案
在 window 上存放全局状态场景切换会破坏状态使用场景数据、注册表
在 create() 中加载资源引用资源时资源尚未就绪在 preload() 中加载,并使用 Boot 场景
按帧计数游戏速度会随 FPS 改变使用 delta / 1000
为简单碰撞使用 Matter复杂度不必要Arcade 可处理大多数 2D 游戏
一个庞大的场景难以扩展分离游戏、UI 和菜单
魔法数字无法调整平衡使用配置对象、常量
不使用对象池GC 导致卡顿使用带有 setActive(false) 的分组

请记住

Phaser 提供了强大的基础组件——场景、精灵、物理、输入——但架构由你负责。

编码之前,请先考虑:有哪些场景?有哪些实体?它们如何交互?使用什么物理模型?

Claude 可以构建完整、精良的 Phaser 游戏。这些指南为你指明方向,而不是设下限制。

评论

支持 Markdown