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