0.13.6 • Published 6 months ago

phaser-jsx v0.13.6

Weekly downloads
-
License
MIT
Repository
github
Last release
6 months ago

phaser-jsx

NPM

NPM version build codecov

šŸ“ Use JSX in Phaser.

Examples

Quick Start

With JSX:

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

new Phaser.Game({
  scene: {
    create() {
      render(<Text text="Hello, world!" />, 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);
    },
  },
});

Install

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>

Usage

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>

TypeScript

For better type support, install @types/react:

npm install @types/react --save-dev

Import the GameObject from phaser-jsx instead of phaser:

import { Text } from 'phaser-jsx';

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

Update your tsconfig.json:

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

Vite

Update your Vite config:

// vite.config.mjs
import { defineConfig } from 'vite';

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

JSX Pragma

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

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

How Does It Work?

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

The render function renders game objects inside a scene.

If you need nesting and relative positioning, use Container:

<Container>
  <Text text="Child 1" />
  <Text text="Child 2" />
</Container>

Hooks

useRef

Create a ref for your game object:

import { useRef } from 'phaser-jsx';

function MyComponent() {
  const textRef = useRef<Phaser.GameObjects.Text>();
  // ...
}

Pass your ref to the JSX element:

// ...
return <Text ref={textRef} onPointerDown={handleClick} />;

Access your game object:

function handleClick() {
  textRef.current?.text = 'Clicked';
}

Alternatively, you can get the game object with a callback ref:

<Text
  ref={(gameObject) => {
    gameObject.text = 'Hello, world!';
  }}
/>

useScene

Retrieve the current Scene with the useScene hook:

import { useScene } from 'phaser-jsx';

function MyComponent() {
  const scene = useScene();
  // ...
}

!WARNING Don't use the useScene hook if you start multiple Scenes.

Type your Scene with TypeScript:

class MyScene extends Phaser.Scene {
  // ...
}

const scene = useScene<MyScene>();

Release

Release is automated with Release Please.

License

MIT

0.13.6

6 months ago

0.11.0

7 months ago

0.11.1

6 months ago

0.13.0

6 months ago

0.11.2

6 months ago

0.13.1

6 months ago

0.11.3

6 months ago

0.13.2

6 months ago

0.11.4

6 months ago

0.13.3

6 months ago

0.11.5

6 months ago

0.13.4

6 months ago

0.11.6

6 months ago

0.13.5

6 months ago

0.12.10

6 months ago

0.12.11

6 months ago

0.12.7

6 months ago

0.12.8

6 months ago

0.12.9

6 months ago

0.12.0

6 months ago

0.12.1

6 months ago

0.12.2

6 months ago

0.12.12

6 months ago

0.12.3

6 months ago

0.12.4

6 months ago

0.12.5

6 months ago

0.12.6

6 months ago

0.10.0

1 year ago

0.9.0

1 year ago

0.8.0

1 year ago

0.9.1

1 year ago

0.7.2

1 year ago

0.7.1

1 year ago

0.5.0

1 year ago

0.7.0

1 year ago

0.6.0

1 year ago

0.5.1

1 year ago

0.4.1

1 year ago

0.4.2

1 year ago

0.4.0

2 years ago

0.3.0

2 years ago

0.3.2

2 years ago

0.3.1

2 years ago

0.2.1

2 years ago

0.2.0

2 years ago

0.1.1

2 years ago

0.1.0

2 years ago

0.0.0

2 years ago