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
| Method | Description |
|---|---|
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) => { /* ... */ })