1

CanvasとMySQLデータベースを使用してPHPでマルチプレイヤーゲームを開発しています。2人のプレイヤーがゲームに参加し、最初に対戦相手の位置(X、Y、Angle)を取得します。

準備ができたら、ゲームが始まります。ゲームアルゴリズムはこのようになります。
50ミリ秒ごと

  1. 自分の位置を計算する(X、Y)
  2. 対戦相手の角度(AJAX)を取得し、対戦相手のpos(X2、Y2)を計算します
  3. 次に、Canvasに描画し、データベースを更新します。

    context.fillStyle = "green";
    context.fillRect(p1.x,p1.y, 5,5);
    addPoints(p1.x,p1.y);
    updateRoundJQ(p1.x,p1.y,p1.a);
    
    context.fillStyle = "red";
    context.fillRect(x2,y2, 5,5);
    addPoints(x2,y2);
    
    loopTimer = setTimeout('drawLine()', 50);
    

しかし、残念ながら私はこの結果を得ました。データの受信には大きな遅延があります。誰かがこの大きなエラーを取り除く方法を教えてもらえますか?本当にありがたいです。

プレーヤー1の画面 1台のコンピューターのプレーヤー1

プレーヤー2の画面 プレーヤー2

4

2 に答える 2

4

スクリプトは50ミリ秒ごとに実行されているわけではありません。他のすべての関数が実行された後にのみタイムアウトを設定しているためです。動作方法によってはupdateRound、これにより各間隔に往復の時間が追加される可能性があります。

たとえば、次のタイミングを考慮してください。

context.fillStyle = "green"; // 1ms
context.fillRect(p1.x,p1.y, 5,5); // 1ms
addPoints(p1.x,p1.y); // 1ms
updateRoundJQ(p1.x,p1.y,p1.a); // web request? 300ms

context.fillStyle = "red"; // 1ms
context.fillRect(x2,y2, 5,5); // 1ms
addPoints(x2,y2); // 1ms

loopTimer = setTimeout('drawLine()', 50); // wait 50ms from now

したがって、これらのタイミング例では、ループは約306ms後にのみ実行されます。

AJAXでデータをプルするのではなく、WebSocketを使用してデータをクライアントにプッシュすることを検討する価値があるかもしれません。

于 2013-01-19T22:52:19.833 に答える
1

私はついにNode.JSSocket.IOを使用して解決策を見つけました。解決策は、AJAXよりもはるかに簡単です。

  //Client Side Request   
  function sendMyPoints(){
       socket.emit('myPoints',p1.x,p1.y);
  }

  //Server Handles the Request 
  socket.on('myPoints',function(xP, yP){
    socket.broadcast.emit('getOppPoints',xP,yP);
  });

  //Client gets the Response
  socket.on('getOppPoints',function(xPos,yPos){
      drawOppPoints(xPos, yPos);
  });

Websocketを提案していただきありがとうございます。それは素晴らしいです。

于 2013-01-20T22:50:24.963 に答える