Skip to main content
skill CX Codex

phaser-core — Claude Code skill: Phaser 4 setup and patterns

Skill to set up and debug Phaser 4 games: Game config, Scene lifecycle (init/preload/create/update), asset loader, cameras, and cross-scene data. Use when building or fixing a Phaser game.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill phaser-core -a claude-code
Open on GitHub

What phaser-core does

The skill covers Phaser's core: creating Phaser.Game with the right config, structuring scenes, loading assets, and switching between screens. It distinguishes Phaser 4.2 (for new projects) from Phaser 3.90 (does not rewrite old projects). Inside: patterns for resetting state in init(), queuing assets in preload(), accessing the cache in create(), and running update logic in update(). Explains how to move between scenes via start/launch/switch/sleep/wake, share state through this.registry and scene events, set up camera follow, and manage cross-scene data.

For movement, velocity, colliders, and gravity, use the separate phaser-arcade-physics skill. Complex rigid-body simulation is Matter Physics (a different concern). For save/load patterns, see save-systems.

Ready for Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, and OpenCode. Requires phaser already in package.json.

What it helps with

  • Set up Game config and start the first scene
  • Load assets and use them in create and update
  • Switch between scenes and pass data across them
  • Debug state leaks when restarting a scene
  • Sync a HUD scene and gameplay scene via registry

Example prompts for the agent

  • Help me create a new Phaser 4 project with Boot and Play scenes
  • Why are my assets undefined in create if I queued them in preload?
  • How do I prevent the HUD scene from restarting every time?

How to install phaser-core

1Skills CLI (Vercel)

npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill phaser-core -a claude-code

2Manually: put the files in place

~/.claude/skills/phaser-core/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/phaser-core/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about phaser-core

How do I install phaser-core in Claude Code?

Run npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill phaser-core -a claude-code, then the skill will appear at ~/.claude/skills/phaser-core/SKILL.md.

What does phaser-core do?

It helps you set up the foundation of a Phaser game: Game config, Scene lifecycle, asset loading, cameras, and cross-scene data. Shows patterns and explains common mistakes.

When should I use phaser-core vs phaser-arcade-physics?

Use phaser-core for scene structure, asset loading, and screen transitions. For movement, collisions, gravity, and overlap detection, call phaser-arcade-physics.

Source text

SKILL.md · Apache-2.0
---
name: phaser-core
description: >
  Set up and debug a Phaser 4 game: the Game config, the Scene lifecycle
  (init/preload/create/update), the asset loader, cameras, and cross-scene
  communication. Use when building or debugging a Phaser game — when the user
  mentions Phaser, Phaser.Game, Phaser.Scene, preload/create/update, this.load,
  this.add, or scene transitions. For Arcade Physics movement/collisions use
  phaser-arcade-physics.
---

# Phaser 4 Core

Set up the foundation of a Phaser game: the `Game` config, the `Scene`
lifecycle, asset loading, cameras, and passing data between scenes. Targets
**Phaser 4.2** for new projects; keep an existing Phaser 3.90 project on its
pinned major unless the user explicitly asks for a migration.

## When to use

- Use when starting a Phaser game, wiring the `Phaser.Game` config, structuring
  `Scene`s, loading assets in `preload`, or fixing scene transitions and shared
  state.
- Use when the project has `phaser` in `package.json` or `import Phaser from 'phaser'`,
  and code uses `preload()`/`create()`/`update()`.

**When *not* to use:** movement, velocity, colliders, gravity, or overlap → use
`phaser-arcade-physics`. Complex rigid-body simulation uses Matter physics (a
separate concern). For cross-engine save/load patterns use `save-systems`.

## Core workflow

1. **Detect the installed major first.** Read `package.json` and the lockfile. Use
   Phaser 4.2 for new work; do not silently rewrite a Phaser 3 project as Phaser 4.
2. **Create the game from a config.** `new Phaser.Game(config)` with `type:
   Phaser.AUTO` (WebGL with Canvas fallback), a `width`/`height`, and a `scene`
   array. The first scene (and any with `active: true`) starts automatically.
3. **Model each screen as a `Scene`.** Subclass `Phaser.Scene`, pass a unique
   `key` to `super`, and implement the lifecycle: `init(data)` → `preload()` →
   `create(data)` → `update(time, delta)`.
4. **Load assets in `preload`, use them in `create`.** Queued assets are not
   available until `create`. The loader is per-scene; the cache it fills is global.
