boardgame-phaser/QWEN.md

71 lines
2.0 KiB
Markdown
Raw Normal View History

2026-04-06 11:22:33 +08:00
# boardgame-phaser
基于Phaser3/boardgame-core的游戏框架
## 概述
项目使用pnpm monorepo管理包含以下包
- `framework`:通用框架
- `boop-game`boop样例
- `sample-game`tic tac toe样例
游戏应当使用vite构建基于`preact/signals`进行状态管理,使用`phaser3`实现游戏功能。
## boardgame-core
项目使用`boardgame-core`进行游戏定义。
`boardgame-core`的内容可以在`framework/node_modules/boardgame-core`找到。
这个文件夹被.gitignore忽略查看时需要绕开这一限制。
2026-04-06 13:59:00 +08:00
## 编写Phaser App
使用`framework/src/ui/PhaserBridge`来创建Phaser App。
使用`framework/src/scenes/GameHostScene`来创建游戏场景。
使用`GameHost`来控制游戏状态。
```typescript
export class GameHost<TState extends Record<string, unknown>, TResult=unknown> {
// 获取游戏状态的只读快照
get state(): TState{}
2026-04-07 16:29:08 +08:00
// 获取随机数
get rng(): ReadonlyRNG{}
2026-04-06 13:59:00 +08:00
// 运行状态
readonly status: ReadonlySignal<GameHostStatus>;
// 运行中途需要玩家输入时使用
readonly activePromptSchema: ReadonlySignal<CommandSchema | null>;
readonly activePromptPlayer: ReadonlySignal<string | null>;
// 玩家响应activePrompt的输入若报错则返回string否则返回null
2026-04-06 16:17:37 +08:00
// promptDef应当从game module中导出
tryAnswerPrompt<TArgs extends any[]>(promptDef: Promptdef<TArgs>,...args: TArgs): string | null {}
2026-04-06 13:59:00 +08:00
// 添加中断context.produceAsync会等待所有中断结束之后再继续
addInterruption(promise: Promise<void>): void {}
// 开始或者重新开始游戏
2026-04-07 16:29:08 +08:00
start(seed?: number): Promise<TResult>{}
2026-04-06 13:59:00 +08:00
// 销毁
dispose(): void {}
// 事件侦听
on(event: 'start' | 'dispose', listener: () => void): () => void {}
}
2026-04-08 08:50:45 +08:00
```
使用`Spawner`来创建动态游戏对象:
- 卡牌
- 棋子
- UI高亮提示对象
使用`MutableSignal`创建状态信号。
```typescript
import {MutableSignal} from "boardgame-core"
export const x = MutableSignal(0);
x.produce(x => x + 1);
2026-04-06 13:59:00 +08:00
```