ぷっぽプログラミング備忘録

linux, javascript, php, C#, そのうちScalaとかアプリ開発とかやってみたいです。

vite + phaser + htmlのdomを使う

前提

  • viteでコンパイルしている
  • phaser3で何か作っている
  • phaesr3でhtmlのdomを使いたい

流れ

  • start-dom-jsx をインストール
    (dom-jsx単体をインストールして設定をすればできるようですが、簡単そうなので、start-dom-jsxのほうを私は使うことにしました。)
npm install start-dom-jsx
  • vite.config.js を更新
// 省略
    esbuild: {
        jsxFactory: 'h',
        jsxFragment: 'Fragment'
    },
// 省略
  • jsx ファイル作成(例button.jsx)
    ポイント:使っているようには見えないが、import {h, Fragment} from ... の一行を書くこと
import { h, Fragment } from 'start-dom-jsx'

const button = (
    <button class="button is-primary">
        <span class="icon">
            <i class="mdi mdi-play"></i>
        </span>
        <span>
            Start!!!!!
        </span>
    </button>
)

export default button
  • phaserのgameconfigに以下を追加
const config: Phaser.Types.Core.GameConfig = {
  // 省略
  parent: 'phaser', // ★これが必要★
  // ★以下が必要★
  dom: {
    createContainer: true
  },
  scene: MyDialog, // 例)MyDialogがシーンクラス名だった場合
};
new Phaser.Game(config);
  • phaserのsceneでjsxを使う
    例)MyDialog.ts
import Phaser from "phaser";
import button from "../jsx/button" // 使いたいjsxの部品ファイルのパス

export default class MyDialog extends Phaser.Scene {
  create() {
    this.add.dom(100, 100, button) // x:100, y:100 の位置にbutton.jsxのdomを表示させる 
    // buttonのclickイベント設定
    button.addEventListener('click', () => {
      // 適当に四角出してみる
      let graphics = this.add.graphics()
      graphics.fillStyle(0x800000, 1).fillRect(10, 10, 100, 100)
    })

  }

}
 

参考

Use Vite for JSX without React. If you want to build vanilla JavaScript… | by David Mold | Medium

DOM Element Button in Phaser 3 with JSX and TypeScript @ Playful Game Developmet Blog by Ourcade