boardgame-phaser/packages/framework/src/scenes/GameHostScene.ts

56 lines
1.5 KiB
TypeScript

import Phaser from 'phaser';
import { effect } from '@preact/signals-core';
import type { GameHost } from 'boardgame-core';
import { DisposableBag, type IDisposable } from '../utils';
type CleanupFn = void | (() => void);
export interface GameHostSceneOptions<TState extends Record<string, unknown>> {
gameHost: GameHost<TState>;
}
export abstract class GameHostScene<TState extends Record<string, unknown>>
extends Phaser.Scene
implements IDisposable
{
protected disposables = new DisposableBag();
private _gameHost!: GameHost<TState>;
public get gameHost(): GameHost<TState> {
return this._gameHost;
}
public get state(): TState {
return this.gameHost?.state.value;
}
addInterruption(promise: Promise<void>){
this.gameHost?.addInterruption(promise);
}
addTweenInterruption(tween: Phaser.Tweens.Tween){
this.addInterruption(new Promise(
resolve => tween.once('complete', resolve)
));
}
init(data: GameHostSceneOptions<TState>): void {
this._gameHost = data.gameHost;
}
create(): void {
this.events.on('shutdown', this.dispose, this);
}
dispose(): void {
this.disposables.dispose();
}
public addDisposable(disposable: IDisposable){
this.disposables.add(disposable);
}
/** 注册响应式监听(场景关闭时自动清理) */
public addEffect(fn: () => CleanupFn): void {
this.disposables.add(effect(fn));
}
}