2016-03-21 21 views
4

私は、socket.ioを使用してゲームPongのマルチプレーヤーブラウザの実装を行い、リアルタイムのロジスティクスに関する質問をしました。基本的には、プレイヤーのパドルは、押されているボタンに応じて上下に移動する単色のdivです。 AWSを使用して2つの異なるコンピュータでプログラムをテストしたところ、動きはほぼ完全に同期していましたが、正確ではないことがありました。パドルをコントロールするプレイヤーの場合、パドルの移動はローカルで行われますが、サーバーと対戦しているプレイヤーは、相手が上下に移動したかどうかのデータを継続的に送信します。プレーヤー側のサーバー側またはクライアント側?

私の質問は私がすべてのムーブメントサーバー側をしているのですか?ユーザが上を押して、パドルが移動すべきであることを両方のプレーヤに発する要求をサーバに送信するか、またはあなたのパドルの動きが局所的にうまく行われる私の方法ですか?

私のコードは今のようになります。チェック

クライアント側であればアップまたはボタンを押すと発光移動要求ダウン:

paddleMove = 0; // Keep track of which direction to move 
speed = 5; 
    if (paddleL.position().top > arena.position().top){ // If left paddle not at top 
     if (keysPressed.up) paddleMove -= speed; 
    } 
    if (paddleL.position().top+paddleL.height() < arena.position().top + arena.height() - 15){ // If left paddle not at bottom 
     if (keysPressed.down) paddleMove += speed; 
    } 
    paddleL.css({ // Move paddle locally 
     top: paddleL.cssNumber('top') + paddleMove + 'px' 
    }); 
    socket.emit("moveReq", paddleMove); // Send to server 

上記のコードは、のすべての部分を走る区間であります2番目。今度の警告でユーザー側のコードの別の部分が他のパドルを移動する

socket.on('moveReq', function(data){ // Send to opponent that other paddle moved 
    socket.broadcast.emit("movePaddle", data); 
}); 

::私が言ったように

socket.on("movePaddle", function(data){ 

     var paddleMove = 0; 
     paddleMove += data; // Data is speed (direction) of movement 
     paddleR.css({ // Move right paddle 
      top: paddleR.cssNumber('top') + paddleMove + 'px' 
     }); 

を、動き

は、その後、サーバ側では、このようになります。今はかなり良いですが完璧ではありません。私はその動きをローカルにしてはならないし、サーバー上ですべてを動かすべきでしょうか?

+0

芋あなたは、この場合には、特定の時間にサーバ側でクライアント側との同期の際にボールタッチパドルの動きを行う必要がありますので、あなたは、サーバーが過負荷にしてハッキングを防止するために防ぐことができます。これのために –

答えて

2

クライアント側で直ちに位置を更新します。次に、移動メッセージをサーバーに送信します。 サーバーからメッセージを戻すと、その位置がサーバーの値と同期します。

このように、クライアントの動きは、フレークな接続や高いレイテンシの接続ではスムーズに見えるはずです。しかし、いくつかの極端なケースでは、クライアントが同期していない可能性がありますので、パドルはそうでない位置にあるように見えます(ボールがパドルを通過するように見えるかもしれません)。どちらの方法でも高いpingが問題を解決します

4

現在、私はウェブソケットを使ったマルチプレイヤーゲームにも取り組んでいます。 リアルタイムのプレーヤーポジションを望むなら、それは多くの帯域幅を取るでしょう。

これまで私がしたことは予測とlerpingでした。 名前がA & Bの2人のプレーヤーが接続されているとします。

そう言えば、デフォルトではx = 0(t = 0)のになります。ですので、Bでもx = 0になります。 は、今、私たちは何をします(T = 1)、Aの位置がオンになっている1秒後(FPSが、その後値を下げた場合、あなたのゲームに応じて)ごとに1秒 Aのx-位置決幅をemiting開始します

ですx = 2(あなたに合わせて2ピクセル)。 Bは1.2秒後にAの位置を受信します(ネットワークの問題のために遅れていると考えます)。今度は、時間を予測するx = 0からx = 1までの位置を突き止めなければなりません。(これはすべてのスクリプトで達成することができる)

基本式(これは、更新関数で行われます)

CurrentXposition = (NewXPosition - CurrentXPosition) * deltatime ; 

さてあなたは間違いなく上記の式に仕事をしなければなりません。 deltatimeは、新しいポジションを受け取るたびに計算されます。そこでここではdeltatimeを使ってすべてを1つに突き止め、予測します。

Lerpingはプレイヤーの動きを滑らかにし、予測として動作するdeltatimeは、受信した位置に従って、Lerpingの正確な時間と滑らかさを設定します。

Refer this blog for more into this ,

And This for lerping formula

+0

ありがとうございます。私はいくつかのトラブルを抱えています。私は 'NewXPosition'を250msごとに送り出していますが、補間の際には' NewXPosition'が更新されるたびにキャラクターが「ジャンプ」します。新しいlerping値をゲームのfpsと同じレートで送信するはずですか? –

+1

2つの方法で位置同期を処理できます。 1つは、1秒間に10フレームの位置を送信するか、キーを押すことです。 タイムスタンプを使用して各フレームを受信すると、deltaTimeを計算する必要があります。つまり、前のフレームから経過した時間、ゲームの更新レートの差、また、物理をシミュレートするためにLerpingにいくつかのロジックを使用する必要があります。 –

関連する問題