DE

Tutorial 7 — Online-Multiplayer

JumPHP verbindet die Spieler über einen Relay-Server (WebSocket): derselbe Online-Code auf dem Desktop und im Browser. Das Spiel Pong ist das vollständige Beispiel (src/Scene/PlayScene.php).

Die Lobby

$this->scenes()->switchTo(LobbyScene::class, [
    'next' => PlayScene::class,             // die Spielszene, sobald die Spieler beisammen sind
    'nextParams' => ['mode' => 'online'],
    'back' => TitleScene::class,
    'players' => 2,
]);

Die Lobby erstellt einen Raum (ein Code aus 4 Buchstaben zum Teilen), tritt einem bei oder findet einen Gegner. Dann öffnet sie die Spielszene mit ['online' => true, 'net' => NetSession, 'host' => bool, 'peer' => int].

Die Nachrichten

$net = $params['net'];
$net->removeAllListeners();
$net->on('message', fn (int $from, int $type, string $payload) => $this->receive($from, $type, $payload));
$net->on('peerLeave', fn (int $peer) => $this->scenes()->switchTo(TitleScene::class));

$net->send(self::MSG_STATE, pack('gg', $this->x, $this->y), reliable: false);   // häufig: darf verloren gehen
$net->sendJson(self::MSG_EVENT, ['goal' => 1]);                                   // selten: kommt immer an

Die richtige Aufteilung

  • Der Host entscheidet: Er simuliert die Partie, zählt die Punkte und sendet den Zustand ~20-mal pro Sekunde;
  • die anderen senden ihre Eingaben ~30-mal pro Sekunde;
  • die Objekte der anderen werden mit einer kleinen, geglätteten Verzögerung gezeichnet: SnapshotBuffer (push($this->engine->time(), $state) und dann sample($this->engine->time())).

Den Relay-Server startest du bei dir mit bin/jumphp relay up; das Spiel gibt seinen eigenen mit net_url in game.yaml an (oder mit ?net=wss://… in der Adresse der Seite).