私はマルチプレイヤーフラッシュゲームに取り組んでいます。サーバーは、各クライアントに、プレーヤーの近くにいる他のプレーヤーを通知します。これを行うには、サーバーはどのクライアントが互いに近くにあるかを継続的にチェックする必要があります。以下は、一時的な解決策として、現時点で私が使用しているものです。
private function checkVisibilities()
{
foreach ($this->socketClients as $socketClient1)
{ //loop every socket client
if (($socketClient1->loggedIn()) && ($socketClient1->inWorld()))
{ //if this client is logged in and in the world
foreach ($this->socketClients as $cid2 => $socketClient2)
{ //loop every client for this client to see if they are near
if ($socketClient1 != $socketClient2)
{ //if it is not the same client
if (($socketClient2->loggedIn()) && ($socketClient2->inWorld())
{ //if this client is also logged in and also in the world
if ((abs($socketClient1->getCharX() - $socketClient2->getCharX()) + abs($socketClient1->getCharY() - $socketClient2->getCharY())) < Settings::$visibilities_range)
{ //the clients are near each other
if (!$socketClient1->isVisible($cid2))
{ //not yet visible -> add
$socketClient1->addVisible($cid2);
}
}
else
{ //the clients are not near each other
if ($socketClient1->isVisible($cid2))
{ //still visible -> remove
$socketClient1->removeVisible($cid2);
}
}
}
else
{ //the client is not logged in
if ($socketClient1->isVisible($cid2))
{ //still visible -> remove
$socketClient1->removeVisible($cid2);
}
}
}
}
}
}
正常に動作します。しかし、これまで私は一度に2人のプレイヤーとしかプレイしていません。この関数は、すべてのクライアントのすべてのクライアントをループしています。したがって、100人のプレーヤーでは、関数が実行されるたびに100 * 100=10.000ループになります。これは、それを行うための最良または最も効率的な方法ではないようです。
さて、皆さんは私の現在の設定についてどう思いますか、そしてこれらの可視性を処理するためのより良い方法について何か提案がありますか?
更新:私は世界が無限であることを言及するのを忘れました。それは実際には「宇宙」です。地図はありません。また、2次元(2D)ゲームです。
前もって感謝します。