IT

Tutorial 7 — Il multigiocatore online

JumPHP collega i giocatori tramite un server relay (WebSocket): lo stesso codice online sul desktop e nel browser. Il gioco Pong ne è l'esempio completo (src/Scene/PlayScene.php).

La lobby

$this->scenes()->switchTo(LobbyScene::class, [
    'next' => PlayScene::class,             // la scena del gioco, una volta riuniti i giocatori
    'nextParams' => ['mode' => 'online'],
    'back' => TitleScene::class,
    'players' => 2,
]);

La lobby crea una stanza (un codice di 4 lettere da condividere), ne raggiunge una oppure trova un avversario. Poi apre la scena del gioco con ['online' => true, 'net' => NetSession, 'host' => bool, 'peer' => int].

I messaggi

$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);   // spesso: può andare perso
$net->sendJson(self::MSG_EVENT, ['goal' => 1]);                                   // raro: arriva sempre

La buona organizzazione

  • L'host decide: simula la partita, conta i punti e invia lo stato ~20 volte al secondo;
  • gli altri inviano i loro comandi ~30 volte al secondo;
  • gli oggetti degli altri si disegnano con un piccolo ritardo smussato: SnapshotBuffer (push($this->engine->time(), $state) poi sample($this->engine->time())).

Il server relay si avvia a casa tua con bin/jumphp relay up; il gioco indica il proprio con net_url in game.yaml (oppure ?net=wss://… nell'indirizzo della pagina).