Skip to content

@web-engine-dev/state

Game state machine with states, transitions, state stack, update hooks, and persistence.

Features

  • State Machine: Enter, update, exit lifecycle
  • State Stack: Push/pop for pause screens, menus
  • Transitions: Fade, wipe, custom effects
  • Persistence: Save/restore state data
  • Async States: Loading screens, async transitions

Installation

bash
npm install @web-engine-dev/state
# or
pnpm add @web-engine-dev/state

Quick Start

typescript
import { GameStateManager, GameState } from '@web-engine-dev/state';

// Define states
class MenuState extends GameState {
  onEnter() {
    showMenu();
  }

  onUpdate(dt: number) {
    updateMenu(dt);
  }

  onExit() {
    hideMenu();
  }
}

class PlayState extends GameState {
  onEnter() {
    startGame();
  }

  onUpdate(dt: number) {
    updateGame(dt);
  }
}

// Create manager
const states = new GameStateManager();
states.register('menu', new MenuState());
states.register('play', new PlayState());

// Start
states.change('menu');

// Update each frame
states.update(deltaTime);

API Overview

GameState

typescript
class MyState extends GameState {
  onEnter(data?: any) {}
  onUpdate(dt: number) {}
  onRender() {}
  onExit() {}
  onPause() {}
  onResume() {}
}

State Manager

MethodDescription
register(name, s)Register a state
change(name, data)Switch to state
push(name, data)Push state onto stack
pop()Pop current state
update(dt)Update current state
render()Render current state
current()Get current state name

State Stack

typescript
// Push pause menu (gameplay continues underneath)
states.push('pause');

// Pop to return to gameplay
states.pop();

// Replace current state
states.change('gameOver');

Transitions

typescript
states.change('play', data, {
  transition: 'fade',
  duration: 0.5,
  color: '#000000',
});

// Custom transition
states.setTransition('wipe', new WipeTransition());

Persistence

typescript
class PlayState extends GameState {
  onSave(): StateData {
    return {
      playerPosition: player.position,
      score: game.score,
    };
  }

  onRestore(data: StateData) {
    player.position = data.playerPosition;
    game.score = data.score;
  }
}

// Save/restore
const saved = states.save();
states.restore(saved);

Proprietary software. All rights reserved.