- JavaScript 88.1%
- HTML 11.9%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Kern-Fix: Snapshots werden mit sauberer SIMULATIONSZEIT (tickCount x 1/60)
gestempelt statt mit der Wall-Clock-Sendezeit. Der setInterval-Timer-Jitter
(mehrere ms) floss vorher direkt in die Client-Interpolation -> alle Plattformen
und der Mitspieler liefen "von Haus aus" unruhig. Harness: Ruckler 0.227 -> 0.062px
(3.7x glatter). Plattformen laufen jetzt so glatt wie im Einzelspieler.
Glitch-Robustheit: laeuft der Interpolationspuffer bei einem Netzwerk-Aussetzer
leer, wird die Plattform mit ihrer letzten Geschwindigkeit weiter-extrapoliert
(statt einzufrieren + beim Paket-Burst zu poppen) + Render-Geschwindigkeitsdeckel.
Beseitigt die seltenen Teleport-Pops (9 -> 1.4px). Erste Sync nach Reset laeuft
bewusst hart durch (kein Schleichen beim Levelstart).
Punkteanzeige: am Levelende die Punkte DIESES Levels ("X / Y Punkte") statt des
Gesamtstands gegen den verwirrenden globalen Max 480; am Spielende Gesamt / 480.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
| .gitignore | ||
| feuer-wasser.html | ||
| fw-engine.js | ||
| fw-levels.js | ||
| fw-net.js | ||
| fw-sim.js | ||
| mp-server.js | ||
| README.md | ||
Feuer & Wasser
Ein Koop-Jump'n'Run für zwei Spieler (🔥 Feuerjunge & 💧 Wassermädchen). Läuft lokal zu zweit an einem Gerät oder online über einen zentralen Server.
Starten
node mp-server.js
Dann im Browser öffnen: http://localhost:8600/feuer-wasser.html
Anderer Port: PORT=9000 node mp-server.js (bzw. unter Windows set PORT=9000 && node mp-server.js).
Kein npm install nötig — es gibt keine externen Abhängigkeiten, nur die Node-Standardbibliothek.
Spielmodi
- Lokales Spiel — beide Figuren an einem Gerät. 🔥 =
WASD, 💧 = Pfeiltasten. Läuft komplett im Browser, ohne Server-Logik. - Online-Multiplayer — jeder an seinem eigenen Gerät. Einer erstellt ein Spiel (5-stelliger Code), der andere tritt bei. Steuerung: die eigene Figur mit
WASDoder Pfeiltasten.
Architektur (echtes, server-autoritatives Multiplayer)
| Datei | Läuft wo | Aufgabe |
|---|---|---|
feuer-wasser.html |
Browser | Seite, HUD, Menüs |
fw-levels.js |
Browser und Server | Level-Daten (Doppel-Export) |
fw-engine.js |
Browser | Einzelspieler-Logik + Zeichnen + UI + Anzeige des Online-Zustands |
fw-sim.js |
Server (Node) und Browser | Autoritative Simulation — dieselbe Physik wie der Einzelspieler (Server rechnet die Welt, Client sagt seine Figur voraus) |
fw-net.js |
Browser | WebSocket-Client (schickt nummerierte Tasten, empfängt Zustand) |
mp-server.js |
Server (Node) | HTTP-Auslieferung + WebSocket + Spielschleife (fester Zeitschritt 1/60 s) |
So funktioniert Online (Standard-Netcode-Modell wie in AAA-Spielen):
- Server autoritativ — der Server rechnet die komplette Welt (beide Figuren,
Physik, Hebel, Tore, Edelsteine, Türen, Tod, Levelwechsel, Uhr) in
fw-sim.jsmit festem Zeitschritt. Es gibt nur eine Simulation → nichts kann driften. Der Client meldet nur Tasten ({seq,l,r,j}), niemals Positionen. - Prediction — der Client rechnet seine eigene Figur sofort lokal in festen
1/60-Schritten (gleicher Schritt wie der Server → exakt gleiche Physik, da diese
nicht zeitschritt-invariant ist) und zeichnet interpoliert zwischen den letzten
beiden Schritten → flüssig bei jeder Bildrate (60/75/144 Hz …), trotzdem 0 ms Lag.
Jede Eingabe bekommt eine laufende Nummer (
seq). Wichtig: der Server verarbeitet die Eingaben eine pro Tick aus einer Warteschlange (nicht „die neueste") — nur so macht er gleich viele Physik-Schritte wie die Vorhersage. - Reconciliation — im Zustandspaket bestätigt der Server die zuletzt verarbeitete
seq(ack). Der Client setzt seine Figur auf die Server-Position und spielt alle noch offenen Eingaben erneut ab (replay). Die winzige Restkorrektur wird über ~80 ms weich ausgeblendet (prediction error smoothing) → kein Rubberbanding, keine Ruckler. - Interpolation — der Mitspieler und die Welt (Plattformen, Tore, Türen) werden ~100 ms verzögert/geglättet gezeigt (flüssig trotz ~30 Hz Zustandspaketen und Jitter).
- Tod, Zerquetschen und Levelende entscheidet ausschließlich der Server.
Der Ersteller (Host) darf zusätzlich Level wählen und neu starten; alle anderen Ablauf-Wünsche ignoriert der Server.
Die Einzelspieler-Logik in fw-engine.js bleibt bewusst unangetastet. Damit
Vorhersage und Server exakt gleich rechnen, liegt die gemeinsame Physik in fw-sim.js
(lädt in Node und im Browser) — die dortige Kopie spiegelt das lokale Verhalten 1:1.
Auf einem echten Server installieren
-
Node.js (>= 14) installieren, den Ordner hochladen,
node mp-server.jsals Dienst laufen lassen (z. B. systemd, pm2 oderscreen). -
Der Server lauscht auf
0.0.0.0:PORT— hinter einem Reverse-Proxy (nginx/Caddy) betreiben und WebSocket-Upgrade auf/wsdurchreichen. Beispiel nginx:location / { proxy_pass http://127.0.0.1:8600; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; } -
Bei HTTPS verbindet sich der Client automatisch über
wss://(siehefw-net.js).