ES

Tutorial 7 — El multijugador online

JumPHP conecta a los jugadores mediante un servidor de retransmisión (WebSocket): el mismo código online en el escritorio y en el navegador. El juego Pong es el ejemplo completo (src/Scene/PlayScene.php).

La sala

$this->scenes()->switchTo(LobbyScene::class, [
    'next' => PlayScene::class,             // la escena del juego, una vez reunidos los jugadores
    'nextParams' => ['mode' => 'online'],
    'back' => TitleScene::class,
    'players' => 2,
]);

La sala crea una partida (un código de 4 letras para compartir), se une a una o busca un adversario. Después abre la escena del juego con ['online' => true, 'net' => NetSession, 'host' => bool, 'peer' => int].

Los mensajes

$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);   // a menudo: puede perderse
$net->sendJson(self::MSG_EVENT, ['goal' => 1]);                                   // poco frecuente: siempre llega

La buena organización

  • El anfitrión decide: simula la partida, cuenta los puntos y envía el estado ~20 veces por segundo;
  • los demás envían sus órdenes ~30 veces por segundo;
  • los objetos de los demás se dibujan con un pequeño retraso suavizado: SnapshotBuffer (push($this->engine->time(), $state) y después sample($this->engine->time())).

El servidor de retransmisión se lanza en tu equipo con bin/jumphp relay up; el juego indica el suyo con net_url en game.yaml (o ?net=wss://… en la dirección de la página).