5. **Reset per-run state in `init()`, not the constructor.** A scene instance is
   reused across restarts, so constructor-set fields keep stale values.
6. **Move between screens** with `this.scene.start/launch/switch/sleep/wake`.
   Share data through `this.registry` (global) or a sibling scene's event emitter.
7. **Run and observe.** Serve the page, open it, and confirm assets load (watch the
   Network tab and console) and scenes switch as expected before assuming success.

## Patterns

### 1. Game config + boot (ES module)

```js
// main.js — one Game owns the renderer, loop, cache, and Scene Manager.
import Phaser from 'phaser';
import BootScene from './scenes/BootScene.js';
import PlayScene from './scenes/PlayScene.js';

const config = {
  type: Phaser.AUTO,            // WebGL if available, else Canvas
  width: 800,
  height: 600,
  backgroundColor: '#1d1d28',
  scale: { mode: Phaser.Scale.FIT, autoCenter: Phaser.Scale.CENTER_BOTH },
  scene: [BootScene, PlayScene] // BootScene starts first
};

new Phaser.Game(config);
```

### 2. A Scene with the full lifecycle

```js
// scenes/PlayScene.js
import Phaser from 'phaser';

export default class PlayScene extends Phaser.Scene {
  constructor() {
    super('play');                  // unique scene key
  }

  init(data) {
    // Reset run-specific state HERE so restarts start clean.
    this.score = 0;
    this.level = data.level ?? 1;
  }

  preload() {
    // Queue downloads. Not usable until create().
    this.load.image('player', 'assets/player.png');
    this.load.spritesheet('coin', 'assets/coin.png', { frameWidth: 16, frameHeight: 16 });
  }

  create() {
    this.player = this.add.sprite(400, 300, 'player');
    this.scoreText = this.add.text(10, 10, 'Score: 0', { fontSize: '20px', color: '#fff' });
    this.cursors = this.input.keyboard.createCursorKeys();
  }

  update(time, delta) {
    // delta is milliseconds since last frame; divide by 1000 for seconds.
    const speed = 200 * (delta / 1000);
    if (this.cursors.left.isDown)  this.player.x -= speed;
    if (this.cursors.right.isDown) this.player.x += speed;
  }
}
```

### 3. Cross-scene data + events

```js
// The registry is a global DataManager shared by every scene.
this.registry.set('coins', 0);                 // in any scene
const coins = this.registry.get('coins');      // read anywhere

// React to registry changes (e.g. a HUD scene listening to gameplay):
this.registry.events.on('changedata-coins', (parent, value) => {
  this.coinText.setText(`Coins: ${value}`);
});

// Talk directly to another running scene via its event emitter:
const ui = this.scene.get('hud');
ui.events.emit('show-message', 'Level cleared!');
```

### 4. Scene transitions (pick the right verb)

```js
this.scene.start('gameover', { score: this.score }); // stop this scene, start target
this.scene.launch('hud');        // run a second scene in parallel (restarts it if already running)
this.scene.run('hud');           // wake if sleeping, resume if paused, else (re)start
this.scene.bringToTop('hud');    // draw order follows the scene list, not launch order
this.scene.switch('menu');       // sleep this scene, start/wake target
this.scene.pause();              // freeze updates but keep rendering (modal)
this.scene.sleep();              // stop updating AND rendering, keep state for wake
```

### 5. A camera that follows the player

```js
this.cameras.main.setBounds(0, 0, 1600, 1200);  // world size
this.cameras.main.startFollow(this.player, true, 0.1, 0.1); // smooth lerp follow
this.cameras.main.setZoom(1.5);
```

## Pitfalls

- **Assets are `undefined` in `create`/`update`** → you forgot to queue them in
  `preload`, or used the wrong key. The loader runs between `preload` and `create`.
- **State leaks across a restart** → you set fields in the constructor. The Scene
  instance is reused; reset run state in `init()` and clear arrays on `shutdown`.
- **`this.scene.start` vs `this.scene.launch`** → `start` stops the calling scene;
  `launch` runs the target alongside it. Using `start` for a HUD hides the game.
- **HUD loses its state or draws behind the game** → `launch` (and `run`) on a scene
  that is already running shuts it down and starts it again; launch the HUD once, or
  guard with `if (!this.scene.isActive('hud'))`. Scenes draw in scene-list order, so a
  HUD listed before the gameplay scene renders underneath it until you call
  `this.scene.bringToTop('hud')`.
