学习目标:掌握使用Claude Code独立完成一款HTML5游戏的全流程——从概念设计、项目搭建、核心玩法编码、资源管线、到测试发布。读完本教程,你将能在一个下午内交付一款可玩的浏览器游戏。
适用人群:有基础JavaScript经验、对游戏开发感兴趣的开发者;已有Claude Code使用经验、想探索游戏方向的AI编程用户。
2026年4月,开源项目Claude Code Game Studios引爆社区——它用49个专项Agent、72个工作流Skill,将单次Claude Code会话转变为一个完整的游戏工作室。同一时期,开发者用Claude Code在一天内构建了3款HTML5 Canvas游戏,从太空射击到平台跳跃,全部可玩。
Claude Code在游戏开发场景的核心优势:
| 能力 | 传统方式 | Claude Code方式 |
|---|---|---|
| 游戏循环编写 | 手写requestAnimationFrame、状态机 | 一句Prompt生成完整Game Loop |
| 碰撞检测 | 查文档、手写AABB/SAT算法 | 直接生成优化过的碰撞系统 |
| 资源处理 | 手动压缩、生成精灵图 | 调用Skill自动管线 |
| 跨文件重构 | 害怕改崩、手动追踪依赖 | 全项目理解、一次性重构 |
| 调试渲染 | console.log坐标值 | Playwright截图+视觉快照 |
# Claude Code CLI(确保最新版)
claude --version # 需要 >= 1.0.40
# Node.js 环境
node --version # >= 20.x
# 本地HTTP服务器(用于测试)
npm install -g http-server
# 可选:Phaser 3(2D游戏框架)
mkdir my-game && cd my-game
npm init -y
npm install phaser
Claude Code的游戏开发生态已经非常成熟,多个社区Skill可以直接安装:
# 进入Claude Code交互模式
claude
# 安装Web游戏开发Skill(内置Playwright测试)
/install-skill web-game-developer
# 安装游戏资源生成Skill(精灵图、像素画)
/install-skill game-asset-sprite-generator
# 可选:安装Phaser专项Skill
/install-skill phaser-game-development
Claude Code对项目结构敏感。游戏项目推荐以下布局:
my-game/
├── CLAUDE.md # 项目级指令(关键!)
├── index.html # 入口页面
├── src/
│ ├── main.js # 游戏入口
│ ├── scenes/
│ │ ├── BootScene.js # 加载场景
│ │ ├── MenuScene.js # 主菜单
│ │ └── GameScene.js # 游戏主场景
│ ├── entities/
│ │ ├── Player.js # 玩家实体
│ │ └── Enemy.js # 敌人实体
│ ├── systems/
│ │ ├── CollisionSystem.js
│ │ └── ScoreSystem.js
│ └── utils/
│ └── helpers.js
├── assets/
│ ├── sprites/
│ ├── audio/
│ └── maps/
├── tests/
│ └── game.test.js
└── package.json
CLAUDE.md是Claude Code理解你游戏项目的关键。针对游戏开发,它需要包含特定的约束信息。
# My Awesome Game
## 项目概述
一款使用Phaser 3开发的2D太空射击游戏,目标平台为现代浏览器。
## 技术栈
- Phaser 3.80+
- ES Modules(无打包工具,直接在浏览器运行)
- 原生JavaScript(不用TypeScript)
## 游戏架构
- 使用Phaser Scene系统管理游戏状态
- 实体使用Phaser内置Physics(Arcade Physics)
- 分数系统使用事件驱动模式
## 代码规范
- 每个Scene一个文件,放在src/scenes/下
- 实体类继承Phaser.GameObjects.Sprite
- 坐标系:左上角(0,0),Y轴向下
- 碰撞检测使用Arcade Physics的overlap/collide
## 性能约束
- 目标帧率:60fps
- 同屏精灵上限:200
- 单张精灵图不超过256x256
- 音效使用Web Audio API
## 禁止事项
- 不要使用Phaser 2的API
- 不要引入构建工具(Webpack/Vite)
- 不要使用class私有字段语法(#field)
为什么这样写? 游戏开发中,坐标系约定、物理引擎选择、性能指标这些信息如果不写在CLAUDE.md里,Claude Code每次都会"猜"——可能用错坐标系、选错物理引擎、生成性能不达标的代码。
claude -p "根据CLAUDE.md中的技术栈,生成一个Phaser 3太空射击游戏的完整骨架:
1. index.html加载ES Module
2. src/main.js创建Phaser.Game实例,注册BootScene/MenuScene/GameScene
3. BootScene加载资源并显示进度条
4. MenuScene显示标题和开始按钮
5. GameScene初始化物理引擎、创建星空背景滚动
请确保所有文件都完整可运行。"
预期输出:Claude Code会生成5个文件,每个文件约50-100行。index.html会正确配置<script type="module">,main.js会设置Phaser配置。
常见问题:
| 问题 | 原因 | 解决方案 |
|---|---|---|
Phaser is not defined |
未正确引入Phaser | 在index.html中用<script>标签全局加载Phaser CDN |
| 场景切换黑屏 | BootScene未调用this.scene.start() |
检查Scene的create()方法 |
| ES Module跨域错误 | 直接用file://打开HTML | 使用http-server启动本地服务 |
进入交互模式,逐步构建玩法:
claude
> 在GameScene中实现玩家飞船控制:
> 1. 飞船在屏幕底部,可用方向键/WASD移动
> 2. 飞船面朝上,不能移出屏幕边界
> 3. 按空格键发射子弹,子弹向上飞行
> 4. 子弹离开屏幕后自动回收(对象池)
> 5. 射击间隔200ms,按住空格连射
Claude Code会生成src/entities/Player.js,包含完整的输入处理和对象池。关键代码片段:
// src/entities/Player.js
export class Player extends Phaser.GameObjects.Sprite {
constructor(scene, x, y) {
super(scene, x, y, 'player');
scene.add.existing(this);
scene.physics.add.existing(this);
this.lastShot = 0;
this.bullets = scene.physics.add.group({
classType: Phaser.GameObjects.Image,
maxSize: 30,
runChildUpdate: true
});
}
update(time, delta) {
const speed = 300;
const cursors = this.scene.cursors;
const keys = this.scene.keys;
if (cursors.left.isDown || keys.A.isDown) {
this.body.setVelocityX(-speed);
} else if (cursors.right.isDown || keys.D.isDown) {
this.body.setVelocityX(speed);
} else {
this.body.setVelocityX(0);
}
// 射击逻辑(对象池复用)
if (keys.SPACE.isDown && time > this.lastShot + 200) {
const bullet = this.bullets.get(this.x, this.y - 20, 'bullet');
if (bullet) {
bullet.setActive(true);
bullet.setVisible(true);
bullet.body.setVelocityY(-600);
this.lastShot = time;
}
}
// 子弹回收
this.bullets.getChildren().forEach(b => {
if (b.active && b.y < -10) {
this.bullets.killAndHide(b);
}
});
}
}
> 现在添加敌人系统:
> 1. 创建Enemy类,从屏幕顶部随机位置生成
> 2. 三种敌人类型:小型(快速低血)、中型(中速中血)、大型(慢速高血)
> 3. 波次系统:每波难度递增(敌人数量+速度+血量)
> 4. 波次间有3秒倒计时提示
> 请遵循ECS模式,将数据与逻辑分离
Claude Code生成的波次配置:
// src/systems/WaveSystem.js
export const ENEMY_TYPES = {
scout: { hp: 1, speed: 200, score: 100, frame: 'enemy-small' },
fighter:{ hp: 3, speed: 120, score: 250, frame: 'enemy-medium' },
cruiser:{ hp: 8, speed: 60, score: 500, frame: 'enemy-large' }
};
export class WaveSystem {
constructor(scene) {
this.scene = scene;
this.wave = 0;
this.waveConfig = this.generateWaveConfig();
}
generateWaveConfig() {
this.wave++;
return {
scout: Math.floor(3 + this.wave * 2),
fighter: Math.max(0, Math.floor(this.wave * 1.5 - 2)),
cruiser: Math.max(0, Math.floor(this.wave * 0.5 - 1)),
speedMultiplier: 1 + this.wave * 0.1,
hpMultiplier: 1 + this.wave * 0.15
};
}
spawnWave() {
const config = this.waveConfig;
const enemies = [];
for (const [type, count] of Object.entries(config)) {
if (count <= 0) continue;
for (let i = 0; i < count; i++) {
const delay = Phaser.Math.Between(0, 3000);
this.scene.time.delayedCall(delay, () => {
const template = ENEMY_TYPES[type];
const x = Phaser.Math.Between(40, 760);
enemies.push(this.createEnemy(type, template, x));
});
}
}
return enemies;
}
}
> 添加完整的游戏反馈系统:
> 1. 子弹与敌人碰撞:敌人扣血、子弹销毁、受击闪烁
> 2. 敌人被消灭:爆炸粒子特效 + 分数飘字
> 3. 玩家与敌人碰撞:玩家死亡、屏幕震动、游戏结束
> 4. HUD显示:当前分数、波次、生命值
> 使用Phaser内置粒子系统和Tween动画
碰撞系统核心逻辑:
// src/systems/CollisionSystem.js
export class CollisionSystem {
constructor(scene, player, waveSystem, scoreSystem) {
this.scene = scene;
this.setupCollisions(player, waveSystem, scoreSystem);
}
setupCollisions(player, waveSystem, scoreSystem) {
// 子弹 vs 敌人
this.scene.physics.add.overlap(
player.bullets,
waveSystem.enemyGroup,
(bullet, enemy) => {
this.bulletHitEnemy(bullet, enemy, scoreSystem);
}
);
// 敌人 vs 玩家
this.scene.physics.add.overlap(
player,
waveSystem.enemyGroup,
(_, enemy) => {
this.enemyHitPlayer(player, enemy);
}
);
}
bulletHitEnemy(bullet, enemy, scoreSystem) {
player.bullets.killAndHide(bullet);
enemy.hp--;
// 受击闪烁
this.scene.tweens.add({
targets: enemy,
alpha: 0.3,
duration: 50,
yoyo: true
});
if (enemy.hp <= 0) {
this.spawnExplosion(enemy.x, enemy.y);
scoreSystem.addScore(enemy.scoreValue, enemy.x, enemy.y);
enemy.destroy();
}
}
}
游戏开发最大的痛点之一是资源处理。Claude Code通过Skill和脚本自动化这一流程。
在游戏原型阶段,不需要美工资源。用Claude Code直接生成:
> 为我的太空射击游戏生成所有占位资源:
> 1. 用Canvas API绘制32x32的玩家飞船(蓝色三角形+引擎光效)
> 2. 三种敌人精灵(红/橙/紫色飞船轮廓)
> 3. 子弹精灵(4x12发光弹丸)
> 4. 星空背景tile(64x64,深蓝渐变+白色星点)
> 5. 爆炸动画帧(8帧,32x32橙色扩展圆)
> 输出为PNG文件到assets/sprites/目录
Claude Code会生成一个Node.js脚本,使用Canvas API绘制所有资源:
// scripts/generate-assets.mjs
import { createCanvas } from 'canvas';
import fs from 'fs';
function drawPlayerShip() {
const canvas = createCanvas(32, 32);
const ctx = canvas.getContext('2d');
// 飞船主体
ctx.fillStyle = '#4488ff';
ctx.beginPath();
ctx.moveTo(16, 2);
ctx.lineTo(28, 28);
ctx.lineTo(16, 22);
ctx.lineTo(4, 28);
ctx.closePath();
ctx.fill();
// 引擎光效
ctx.fillStyle = '#ffaa00';
ctx.beginPath();
ctx.moveTo(10, 28);
ctx.lineTo(16, 32);
ctx.lineTo(22, 28);
ctx.closePath();
ctx.fill();
fs.writeFileSync('assets/sprites/player.png', canvas.toBuffer('image/png'));
}
// ... 其他资源生成函数
drawPlayerShip();
安装Game Asset Pipeline Skill后,可以建立自动化管线:
# 触发资源优化管线
claude -p "运行游戏资源管线:
1. 扫描assets/sprites/下所有PNG,压缩到85%质量
2. 检查精灵图尺寸是否为2的幂次方
3. 生成spritesheet.json(帧动画描述文件)
4. 音效文件转换为Web Audio兼容格式
5. 输出资源清单到assets/manifest.json"
Claude Code最强大的游戏测试能力是通过Playwright进行视觉验证。
// tests/game-visual.test.js
import { test, expect } from '@playwright/test';
test('游戏启动并显示主菜单', async ({ page }) => {
await page.goto('http://localhost:8080');
await page.waitForTimeout(2000); // 等待Phaser加载
// 截图验证菜单渲染
await expect(page).toHaveScreenshot('menu.png', {
maxDiffPixelRatio: 0.05
});
});
test('点击开始后进入游戏场景', async ({ page }) => {
await page.goto('http://localhost:8080');
await page.waitForTimeout(1000);
// 点击开始按钮
await page.click('canvas', { position: { x: 400, y: 350 } });
await page.waitForTimeout(1500);
// 验证玩家飞船存在
const hasPlayer = await page.evaluate(() => {
return window.__phaserGame?.scene
.getScene('GameScene')?.player?.active;
});
expect(hasPlayer).toBe(true);
});
test('射击并消灭敌人', async ({ page }) => {
await page.goto('http://localhost:8080');
await page.waitForTimeout(1000);
await page.click('canvas');
await page.waitForTimeout(1500);
// 按住空格射击3秒
await page.keyboard.down('Space');
await page.waitForTimeout(3000);
await page.keyboard.up('Space');
// 验证分数变化
const score = await page.evaluate(() => {
return window.__phaserGame?.scene
.getScene('GameScene')?.scoreSystem?.score;
});
expect(score).toBeGreaterThan(0);
});
# 在Claude Code中执行
claude -p "启动http-server在8080端口,然后运行Playwright测试验证游戏的三种场景:
1. 主菜单渲染正确
2. 游戏启动后玩家可移动
3. 射击系统正常工作
截图保存到tests/screenshots/目录"
Claude Code会自动启动服务器、运行Playwright、分析截图结果,如果发现问题会自动修复代码并重测。
当游戏复杂度上升,可以使用Claude Code的Subagent系统并行开发。
graph TB
PM[主Agent<br/>游戏总监] --> A1[Agent 1<br/>场景系统]
PM --> A2[Agent 2<br/>战斗系统]
PM --> A3[Agent 3<br/>UI/HUD]
PM --> A4[Agent 4<br/>音效系统]
PM --> A5[Agent 5<br/>测试验证]
A1 --> S1[src/scenes/<br/>场景管理]
A2 --> S2[src/systems/<br/>碰撞+武器]
A3 --> S3[src/ui/<br/>分数+菜单]
A4 --> S4[src/audio/<br/>音效管理器]
A5 --> S5[tests/<br/>E2E测试]
S1 --> INT[集成测试]
S2 --> INT
S3 --> INT
S4 --> INT
style PM fill:#ff6b6b,color:#fff
style A1 fill:#4ecdc4,color:#fff
style A2 fill:#4ecdc4,color:#fff
style A3 fill:#4ecdc4,color:#fff
style A4 fill:#4ecdc4,color:#fff
style A5 fill:#ffe66d,color:#333
# 为每个系统创建隔离的Worktree
claude
> 使用Task工具并行开发以下模块(每个用worktree隔离):
>
> Agent 1(worktree: feature-scenes):
> - 实现Boss战场景
> - Boss有3种攻击模式
> - 血条显示在屏幕顶部
>
> Agent 2(worktree: feature-powerups):
> - 道具系统:三连射、护盾、炸弹
> - 道具从被消灭的敌人随机掉落
> - 道具持续5秒后消失
>
> Agent 3(worktree: feature-audio):
> - 使用Web Audio API实现音效管理器
> - 射击、爆炸、道具拾取音效
> - 背景音乐循环播放
> - 音量控制接口
>
> 三个Agent完成后自动合并到main分支。
每个Agent在独立的Git Worktree中工作,互不干扰:
sequenceDiagram
participant User as 开发者
participant Main as 主Agent
participant A1 as Agent:Boss战
participant A2 as Agent:道具系统
participant A3 as Agent:音效
User->>Main: 启动并行开发
Main->>A1: 创建worktree<br/>分配Boss战任务
Main->>A2: 创建worktree<br/>分配道具任务
Main->>A3: 创建worktree<br/>分配音效任务
par 并行执行
A1->>A1: 开发Boss AI
A2->>A2: 开发道具逻辑
A3->>A3: 开发音效管理
end
A1->>Main: 完成PR #1
A2->>Main: 完成PR #2
A3->>Main: 完成PR #3
Main->>Main: 合并+集成测试
Main->>User: 全部就绪
> 分析我的Phaser游戏的性能问题:
> 1. 检查对象池是否正确回收(不应该new新对象)
> 2. 检查渲染批处理(纹理切换次数)
> 3. 检查碰撞检测范围(是否启用了不必要的碰撞对)
> 4. 分析GC压力(是否有频繁创建临时对象)
> 5. 输出优化建议并直接修复
// 优化前:每帧创建新Vector(GC噩梦)
update() {
const velocity = new Phaser.Math.Vector2(0, 0); // ❌ 每帧new
if (this.cursors.left.isDown) velocity.x = -300;
this.body.setVelocity(velocity.x, velocity.y);
}
// 优化后:复用预分配对象
export class Player extends Phaser.GameObjects.Sprite {
constructor(scene, x, y) {
super(scene, x, y, 'player');
this._velocity = { x: 0, y: 0 }; // ✅ 预分配
}
update() {
this._velocity.x = 0;
this._velocity.y = 0;
if (this.cursors.left.isDown) this._velocity.x = -300;
this.body.setVelocity(this._velocity.x, this._velocity.y);
}
}
Claude Code会扫描整个项目找出类似模式并批量修复。
> 准备游戏发布:
> 1. 所有JS文件合并为单个bundle(不用打包工具,用简单concat)
> 2. 内联所有小于10KB的资源为base64
> 3. 生成单个index.html(零依赖,双击可运行)
> 4. 同时部署到Cloudflare Pages
> 5. 输出可分享的URL
Claude Code可以生成一个完全自包含的HTML文件——所有代码、样式、资源内联在一个文件里:
claude -p "将游戏打包为单个HTML文件:
- 所有JS代码内联到<script>标签
- 精灵图转为base64内联
- 音效转为base64内联
- 添加离线缓存Service Worker
- 压缩HTML输出到dist/game.html
文件大小控制在2MB以内"
flowchart LR
A[游戏概念<br/>Prompt描述] --> B[骨架生成<br/>claude -p]
B --> C[玩法迭代<br/>交互模式]
C --> D[资源生成<br/>Canvas脚本]
D --> E[系统开发<br/>Subagent并行]
E --> F[视觉测试<br/>Playwright]
F --> G{通过?}
G -->|否| H[自动修复<br/>重测]
H --> F
G -->|是| I[性能优化<br/>对象池+GC]
I --> J[单文件打包<br/>base64内联]
J --> K[部署发布<br/>Cloudflare Pages]
style A fill:#e8f5e9
style K fill:#c8e6c9
style H fill:#ffcdd2
| 阶段 | 命令模式 | 预计耗时 |
|---|---|---|
| 概念→骨架 | claude -p "生成游戏骨架..." |
2分钟 |
| 玩法编码 | 交互模式,逐系统对话 | 20分钟 |
| 资源生成 | claude -p "用Canvas API生成..." |
3分钟 |
| 并行开发 | Task工具 + Worktree | 10分钟 |
| 测试验证 | Playwright自动截图 | 3分钟 |
| 性能调优 | claude -p "分析性能..." |
5分钟 |
| 打包部署 | claude -p "单文件打包..." |
2分钟 |
总计:一个下午,从零到可玩到可分享。
Claude Code可能在同一个项目中混用Phaser 2和Phaser 3的API。解决方案:
<!-- CLAUDE.md -->
## 关键约束
- 使用Phaser 3.80+,严禁Phaser 2 API
- 不使用Phaser.Physics.P2(已废弃)
- 不使用Phaser.Loader.Parser(3.x已重构)
2D游戏中Y轴方向是常见混淆点。明确写在CLAUDE.md:
## 坐标系
- 屏幕坐标系:左上角(0,0),X右增,Y下增
- "向上"= Y值减小
- 画布尺寸:800x600
Claude Code可能把游戏逻辑放在create()而非update()中。检查清单:
claude -p "审查所有Scene文件,确认:
1. 只在create()中做初始化
2. 所有每帧逻辑在update()中
3. 没有在update()中创建新对象(应该用对象池)
4. 所有定时器使用scene.time.addEvent而非setTimeout"
Phaser的Arcade Physics需要在配置中显式启用:
// main.js — 确保物理引擎配置正确
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
physics: {
default: 'arcade',
arcade: {
gravity: { y: 0 }, // 太空游戏无重力
debug: false // 发布时关闭调试
}
},
scene: [BootScene, MenuScene, GameScene]
};
| 框架 | 适合场景 | Claude Code支持度 | 学习曲线 |
|---|---|---|---|
| 原生Canvas | 小游戏、学习项目 | 优秀(直接生成) | 低 |
| Phaser 3 | 2D商业游戏 | 优秀(有专属Skill) | 中 |
| Three.js | 3D浏览器游戏 | 良好 | 高 |
| p5.js | 创意编码、艺术游戏 | 优秀(有algorithmic-art Skill) | 低 |
| PixiJS | 高性能2D渲染 | 良好 | 中 |
| 训练营类型 | 适配度 | 教学时长 | 建议 |
|---|---|---|---|
| AI编程入门营 | ★★★★★ | 4小时 | 用原生Canvas路线,降低框架学习成本 |
| 游戏开发速成营 | ★★★★★ | 8小时 | 完整走完本教程,每人交付一款可玩游戏 |
| Claude Code深度营 | ★★★★☆ | 3小时 | 重点讲Subagent并行和Playwright测试 |
| Web全栈训练营 | ★★★☆☆ | 2小时 | 作为趣味项目,展示AI编程的可能性 |
| 少儿编程营 | ★★★★☆ | 3小时 | 适合12岁以上,用p5.js路线更友好 |
推荐教学节奏: 1. 第一小时:环境搭建 + CLAUDE.md配置 + 骨架生成(Step 1-3) 2. 第二小时:核心玩法实现——玩家控制、射击、敌人(Step 4-5) 3. 第三小时:碰撞系统、分数、特效 + Playwright视觉测试(Step 6-7) 4. 第四小时:性能优化 + 打包部署 + 学员自由创作(Step 8-9)
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
