私は2Dフラッシュマルチプレイヤーゲームとソケットサーバーを書いています。クライアント - サーバマルチプレイヤー(MMO)ゲームの動き "アルゴリズム"?
- クライアントは、プレーヤの移動モード(前進または後退)とプレーヤの旋回モード(旋回しない、左に旋回する)についてサーバに通知します。クライアントとサーバ間の移動アルゴリズムのオリジナル計画は次のとおりです。または右に曲がる)。
- サーバーは、数ミリ秒ごとにすべてのプレーヤーをループし、時間の差に基づいて回転した角度と移動した角度を計算します。同じ計算がクライアントによって行われます。
クライアントのために私の現在の計算(同じ数学がサーバーで使用されている)==>
回す
var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
var rot:uint = Math.round((newTimeStamp - turningTimeStamp)/1000 * 90); //speed = x degrees turning every 1 second
turningTimeStamp = newTimeStamp; //update timeStamp
if (turningMode == 1) //left
{
movementAngle = fixAngle(movementAngle - rot);
}
else if (turningMode == 2) //right
{
movementAngle = fixAngle(movementAngle + rot);
}
private function fixAngle(angle:int):uint //fixes an angle in degrees (365 -> 5, -5 -> 355, etc.)
{
if (angle > 360)
{
angle -= (Math.round(angle/360) * 360);
}
else if (angle < 0)
{
angle += (Math.round(Math.abs(angle)/360) + 1) * 360;
}
return angle;
}
運動
var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
var distance:uint = Math.round((newTimeStamp - movementTimeStamp)/1000 * 300); //speed = x pixels forward every 1 second
movementTimeStamp = newTimeStamp; //update old timeStamp
var diagonalChange:Array = getDiagonalChange(movementAngle, distance); //with the current angle, howmuch is dX and dY?
x += diagonalChange[0];
y += diagonalChange[1];
private function getDiagonalChange(angle:uint, distance:uint):Array
{
var rAngle:Number = angle * Math.PI/180;
return [Math.round(Math.sin(rAngle) * distance), Math.round((Math.cos(rAngle) * distance) * -1)];
}
これはうまくいくようです。遅れを考慮するために、サーバーはクライアントの情報を毎回修正してから、このデータを送信します。
このシステムでは、動きを処理するために非常に小さな帯域幅が使用されます。しかし、私のサーバーとクライアントの座標と角度の違いは大きすぎます。私はたぶん私の「アルゴリズム」を拡張して、ユーザが持っているレイテンシを考慮に入れるべきでしょうか?または、クライアントの動きをよりうまく処理する方法がありますか?<>優れたパフォーマンスを発揮するサーバーマルチプレイヤーゲームはありますか?
すべてのクライアントが他のすべてのクライアントに現在の場所について通知する必要がある場合、サーバーは大量のメッセージを受信して再送信する必要はありませんか? – Tom
+1私は実際に同じことを提案しようとしていました。これは、人気のあるマルチプレーヤーのビデオゲームの多くが何をしているのかです。サーバーは誰もが定期的に同期していることを確認します。 (私はQuakeのゲームがこれをすると信じています) –
まあ、私の最初の質問はまだ適用されます。すべてのステップでサーバーを最新の状態に保つために、クライアントは常に何千ものメッセージを送信する必要はありませんか?その後、このデータを近くのすべてのプレーヤーに送信するサーバーが続きます。 – Tom