- **Scene state read right after `start`/`launch` is stale** → scene operations are
  queued and run at the start of the next game step, not synchronously.
- **`this` is wrong in a callback** → arrow functions keep the Scene's `this`; plain
  `function` callbacks need a context argument or `.bind(this)`.
- **Phaser 2 tutorials don't work** → "States" were renamed to "Scenes" in Phaser 3,
  and each Scene owns its own systems (input, cameras, tweens) rather than a global
  Game World.
- **Phaser 3 custom pipelines fail in Phaser 4** → Phaser 4 rebuilt the renderer and
  replaced the old FX/pipeline extension points. Migrate custom shaders and renderer
  plugins against the Phaser 4 guide; do not mechanically copy internal renderer code.
- **A Phaser 3 snippet runs but looks wrong in Phaser 4** → common renames: `preFX`/
  `postFX` and `BitmapMask` became filters (`obj.enableFilters()` then
  `obj.filters.internal`/`.external`); `setPipeline('Light2D')` became
  `setLighting(true)`; `setTintFill(c)` only logs an error, so use
  `setTint(c).setTintMode(Phaser.TintModes.FILL)`; `Phaser.Math.TAU` is now 2π (use
  `Phaser.Math.PI_OVER_2` where v3 code meant π/2); `Geom.Point` is gone (use
  `Phaser.Math.Vector2`). Canvas rendering still works but is deprecated.
- **Pixel art is blurry or shimmers while moving** → set `pixelArt: true` in the game
  config. It turns off antialiasing and turns on `roundPixels`, which defaults to
  `false` in Phaser 4.
- **Nothing renders / black screen** → confirm the canvas mounted, `width`/`height`
  are set, and a scene actually started (check `game.scene.dump()` output).
- **Two canvases (two games running) after a hot reload or a React/Vue remount** →
  a second `new Phaser.Game` ran while the first was still alive. Keep one instance
  and call `game.destroy(true)` when the host component unmounts; the teardown
  finishes on the next frame. Leave `noReturn` false, or no new game can start on
  the page.

## References

- For the full scene state machine (pause/resume vs sleep/wake vs stop/start, the
  restart-state bug, and removing/replacing scenes), read
  `references/scene-flow.md`.

## Related skills

- `phaser-arcade-physics` — velocity, gravity, colliders, overlap, and groups.
- `input-systems` — rebindable, multi-device input architecture (engine-agnostic).
- `pixijs-rendering` / `threejs-scene-setup` — other browser rendering stacks.
- `platformer` / `puzzle` — genre templates that compose Phaser skills.

© gamedev-skills · Apache-2.0 · gamedev-skills/awesome-gamedev-agent-skills

Similar skills

Everything for Game dev and 3D: Unity, Unreal, Godot, Blender →

From the same set77

godot-csharp Skill for writing Godot 4.7 games in C# with partial classes, lifecycle methods, Export attributes, signals as C# events, and GDScript interop. Requires Godot .NET build and .NET SDK 8+. CX Codex +1 5,900installs godot-multiplayer Configures Godot 4.7 high-level multiplayer via ENet, @rpc calls, node authority, and state replication with MultiplayerSpawner and MultiplayerSynchronizer. CX Codex +1 5,900installs steam-publish A skill that walks a finished build through Steam: depots and packages, steamcmd uploads, beta branches, review checklists. Useful when the game is ready but the store page isn't. CX Codex +1 5,900installs itch-publish This skill walks a game build onto an itch.io page: butler push to the right channel, version strings, updates that send only what changed. Handy when a demo or release has to go out. CX Codex +1 5,700installs game-jam Plans and scopes game development projects under tight jam deadlines, keeping scope locked to the clock so a playable build gets submitted. CX Codex +1 5,700installs unity-animation Guides the agent through Animator Controllers in Unity 6.3 LTS: parameters, transitions, blend trees, layers, humanoid IK. Useful when one state machine has to cover walking, jumping and aiming. CX Codex +1 5,800installs threejs-gltf-loading Loads glTF/GLB models into three.js and plays their baked or skinned clips, with patterns for DRACO, Meshopt and KTX2. For the case where the file imports but nothing shows up on screen. CX Codex +1 5,600installs unity-physics Sets up 3D PhysX physics in Unity 6.3 LTS with proper Rigidbody motion, collision layers, and raycasts. Useful when writing character controllers or tuning physics interactions. CX Codex +1 5,600installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor