boardgame-phaser/packages/sts-like-viewer/src/ui/App.tsx

38 lines
1.8 KiB
TypeScript
Raw Normal View History

2026-04-13 12:33:42 +08:00
import { h } from 'preact';
import { PhaserGame, PhaserScene } from 'boardgame-phaser';
import { useMemo } from 'preact/hooks';
import { IndexScene } from '@/scenes/IndexScene';
import { MapViewerScene } from '@/scenes/MapViewerScene';
import { GridViewerScene } from '@/scenes/GridViewerScene';
import { ShapeViewerScene } from '@/scenes/ShapeViewerScene';
2026-04-14 13:51:11 +08:00
import { GameFlowScene } from '@/scenes/GameFlowScene';
import { PlaceholderEncounterScene } from '@/scenes/PlaceholderEncounterScene';
2026-04-14 14:21:51 +08:00
import { createGameState } from '@/state/gameState';
// 全局游戏状态单例
const gameState = createGameState();
2026-04-13 12:33:42 +08:00
export default function App() {
const indexScene = useMemo(() => new IndexScene(), []);
const mapViewerScene = useMemo(() => new MapViewerScene(), []);
const gridViewerScene = useMemo(() => new GridViewerScene(), []);
const shapeViewerScene = useMemo(() => new ShapeViewerScene(), []);
2026-04-14 14:21:51 +08:00
const gameFlowScene = useMemo(() => new GameFlowScene(gameState), []);
const placeholderEncounterScene = useMemo(() => new PlaceholderEncounterScene(gameState), []);
2026-04-13 12:33:42 +08:00
return (
<div className="flex flex-col h-screen">
<div className="flex-1 flex relative justify-center items-center">
2026-04-13 14:57:00 +08:00
<PhaserGame initialScene="IndexScene" config={{ width: 1920, height: 1080 }}>
2026-04-13 12:33:42 +08:00
<PhaserScene sceneKey="IndexScene" scene={indexScene} />
<PhaserScene sceneKey="MapViewerScene" scene={mapViewerScene} />
<PhaserScene sceneKey="GridViewerScene" scene={gridViewerScene} />
<PhaserScene sceneKey="ShapeViewerScene" scene={shapeViewerScene} />
2026-04-14 13:51:11 +08:00
<PhaserScene sceneKey="GameFlowScene" scene={gameFlowScene} />
<PhaserScene sceneKey="PlaceholderEncounterScene" scene={placeholderEncounterScene} />
2026-04-13 12:33:42 +08:00
</PhaserGame>
</div>
</div>
);
}