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 {}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|