refactor: simplify scene routing
This commit is contained in:
parent
50531446c2
commit
713a14c128
|
|
@ -1,13 +1,11 @@
|
||||||
import { h } from 'preact';
|
import { h } from 'preact';
|
||||||
import { GameUI } from 'boardgame-phaser';
|
import { GameUI } from 'boardgame-phaser';
|
||||||
import * as gameModule from './game/tic-tac-toe';
|
|
||||||
import './style.css';
|
import './style.css';
|
||||||
import App from "@/ui/App";
|
import App from "@/ui/App";
|
||||||
import {GameScene} from "@/scenes/GameScene";
|
|
||||||
|
|
||||||
const ui = new GameUI({
|
const ui = new GameUI({
|
||||||
container: document.getElementById('ui-root')!,
|
container: document.getElementById('ui-root')!,
|
||||||
root: <App gameModule={gameModule} gameScene={GameScene}/>,
|
root: <App/>,
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.mount();
|
ui.mount();
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,6 @@ export class MenuScene extends ReactiveScene {
|
||||||
}
|
}
|
||||||
|
|
||||||
private async startGame(): Promise<void> {
|
private async startGame(): Promise<void> {
|
||||||
const data = this.initData as unknown as Record<string, unknown>;
|
await this.sceneController.launch('GameScene');
|
||||||
await this.sceneController.launch('GameScene', data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,27 @@
|
||||||
import {useComputed, useSignalEffect} from '@preact/signals';
|
import { createGameHost } from 'boardgame-core';
|
||||||
import { createGameHost, type GameModule } from 'boardgame-core';
|
|
||||||
import { h } from 'preact';
|
import { h } from 'preact';
|
||||||
import {PhaserGame, PhaserScene, ReactiveScene, phaserContext} from 'boardgame-phaser';
|
import {PhaserGame, PhaserScene } from 'boardgame-phaser';
|
||||||
import {useContext} from 'preact/hooks';
|
|
||||||
import {MenuScene} from "@/scenes/MenuScene";
|
import {MenuScene} from "@/scenes/MenuScene";
|
||||||
|
import {useMemo} from "preact/hooks";
|
||||||
|
import * as gameModule from '../game/tic-tac-toe';
|
||||||
|
import {GameScene} from "@/scenes/GameScene";
|
||||||
|
|
||||||
export default function App<TState extends Record<string, unknown>>(props: { gameModule: GameModule<TState>, gameScene: { new(): ReactiveScene } }) {
|
export default function App() {
|
||||||
|
|
||||||
const gameHost = useComputed(() => {
|
const gameHost = useMemo(() => {
|
||||||
const gameHost = createGameHost(props.gameModule);
|
const gameHost = createGameHost(gameModule);
|
||||||
return { gameHost };
|
return { gameHost };
|
||||||
});
|
}, []);
|
||||||
|
|
||||||
const gameScene = useComputed(() => new props.gameScene());
|
const gameScene = useMemo(() => new GameScene(), []);
|
||||||
const menuScene = useComputed(() => new MenuScene());
|
const menuScene = useMemo(() => new MenuScene(), []);
|
||||||
|
|
||||||
// 自动启动菜单场景
|
|
||||||
const phaserSignal = useContext(phaserContext);
|
|
||||||
useSignalEffect(() => {
|
|
||||||
const ctx = phaserSignal?.value;
|
|
||||||
if (ctx?.sceneController) {
|
|
||||||
ctx.sceneController.launch('MenuScene', { gameHost: gameHost.value });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col h-screen">
|
<div className="flex flex-col h-screen">
|
||||||
<div className="flex-1 flex relative justify-center items-center">
|
<div className="flex-1 flex relative justify-center items-center">
|
||||||
<PhaserGame>
|
<PhaserGame initialScene="MenuScene">
|
||||||
<PhaserScene sceneKey="MenuScene" scene={menuScene.value} />
|
<PhaserScene sceneKey="MenuScene" scene={menuScene} />
|
||||||
<PhaserScene sceneKey="GameScene" scene={gameScene.value} />
|
<PhaserScene sceneKey="GameScene" scene={gameScene} data={gameHost}/>
|
||||||
</PhaserGame>
|
</PhaserGame>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue