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

70 lines
1.7 KiB
TypeScript
Raw Normal View History

2026-04-12 16:26:52 +08:00
import Phaser from 'phaser';
import { effect } from '@preact/signals-core';
import { DisposableBag, type IDisposable } from '../utils';
type CleanupFn = void | (() => void);
export interface PhaserGameContext {
game: Phaser.Game;
}
export interface ReactiveScenePhaserData {
phaserGame: PhaserGameContext;
}
export interface ReactiveSceneOptions<TData extends Record<string, unknown> = {}> {
key?: string;
}
/**
* Scene
* @typeparam TData - init(data) phaserGame
*/
export abstract class ReactiveScene<TData extends Record<string, unknown> = {}>
extends Phaser.Scene
implements IDisposable
{
protected disposables = new DisposableBag();
private _initData!: TData & ReactiveScenePhaserData;
/**
* init()
* create()
*/
public get initData(): TData & ReactiveScenePhaserData {
return this._initData;
}
/**
* Phaser game
*/
public get phaserGame(): PhaserGameContext {
return this._initData.phaserGame;
}
constructor(key?: string) {
super(key);
}
init(data: TData & ReactiveScenePhaserData): void {
this._initData = data;
}
create(): void {
this.events.on('shutdown', this.dispose, this);
}
dispose(): void {
this.disposables.dispose();
}
public addDisposable(disposable: IDisposable): void {
this.disposables.add(disposable);
}
/** 注册响应式监听(场景关闭时自动清理) */
public addEffect(fn: () => CleanupFn): void {
this.disposables.add(effect(fn));
}
}