TR

Eğitim 7 — Çevrimiçi çok oyunculu

JumPHP, oyuncuları bir aktarma sunucusuyla (WebSocket) birbirine bağlar: masaüstünde ve tarayıcıda aynı çevrimiçi kod. Pong oyunu bunun eksiksiz örneğidir (src/Scene/PlayScene.php).

Salon

$this->scenes()->switchTo(LobbyScene::class, [
    'next' => PlayScene::class,             // oyuncular toplandığında oyunun sahnesi
    'nextParams' => ['mode' => 'online'],
    'back' => TitleScene::class,
    'players' => 2,
]);

Salon bir oda oluşturur (paylaşılacak 4 harfli bir kod), bir odaya katılır ya da bir rakip bulur. Ardından oyun sahnesini ['online' => true, 'net' => NetSession, 'host' => bool, 'peer' => int] ile açar.

Mesajlar

$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);   // sık: kaybolabilir
$net->sendJson(self::MSG_EVENT, ['goal' => 1]);                                   // nadir: her zaman ulaşır

Doğru düzen

  • Ev sahibi karar verir: oyunu simüle eder, puanları sayar ve durumu saniyede ~20 kez gönderir;
  • diğerleri komutlarını saniyede ~30 kez gönderir;
  • diğer oyuncuların nesneleri, yumuşatılmış küçük bir gecikmeyle çizilir: SnapshotBuffer (push($this->engine->time(), $state), ardından sample($this->engine->time())).

Aktarma sunucusu sizde bin/jumphp relay up ile başlatılır; oyun kendi sunucusunu game.yaml içindeki net_url ile belirtir (ya da sayfanın adresinde ?net=wss://…).