No description
  • JavaScript 88.1%
  • HTML 11.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Pablo1732 63d2aced70 0.1.8 — Plattformen wirklich glatt + robuste Glitches + Punkteanzeige
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>
2026-07-25 13:39:32 +02:00
.gitignore Feuer & Wasser 0.1.0 — lokales Spiel + server-autoritativer Multiplayer 2026-07-24 16:19:41 +02:00
feuer-wasser.html Feuer & Wasser 0.1.0 — lokales Spiel + server-autoritativer Multiplayer 2026-07-24 16:19:41 +02:00
fw-engine.js 0.1.8 — Plattformen wirklich glatt + robuste Glitches + Punkteanzeige 2026-07-25 13:39:32 +02:00
fw-levels.js Feuer & Wasser 0.1.0 — lokales Spiel + server-autoritativer Multiplayer 2026-07-24 16:19:41 +02:00
fw-net.js Feuer & Wasser 0.1.0 — lokales Spiel + server-autoritativer Multiplayer 2026-07-24 16:19:41 +02:00
fw-sim.js 0.1.6 — Levelwechsel per Selector: Figur nicht mehr am Anfang "stuck" 2026-07-25 08:53:02 +02:00
mp-server.js 0.1.8 — Plattformen wirklich glatt + robuste Glitches + Punkteanzeige 2026-07-25 13:39:32 +02:00
README.md Feuer & Wasser 0.1.0 — lokales Spiel + server-autoritativer Multiplayer 2026-07-24 16:19:41 +02:00

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 WASD oder 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):

  1. Server autoritativ — der Server rechnet die komplette Welt (beide Figuren, Physik, Hebel, Tore, Edelsteine, Türen, Tod, Levelwechsel, Uhr) in fw-sim.js mit festem Zeitschritt. Es gibt nur eine Simulation → nichts kann driften. Der Client meldet nur Tasten ({seq,l,r,j}), niemals Positionen.
  2. 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.
  3. 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.
  4. 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).
  5. 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.js als Dienst laufen lassen (z. B. systemd, pm2 oder screen).

  • Der Server lauscht auf 0.0.0.0:PORT — hinter einem Reverse-Proxy (nginx/Caddy) betreiben und WebSocket-Upgrade auf /ws durchreichen. 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:// (siehe fw-net.js).