From 70334fa9e311c5803902290eec6d92c94b320bb3 Mon Sep 17 00:00:00 2001 From: hyper Date: Sun, 12 Apr 2026 18:00:08 +0800 Subject: [PATCH] refactor: wait to launch scene --- packages/framework/src/ui/PhaserBridge.tsx | 35 ++++++++-------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/packages/framework/src/ui/PhaserBridge.tsx b/packages/framework/src/ui/PhaserBridge.tsx index 3ed1158..8132c42 100644 --- a/packages/framework/src/ui/PhaserBridge.tsx +++ b/packages/framework/src/ui/PhaserBridge.tsx @@ -38,16 +38,8 @@ export interface PhaserGameProps { children?: any; } -/** 存储待注册的场景配置 */ -interface SceneRegistration = {}> { - sceneKey: string; - scene: ReactiveScene; - initData?: TData; -} - export function PhaserGame(props: PhaserGameProps) { const gameSignal = useSignal({ game: undefined!, sceneController: undefined! }); - const scenesRef = useRef>(new Map()); const initialSceneLaunched = useRef(false); useSignalEffect(() => { @@ -72,8 +64,15 @@ export function PhaserGame(props: PhaserGameProps) { return; } + // 等待场景注册完成(最多等待 100ms) + let retries = 0; + while (!phaserGame.scene.getScene(sceneKey) && retries < 10) { + await new Promise(resolve => setTimeout(resolve, 10)); + retries++; + } + // 验证场景是否已注册 - if (!phaserGame.scene.getScene(sceneKey) && !scenesRef.current.has(sceneKey)) { + if (!phaserGame.scene.getScene(sceneKey)) { console.error(`SceneController: 场景 "${sceneKey}" 未注册`); return; } @@ -90,20 +89,11 @@ export function PhaserGame(props: PhaserGameProps) { } // 确保场景已注册后再启动 + // (场景应该已经在 PhaserScene 组件中注册) if (!phaserGame.scene.getScene(sceneKey)) { - const registration = scenesRef.current.get(sceneKey); - if (registration) { - phaserGame.scene.add( - sceneKey, - registration.scene, - false, - { - ...registration.initData, - phaserGame: gameSignal, - sceneController, - } - ); - } + console.error(`SceneController: 场景 "${sceneKey}" 在切换时仍未注册`); + isTransitioning.value = false; + return; } // 启动新场景 @@ -122,7 +112,6 @@ export function PhaserGame(props: PhaserGameProps) { return () => { gameSignal.value = { game: undefined!, sceneController: undefined! }; - scenesRef.current.clear(); initialSceneLaunched.current = false; phaserGame.destroy(true); };