PL

Samouczek 7 — Gra wieloosobowa online

JumPHP łączy graczy przez serwer przekaźnikowy (WebSocket): ten sam kod online na pulpicie i w przeglądarce. Gra Pong to pełny przykład (src/Scene/PlayScene.php).

Poczekalnia

$this->scenes()->switchTo(LobbyScene::class, [
    'next' => PlayScene::class,             // scena gry, gdy gracze się zbiorą
    'nextParams' => ['mode' => 'online'],
    'back' => TitleScene::class,
    'players' => 2,
]);

Poczekalnia tworzy pokój (4-literowy kod do udostępnienia), dołącza do istniejącego albo znajduje przeciwnika. Potem otwiera scenę gry z ['online' => true, 'net' => NetSession, 'host' => bool, 'peer' => int].

Wiadomości

$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);   // często: może zaginąć
$net->sendJson(self::MSG_EVENT, ['goal' => 1]);                                   // rzadko: zawsze dociera

Dobra organizacja

  • Host decyduje: symuluje rozgrywkę, liczy punkty i wysyła stan ~20 razy na sekundę;
  • pozostali wysyłają swoje komendy ~30 razy na sekundę;
  • obiekty innych graczy rysuje się z niewielkim, wygładzonym opóźnieniem: SnapshotBuffer (push($this->engine->time(), $state), a potem sample($this->engine->time())).

Serwer przekaźnikowy uruchamiasz u siebie poleceniem bin/jumphp relay up; gra wskazuje własny przez net_url w game.yaml (lub ?net=wss://… w adresie strony).