58 lines
1.8 KiB
Markdown
58 lines
1.8 KiB
Markdown
# 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忽略,查看时需要绕开这一限制。
|
||
|
||
## 编写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{}
|
||
// 获取随机数
|
||
get rng(): ReadonlyRNG{}
|
||
|
||
// 运行状态
|
||
readonly status: ReadonlySignal<GameHostStatus>;
|
||
|
||
// 运行中途需要玩家输入时使用
|
||
readonly activePromptSchema: ReadonlySignal<CommandSchema | null>;
|
||
readonly activePromptPlayer: ReadonlySignal<string | null>;
|
||
|
||
// 玩家响应activePrompt的输入,若报错则返回string,否则返回null
|
||
// promptDef应当从game module中导出
|
||
tryAnswerPrompt<TArgs extends any[]>(promptDef: Promptdef<TArgs>,...args: TArgs): string | null {}
|
||
|
||
// 添加中断,context.produceAsync会等待所有中断结束之后再继续
|
||
addInterruption(promise: Promise<void>): void {}
|
||
|
||
// 开始或者重新开始游戏
|
||
start(seed?: number): Promise<TResult>{}
|
||
|
||
// 销毁
|
||
dispose(): void {}
|
||
|
||
// 事件侦听
|
||
on(event: 'start' | 'dispose', listener: () => void): () => void {}
|
||
}
|
||
``` |