phaser-jsx

[!NOTE] This package is under development so expect breaking changes in future releases.

phaser-jsx

NPM

NPM version build codecov

📝 Use JSX in Phaser.

With JSX:

// index.jsx
import Phaser from 'phaser';
import { Text, render } from 'phaser-jsx';

new Phaser.Game({
  scene: {
    create() {
      render(, this);
    },
  },
});

Without JSX:

// index.js
import Phaser from 'phaser';
import { jsx, render } from 'phaser-jsx';

new Phaser.Game({
scene: {
create() {
render(jsx(Phaser.GameObjects.Text, { text: 'Hello, world!' }), this);
},
},
});

NPM:

npm install phaser-jsx

Yarn:

yarn add phaser-jsx

CDN:

<script src="https://unpkg.com/phaser@latest/dist/phaser.min.js"></script>
<script src="https://unpkg.com/phaser-jsx@latest/umd/phaser-jsx.min.js"></script>

ES Modules:

import { createElement, render } from 'phaser-jsx';

CommonJS:

const { createElement, render } = require('phaser-jsx');

UMD:

<script src="https://unpkg.com/phaser@latest/dist/phaser.min.js"></script>
<script src="https://unpkg.com/phaser-jsx@latest/umd/phaser-jsx.min.js"></script>
<script>
const { render, jsx } = window.PhaserJSX;
</script>

For better type support, import GameObject from phaser-jsx instead of phaser:

import { Text } from 'phaser-jsx';

[!TIP] All GameObjects exported from phaser-jsx are aliases of GameObjects from phaser.

Update tsconfig.json:

{
"compilerOptions": {
"jsx": "react-jsx",
"jsxImportSource": "phaser-jsx"
}
}

Update vite.config.mjs:

import { defineConfig } from 'vite';

export default defineConfig({
esbuild: {
jsxImportSource: 'phaser-jsx',
},
});

If you're not using jsxImportSource, you can set JSX pragma at the top of your file:

/** @jsx jsx */
import { jsx } from 'phaser-jsx';

The package follows React conventions like having createElement and jsx-runtime.

The render function renders the game object(s) inside the scene.

If you need nesting and relative positioning, use Container:


  
  

If you start a single Scene, retrieve it with the useScene hook:

import { useScene } from 'phaser-jsx';

const scene = useScene();

[!WARNING] Don't use this hook if you start multiple Scenes.

To specify a Scene class in TypeScript:

class MyScene extends Phaser.Scene {}

const scene = useScene<MyScene>();

Release is automated with Release Please.

MIT