ネモラムネ

Phaser3でSvelteのコンポーネントを表示する

#JavaScript #Svelte #Phaser3

2024-07-18

以前Phaser3で作ったブロック崩しでは、
ゲームオーバーとクリア画面の要素をDOMで表示してるよ

ブロック崩し | ネモラムネ
ブロック崩し | ネモラムネ favicon nemoramune.com
ブロック崩し | ネモラムネ

その時にDOMを扱いやすくするために
Svelteを使いたいなと思って、PhaserのDOMElementのカスタムクラスを作ってみたよ

Phaser3で作ったdivをターゲットにしてSvelteのコンポーネントを表示しているよ

import type { ComponentProps, ComponentType } from 'svelte'

export class SvelteDOMElement<T extends ComponentType> extends Phaser.GameObjects.DOMElement {
	constructor(
		scene: Phaser.Scene,
		component: T,
		props: ComponentProps<InstanceType<T>>,
		x?: number,
		y?: number,
		style?: any
	) {
		const canvas = scene.game.canvas
		const centerX = canvas.width / 2
		const centerY = canvas.height / 2
		super(scene, x ?? centerX, y ?? centerY, 'div', style ?? 'width: 100%; height: 100%')
		scene.add.existing(this)
		new component({
			target: this.node,
			props: props
		})
	}
}

こんな風に呼び出してるよ

new SvelteDOMElement(
  this, 
  ResultView, 
  {
	  text: 'ゲームオーバー',
	  onClick: () => { this.scene.start('main') }
  }
)