2D Game Engine

Konfiguracja

EngineConfig — wszystkie pola konfiguracji silnika z wartościami domyślnymi, walidacją i przykładami dla typowych setupów.

EngineConfig#

Konfigurację przekazujesz do createEngine(options). Nieprawidłowa konfiguracja rzuca Error z czytelnym komunikatem — walidacja jest synchroniczna i fail-fast.

PoleTypDomyślnieOpis
parentstring | HTMLElementwymaganeKontener gry
width, heightnumber1280, 720Rozmiar logiczny planszy
backgroundColorstring | number"#151515"Tło planszy
scaleMode"fit" | "fill" | "fixed" | "expand""fit"Skalowanie do kontenera
debugbooleanfalseNakładka debug + poziom logowania debug
pauseOnHiddenbooleantruePauza, gdy karta jest ukryta
maxDeltaTimenumber0.1Górny clamp deltaTime w sekundach
seednumber1337Seed generatora Random
fixedStep{ hz: number; maxSteps?: number }brakKrok stały → Scene.fixedUpdate(dt)
inputInputActionMapdefaultInputMapMapowanie akcji na klawisze
physics{ enabled, gravity, debug }enabled: trueFizyka Arcade
wasm{ wasmUrl, required? }brakOpcjonalny moduł WASM

EngineOptions = EngineConfig + logLevel?: LogLevel + wasm?: WasmBridgeOptions.

Domyślne mapowanie akcji#

defaultInputMap definiuje akcje: move-up, move-down, move-left, move-right, interact, jump, restart, menu, pause, time-slow, time-fast, time-normal, mute.

Logika gry czyta akcje, nie kody klawiszy — dzięki temu remapowanie nie dotyka kodu rozgrywki:

ts
const engine = createEngine({
  parent: 'app',
  input: {
    'move-left': ['KeyA', 'ArrowLeft'],
    'move-right': ['KeyD', 'ArrowRight'],
    jump: ['Space', 'KeyW'],
    interact: ['KeyE']
  }
})

engine.getInput().remapAction('jump', ['Space'])

Przykładowe setupy#

Gra pixel-art z krokiem stałym#

ts
const engine = createEngine({
  parent: 'game',
  width: 480,
  height: 270,
  scaleMode: 'fit',
  backgroundColor: '#1a1c2c',
  fixedStep: { hz: 60, maxSteps: 5 },
  seed: 20260,
  physics: { enabled: true, gravity: { x: 0, y: 900 } }
})

Gra bez fizyki, z własnym seedem#

ts
const engine = createEngine({
  parent: 'app',
  width: 1024,
  height: 768,
  physics: { enabled: false },
  seed: 42,
  pauseOnHidden: true
})

Tryb debug z pełną diagnostyką#

ts
const engine = createEngine({
  parent: 'app',
  debug: true,
  logLevel: 'debug',
  physics: { enabled: true, debug: true }
})

Skalowanie#

TrybZachowanie
fitZachowuje proporcje, mieści całość w kontenerze (letterbox)
fillWypełnia kontener, może przyciąć krawędzie
fixedStały rozmiar logiczny, bez skalowania
expandRozszerza planszę do rozmiaru kontenera

Wskazówka

Dla gier z pixel-artem używaj fit i niskiej rozdzielczości logicznej (np. 480×270) — skalowanie zajmie się przeglądarka, a fizyka pozostanie deterministyczna.

Zmiana konfiguracji w locie#

Część ustawień zmienisz bez restartu:

ts
engine.setTimeScale(0.5)
engine.setDebug(true)
engine.pause()
engine.resume()

setTimeScale wpływa na deltaTime całej gry (patrz Czas), ale nie na czas rzeczywisty — realElapsed płynie dalej.