import Phaser from 'phaser'; import { signal, useSignal, useSignalEffect, type Signal } from '@preact/signals'; import { createContext, h } from 'preact'; import { useContext } from 'preact/hooks'; export const phaserContext = createContext>(signal(undefined)); export const defaultPhaserConfig: Phaser.Types.Core.GameConfig = { type: Phaser.AUTO, width: 560, height: 560, parent: 'phaser-container', backgroundColor: '#f9fafb', scene: [], }; export interface PhaserGameProps { config?: Partial; children?: any; } export function PhaserGame(props: PhaserGameProps) { const gameSignal = useSignal(); useSignalEffect(() => { const config: Phaser.Types.Core.GameConfig = { ...defaultPhaserConfig, ...props.config, }; const phaserGame = new Phaser.Game(config); gameSignal.value = phaserGame; return () => { gameSignal.value = undefined; phaserGame.destroy(true); }; }); return (
{props.children}
); } export interface PhaserSceneProps { sceneKey: string; scene: Phaser.Scene; autoStart: boolean; data?: object; } export function PhaserScene(props: PhaserSceneProps) { const context = useContext(phaserContext); useSignalEffect(() => { const game = context.value; if (!game) return; game.scene.add(props.sceneKey, props.scene, props.autoStart, props.data); return () => { game.scene.remove(props.sceneKey); }; }); return null; }