Übersicht

Game-Loop

Wie BaseGame und Game die Update- und Render-Schleifen der Engine antreiben.

Die Engine hat zwei Spielklassen, die dieselbe zugrunde liegende Schleife teilen: BaseGame (headless) und Game (Client mit Rendering).

BaseGame

BaseGame ist der headless-Kern, der sowohl vom Server als auch vom Client verwendet wird. Es verwaltet:

  • Physikwelt — Rapier3D World-Instanz
  • Character-ControllerKinematicCharacterController für physikgesteuerte Bewegung
  • Szene — Three.js Scene (zwischen Server und Client geteilt)
  • Tick-Rate — Feste Update-Rate (Standard: 30 Ticks/Sekunde)
  • WeltBaseWorld-Instanz, die alle Entities verwaltet
import { BaseGame } from '@mavonengine/core'

class MyGame extends BaseGame {
  // ...
}

const game = MyGame.instance()

Tick vs. Update

MethodeAufgerufen vonZweck
tick()Festes Intervall (tickRate)Physik-Schritt, vernetzter Zustandsabgleich
update(delta)Jedes Frame / TickEntity-Updates, Physiksimulation

Update-Callbacks registrieren

game.onUpdate((delta) => {
  // Bei jedem Frame/Tick mit Delta-Zeit in Sekunden aufgerufen
})

// Abmelden, wenn nicht mehr benötigt
game.unregisterOnUpdate(callback)

Umgebungsprüfungen

game.isDevMode()        // true wenn NODE_ENV !== 'production'
game.isProductionMode() // true wenn NODE_ENV === 'production'

Game

Game erweitert BaseGame für den Client. Zusätzlich zu allem in BaseGame richtet es ein:

  • CanvasHTMLCanvasElement für WebGL-Rendering
  • UI-RootHTMLDivElement für Overlay-UI
  • Größen — Fenstergrößen-Tracking mit Resize-Behandlung
  • KameraPerspectiveCamera mit AudioListener
  • RendererWebGLRenderer mit Shadow-Mapping
  • Ressourcen — Asset-Loader
  • InputManager — Tastatur- und Mauseingabe
  • ParticleSystem — Partikeleffekte
  • LoadingScreen — Asset-Lade-Fortschrittsanzeige
  • Debug — Tweakpane-Debug-Panel (aktiviert über #debug)
  • Editor — In-Dev-Editor (nur im Dev-Modus)
import { Game } from '@mavonengine/core'

const game = Game.instance()
// Canvas und UI werden automatisch zu document.body hinzugefügt

Die Render-Schleife läuft über requestAnimationFrame und ruft update(delta) bei jedem Frame auf.

Singleton-Muster

Beide Klassen verwenden eine statische instance()-Methode. Rufe sie überall auf, um die vorhandene Instanz zu erhalten oder beim ersten Aufruf eine neue zu erstellen.

const game = Game.instance()
// Gibt immer dieselbe Instanz zurück