import Phaser from 'phaser'; import { effect, type ReadonlySignal } from '@preact/signals-core'; import type { GameHost } from 'boardgame-core'; import { DisposableBag, type IDisposable } from '../utils'; type CleanupFn = void | (() => void); export interface GameHostSceneOptions> { gameHost: GameHost; } export abstract class GameHostScene> extends Phaser.Scene implements IDisposable { protected disposables = new DisposableBag(); protected gameHost!: GameHost; addInterruption(promise: Promise){ this.gameHost?.addInterruption(promise); } init(data: GameHostSceneOptions): void { this.gameHost = data.gameHost; } create(): void { this.events.on('shutdown', this.dispose, this); } dispose(): void { this.disposables.dispose(); } /** 获取当前状态的只读快照 */ public get state(): TState { return this.gameHost.state.value; } /** 注册响应式监听(场景关闭时自动清理) */ protected watch(fn: () => CleanupFn): void { this.disposables.add(effect(fn)); } }