关于 Writing Phaser 3 Games
这项 Phaser 3 游戏开发 Skill 面向需要实用实现模式的开发者。18 个主题文件涵盖场景、物理、输入、动画、性能等系统,并提供代码示例及常见问题提示。
主要功能
- 0118 个主题模式指南
- 02场景架构与转场
- 03物理、碰撞和移动模式
- 04输入、动画与状态管理
- 05对象池和性能技巧
- 06代码组织与常见问题
适用场景
- 01规划多场景 Phaser 游戏
- 02实现键盘、指针或触摸输入
- 03构建基于网格的游戏逻辑
- 04排查性能或内存问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tomcoolpxl/ sugar-splat --skill writing-phaser-3-games安装后在 Claude Code 中输入/writing-phaser-3-games确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
knowledgebase/01-scene-architecture.md05-animation-system.md03-physics-collision.md02-asset-management.md08-object-pooling-memory.md09-grid-systems.md06-input-handling.md04-movement-patterns.md10-custom-game-objects.md07-state-management.md13-audio-integration.md12-tween-visual-effects.md15-algorithm-implementations.md11-ui-hud-patterns.md16-performance-optimization.mdTOC.md14-game-loop-patterns.md17-code-organization.md18-development-philosophy.md详细介绍
Phaser 3 游戏开发技能
快速入门
最常见的模式
多场景流程
const config = {
scene: [ Boot, Preloader, MainMenu, Game, GameOver ]
};
// Boot → Preloader → MainMenu → Game → GameOver
对象池
create() {
this.projectiles = this.physics.add.group({
classType: Projectile,
frameQuantity: 20,
active: false,
visible: false
});
}
fire() {
const projectile = this.projectiles.getFirstDead(false);
if (projectile) projectile.fire(x, y);
}
全局动画
// In Preloader.js create()
this.anims.create({
key: 'walk',
frames: this.anims.generateFrameNumbers('player', { start: 0, end: 3 }),
frameRate: 10,
repeat: -1
});
JustDown 输入
if (Phaser.Input.Keyboard.JustDown(this.spacebar)) {
this.jump();
}
导航指南
如何使用此技能
此技能提供 18 个全面的模式文件,涵盖 Phaser 3 开发的所有方面。每个文件都包含详细的模式、代码示例和最佳实践。
查找特定模式:
# Read a specific topic
Read knowledgebase/06-input-handling.md
# Search for a pattern across all files
grep -r "object pooling" knowledgebase/
# Find patterns by keyword
grep -i "animation" knowledgebase/*.md
grep -i "collision" knowledgebase/*.md
按编号快速查找:
- 01 = 场景架构
- 02 = 资源管理
- 03 = 物理与碰撞
- 04 = 移动模式
- 05 = 动画系统
- 06 = 输入处理
- 07 = 状态管理
- 08 = 对象池与内存
- 09 = 网格系统
- 10 = 自定义游戏对象
- 11 = UI/HUD 模式
- 12 = 补间与视觉效果
- 13 = 音频集成
- 14 = 游戏循环模式
- 15 = 算法实现
- 16 = 性能优化
- 17 = 代码组织
- 18 = 开发理念
目录
1. 场景架构
knowledgebase/01-scene-architecture.md
多场景流程、用于 UI 叠加层的并行场景、带效果的场景过渡、场景间传递数据。
关键模式:
- Boot → Preloader → MainMenu → Game → GameOver 流程
- 使用
scene.launch()启动并行 UI 场景 - 摄像机淡入淡出过渡
- 通过
init(data)传递场景数据
2. 资源管理
knowledgebase/02-asset-management.md
分阶段加载、纹理图集、多格式音频、字体同步。
关键模式:
- 在 Boot 中加载引导资源,在 Preloader 中加载完整资源
- 使用纹理图集加载多个精灵
- 使用多格式音频确保浏览器兼容性
- 同步加载 WebFont
3. 物理与碰撞
knowledgebase/03-physics-collision.md
物理配置、碰撞与重叠、动态响应、基于状态的碰撞。
关键模式:
- 使用 Collider 实现物理阻挡,使用 overlap 实现触发
- 基于位置的动态响应(球拍击球)
- 基于状态检查碰撞
- 隔离各轨道/图层的碰撞
4. 移动模式
knowledgebase/04-movement-patterns.md
基于速度、基于时间的离散移动、基于计时器的移动、追逐、方向验证、屏幕环绕。
关键模式:
- 连续动作游戏使用基于速度的移动
- 网格游戏使用基于时间的离散移动
- 回合制游戏使用基于计时器的移动
- 方向验证(防止 180° 转向)
5. 动画系统
knowledgebase/05-animation-system.md
创建全局动画、反向动画、动画驱动逻辑、基于状态的控制。
关键模式:
- 在 Preloader 中创建一次动画,随处使用
- 使用动画事件同步游戏流程
- 使用缓存进行基于状态的动画控制
- 外部动画 JSON 数据
6. 输入处理
knowledgebase/06-input-handling.md
键盘、指针、触摸、JustDown 模式、双输入支持、输入门控、清理。
关键模式:
- 使用 JustDown 检测单次按键
- 同时支持键盘和指针输入
- 在动画期间进行输入门控
- 通过事件驱动指针移动
- 使用
once()处理一次性输入
7. 状态管理
knowledgebase/07-state-management.md
场景级状态、用于持久化的 registry、localStorage、GameObject 数据组件、状态机。
关键模式:
- 使用构造函数配置,使用 init() 重置状态
- 使用 Registry 存储跨场景数据
- 使用 GameObject 数据组件存储自定义属性
- 布尔标志与状态机
8. 对象池与内存
knowledgebase/08-object-pooling-memory.md
基于分组的对象池、启用/禁用模式、对象复用、动态纹理清理。
关键模式:
- 使用
frameQuantity预创建对象,使用getFirstDead()回收对象 - 启用/禁用对象,而不是创建/销毁对象
- 可复用对象的重置模式
- 防止动态纹理清理
9. 网格系统
knowledgebase/09-grid-systems.md
双坐标、二维数组、邻接辅助方法、网格对齐、可视化。
关键模式:
- 将网格坐标与像素坐标分开
- 使用带边界检查的二维数组
- 邻接辅助方法(8 个方向、4 个方向)
- 创建与网格对齐的组
10. 自定义游戏对象
knowledgebase/10-custom-game-objects.md
扩展 Sprite/Image、组合模式、扩展组、自注册。
关键模式:
- 需要物理和动画时扩展 Sprite
- 为带物理效果的静态精灵扩展 Image
- 为非可视管理器使用组合模式
- 动画需要调用
super.preUpdate()
11. UI/HUD 模式
knowledgebase/11-ui-hud-patterns.md
文本样式、定位、动态更新、位图字体、图标计数器、分层。
关键模式:
- 使用文本原点进行定位(左上角、中心等)
- 使用补间动画实现计数器动画
- 基于图标的计数器(爱心、生命)
- 使用深度/z-ordering 对 UI 分层
12. 补间与视觉效果
knowledgebase/12-tween-visual-effects.md
基础补间、交错动画、编排序列、摄像机效果、粒子。
关键模式:
- 使用补间回调进行序列编排
- 网格交错动画
- 使用不断累加的延迟编排序列
- 摄像机抖动、闪光、淡入淡出
- 粒子发射器
13. 音频集成
knowledgebase/13-audio-integration.md
音效管理、音频锁处理、集中式音频、延迟/序列音频。
关键模式:
- 加载多种格式的音频
- 检测并处理音频锁
- 在 UI 场景中集中管理音频
- 在不同场景间持续播放音乐
14. 游戏循环模式
knowledgebase/14-game-loop-patterns.md
标准更新、最简事件驱动模式、自定义对象的 preUpdate、委托、计时器。
关键模式:
- 在 update() 中使用提前退出保护
- 回合制游戏使用事件驱动模式
- 使用计时器实现重复或单次事件
- 将更新委托给管理器
15. 算法实现
knowledgebase/15-algorithm-implementations.md
泛洪填充、智能随机放置、可解谜题生成、邻近度计算、跟随链、AI。
关键模式:
- 使用 4 个方向扩展的递归泛洪填充
- 收集有效位置,确保放置成功
- 使用 Walker 算法生成可解谜题
- 使用 ShiftPosition 实现跟随链
16. 性能优化
knowledgebase/16-performance-optimization.md
对象池、纹理缓存、尽量减少更新逻辑、事件驱动、静态组。
关键模式:
- 对象池可消除 GC 暂停
- 对不可移动对象使用静态组
- 在 update() 中优先使用事件驱动,而不是轮询
- 使用纹理图集提升渲染性能
17. 代码组织
knowledgebase/17-code-organization.md
文件结构、ES6 模块、常量管理、关注点分离。
关键模式:
- 创建 scenes、gameobjects、managers、utils、constants 文件夹
- 使用 ES6 模块导入
- 使用常量文件管理精灵/动画/音频键
- 在 create() 中明确初始化顺序
18. 开发理念
knowledgebase/18-development-philosophy.md
架构原则、何时使用物理引擎、场景选择、更新与事件、渐进式难度。
关键模式:
- 何时使用物理引擎,何时使用手动逻辑
- 单场景、多场景与并行场景
Update()与事件驱动方法- 渐进式难度模式
核心模式参考
场景设置
export default class Game extends Phaser.Scene {
constructor() {
super('Game');
// Configuration constants
this.GRID_SIZE = 32;
}
init() {
// Reset resettable state
this.score = 0;
this.gameOver = false;
}
create() {
// Initialize objects
this.player = new Player(this);
this.enemies = this.physics.add.group();
// Setup collisions
this.physics.add.collider(this.player, this.enemies, this.onHit, null, this);
}
update(time, delta) {
if (this.gameOver) return;
// Game logic
}
}
自定义游戏对象
export default class Player extends Phaser.Physics.Arcade.Sprite {
constructor(scene, x, y) {
super(scene, x, y, 'player');
// Self-register
scene.add.existing(this);
scene.physics.add.existing(this);
// Configuration
this.setCollideWorldBounds(true);
this.isAlive = true;
}
preUpdate(time, delta) {
super.preUpdate(time, delta); // ESSENTIAL for animations
if (!this.isAlive) return;
this.handleMovement();
}
}
网格系统
// Dual coordinate system
this.gridX = 5;
this.gridY = 3;
this.sprite.x = this.gridX * TILE_SIZE;
this.sprite.y = this.gridY * TILE_SIZE;
// 2D array with bounds checking
getCellXY(x, y) {
if (x < 0 || x >= this.width || y < 0 || y >= this.height) {
return null;
}
return this.grid[y][x];
}
碰撞处理
// Physical collision
this.physics.add.collider(player, platforms);
// Trigger-based overlap
this.physics.add.overlap(player, coins, this.collectCoin, null, this);
// Collision with state gates
onHit(player, enemy) {
if (!player.isAlive) return;
if (player.invincible) return;
if (enemy.alpha < 1) return;
this.handleDamage(player, enemy);
}
输入模式
create() {
// Cursor keys
this.cursors = this.input.keyboard.createCursorKeys();
// Specific key
this.spacebar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE);
// Pointer/touch
this.input.on('pointerdown', this.handleClick, this);
}
update() {
// Continuous input
if (this.cursors.left.isDown) {
this.player.setVelocityX(-160);
}
// Single-press input
if (Phaser.Input.Keyboard.JustDown(this.spacebar)) {
this.jump();
}
}
动画设置
// In Preloader create() - global animations
this.anims.create({
key: 'player-walk',
frames: this.anims.generateFrameNumbers('player', { start: 0, end: 3 }),
frameRate: 10,
repeat: -1
});
// In Game create() - use animations
this.player.play('player-walk');
// Animation events
this.player.on('animationcomplete-attack', this.spawnProjectile, this);
状态管理
// Scene-level state
init() {
this.score = 0;
this.lives = 3;
this.gameOver = false;
}
// Registry for cross-scene data
this.registry.set('highscore', this.score);
const highscore = this.registry.get('highscore');
// GameObject data
sprite.setData({ gridX: 5, gridY: 3, type: 'enemy' });
const gridX = sprite.data.values.gridX;
常见问题
应避免的严重错误:
-
在自定义精灵中忘记调用
super.preUpdate(time, delta)- 没有这一步,动画将无法正常工作
- 务必在
preUpdate()中第一时间调用
-
缩放静态组后未调用
refreshBody()this.platforms.create(x, y, 'platform') .setScale(2) .refreshBody(); // REQUIRED -
在
update()中创建对象,而不是使用对象池- 会导致 GC 停顿和性能下降
- 预先创建对象池,通过启用/禁用来回收对象
-
访问网格时缺少边界检查
if (x < 0 || x >= width || y < 0 || y >= height) return null; -
未清理监听器/计时器
shutdown() { this.input.off('pointerdown', this.handleClick); if (this.timer) this.timer.remove(); } -
使用了错误的碰撞方法
- 需要物理阻挡时使用
collider - 触发器/拾取物使用
overlap
- 需要物理阻挡时使用
-
事件即可处理,却在
update()中轮询- 使用物理重叠检测,而非距离检查
- 使用指针事件,而非每帧检查
-
使用硬编码值,而非常量
// Bad: magic numbers sprite.x = 400; // Good: named constants const GRID_SIZE = 32; sprite.x = gridX * GRID_SIZE; -
未在
init()中重置状态- 场景重启将无法正常工作
- 将所有可重置状态放入
init(),而非构造函数
-
忽略回调中的上下文绑定
// 使用箭头函数或 bind this.time.delayedCall(1000, () => this.start(), [], this);
性能提示
- 频繁创建/销毁的对象使用对象池
- 使用纹理图集将精灵合并到单张图片中
- 不可移动的平台/墙体使用静态组
- 优先使用事件驱动,而非在
update()中轮询 - 尽量减少更新逻辑——每帧只处理必要内容
- 缓存查找结果——不要每帧搜索数组
- 深度只设置一次——不要每帧排序
何时阅读详细文件
开始开发新游戏? → 阅读 01-scene-architecture.md
遇到性能问题? → 阅读 16-performance-optimization.md
开发基于网格的游戏? → 阅读 09-grid-systems.md
处理复杂动画? → 阅读 05-animation-system.md 和 12-tween-visual-effects.md
遇到输入问题? → 阅读 06-input-handling.md
遇到内存泄漏? → 阅读 08-object-pooling-memory.md
实现算法? → 阅读 15-algorithm-implementations.md
进行架构决策? → 阅读 18-development-philosophy.md
速查表
场景流程
Boot → Preloader → MainMenu → Game → GameOver
this.scene.start('NextScene', { score: this.score });
this.scene.launch('GameUI'); // Parallel scene
物理引擎
this.physics.add.collider(a, b); // Physical blocking
this.physics.add.overlap(a, b, callback); // Trigger only
sprite.setCollideWorldBounds(true);
sprite.setImmovable(true);
组与对象池
this.items = this.physics.add.group({ frameQuantity: 20 });
const item = this.items.getFirstDead(false);
item.enableBody(true, x, y, true, true);
item.disableBody(true, true);
输入
this.cursors = this.input.keyboard.createCursorKeys();
Phaser.Input.Keyboard.JustDown(key)
this.input.on('pointerdown', callback, this);
补间动画
this.tweens.add({
targets: sprite,
x: 400,
duration: 1000,
ease: 'Power2',
onComplete: () => {}
});
摄像机
this.cameras.main.shake(duration, intensity);
this.cameras.main.fadeOut(duration);
this.cameras.main.flash(duration, r, g, b);
此技能提供全面的 Phaser 3 模式。请阅读知识库中的详细文件,了解深入示例和高级技巧。