Ü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-Controller —
KinematicCharacterControllerfür physikgesteuerte Bewegung - Szene — Three.js
Scene(zwischen Server und Client geteilt) - Tick-Rate — Feste Update-Rate (Standard: 30 Ticks/Sekunde)
- Welt —
BaseWorld-Instanz, die alle Entities verwaltet
import { BaseGame } from '@mavonengine/core'
class MyGame extends BaseGame {
// ...
}
const game = MyGame.instance()
Tick vs. Update
| Methode | Aufgerufen von | Zweck |
|---|---|---|
tick() | Festes Intervall (tickRate) | Physik-Schritt, vernetzter Zustandsabgleich |
update(delta) | Jedes Frame / Tick | Entity-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:
- Canvas —
HTMLCanvasElementfür WebGL-Rendering - UI-Root —
HTMLDivElementfür Overlay-UI - Größen — Fenstergrößen-Tracking mit Resize-Behandlung
- Kamera —
PerspectiveCameramitAudioListener - Renderer —
WebGLRenderermit 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