From 76687de6728c1327012aeaa3e04abfa33a423c89 Mon Sep 17 00:00:00 2001 From: hypercross Date: Sat, 4 Apr 2026 16:34:17 +0800 Subject: [PATCH] refactor: misc --- packages/boop-game/src/scenes/GameScene.ts | 7 +++---- packages/framework/src/scenes/GameHostScene.ts | 14 ++++++++++---- packages/framework/src/ui/GameUI.tsx | 16 ---------------- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/packages/boop-game/src/scenes/GameScene.ts b/packages/boop-game/src/scenes/GameScene.ts index 136f405..ac4989c 100644 --- a/packages/boop-game/src/scenes/GameScene.ts +++ b/packages/boop-game/src/scenes/GameScene.ts @@ -1,5 +1,4 @@ -import Phaser from 'phaser'; -import type { BoopState, PlayerType, PieceType } from '@/game/boop'; +import type { BoopState } from '@/game/boop'; import { GameHostScene } from 'boardgame-phaser'; import { commands } from '@/game/boop'; import { BoardRenderer } from './BoardRenderer'; @@ -36,7 +35,7 @@ export class GameScene extends GameHostScene { }); // 监听状态变化 - this.watch(() => { + this.addEffect(() => { const winner = this.state.winner; if (winner) { this.winnerOverlay.show(winner); @@ -45,7 +44,7 @@ export class GameScene extends GameHostScene { } }); - this.watch(() => { + this.addEffect(() => { const currentPlayer = this.state.currentPlayer; this.boardRenderer.updateTurnText(currentPlayer, this.state); this.supplyUI.update(this.state); diff --git a/packages/framework/src/scenes/GameHostScene.ts b/packages/framework/src/scenes/GameHostScene.ts index 40dbfcb..6250ebe 100644 --- a/packages/framework/src/scenes/GameHostScene.ts +++ b/packages/framework/src/scenes/GameHostScene.ts @@ -1,5 +1,5 @@ import Phaser from 'phaser'; -import { effect, type ReadonlySignal } from '@preact/signals-core'; +import { effect } from '@preact/signals-core'; import type { GameHost } from 'boardgame-core'; import { DisposableBag, type IDisposable } from '../utils'; @@ -14,7 +14,10 @@ export abstract class GameHostScene> implements IDisposable { protected disposables = new DisposableBag(); - protected gameHost!: GameHost; + private _gameHost!: GameHost; + public get gameHost(): GameHost { + return this._gameHost; + } addInterruption(promise: Promise){ this.gameHost?.addInterruption(promise); @@ -27,7 +30,7 @@ export abstract class GameHostScene> } init(data: GameHostSceneOptions): void { - this.gameHost = data.gameHost; + this._gameHost = data.gameHost; } create(): void { @@ -43,8 +46,11 @@ export abstract class GameHostScene> return this.gameHost.state.value; } + public addDisposable(disposable: IDisposable){ + this.disposables.add(disposable); + } /** 注册响应式监听(场景关闭时自动清理) */ - protected watch(fn: () => CleanupFn): void { + public addEffect(fn: () => CleanupFn): void { this.disposables.add(effect(fn)); } } diff --git a/packages/framework/src/ui/GameUI.tsx b/packages/framework/src/ui/GameUI.tsx index cf3a9dd..8daa512 100644 --- a/packages/framework/src/ui/GameUI.tsx +++ b/packages/framework/src/ui/GameUI.tsx @@ -1,8 +1,3 @@ -import { h, Fragment } from 'preact'; -import { effect } from '@preact/signals-core'; - -type DisposeFn = () => void; - export interface GameUIOptions { container: HTMLElement; root: any; @@ -11,7 +6,6 @@ export interface GameUIOptions { export class GameUI { private container: HTMLElement; private root: any; - private effects: DisposeFn[] = []; constructor(options: GameUIOptions) { this.container = options.container; @@ -24,19 +18,9 @@ export class GameUI { }); } - watch(fn: () => void): DisposeFn { - const e = effect(fn); - this.effects.push(e); - return e; - } - unmount(): void { import('preact').then(({ render }) => { render(null, this.container); }); - for (const e of this.effects) { - e(); - } - this.effects = []; } }