Core Concepts

Event System

Lightweight pub/sub EventEmitter used throughout the engine.

The engine ships a lightweight EventEmitter for decoupled communication between systems. It is used internally for resize events, resource loading progress, input events, and more — and is available for your own game events.

EventEmitter

import { EventEmitter } from '@mavonengine/core'

class MySystem extends EventEmitter {
  doSomething() {
    this.trigger('my-event', { value: 42 })
  }
}

const system = new MySystem()
system.on('my-event', (data) => {
  console.log(data.value) // 42
})

API

MethodDescription
on(event, callback)Subscribe to an event
trigger(event, data?)Emit an event with optional payload

EventEmitterMixin

If you can't extend EventEmitter directly (e.g. your class already extends something else), use the mixin:

import { EventEmitterMixin, Actor } from '@mavonengine/core'

class MyActor extends EventEmitterMixin(Actor) {
  doSomething() {
    this.trigger('state-changed', { state: 'idle' })
  }
}

Engine events

Several engine systems emit events you can subscribe to:

Sizes (window resize)

import { Game } from '@mavonengine/core'

const game = Game.instance()
game.sizes.on('resize', () => {
  console.log(game.sizes.width, game.sizes.height)
})

Resources (asset loading)

game.resources.on('progress', ({ loaded, total }) => {
  console.log(`${loaded} / ${total} assets loaded`)
})

game.resources.on('loaded', () => {
  console.log('All assets ready')
})

InputManager (keyboard)

game.input.on('keydown', (event) => { /* ... */ })
game.input.on('keyup', (event) => { /* ... */ })