PHP多人游戏:数据同步无法正常工作

时间:2013-01-19 22:38:45

标签: php ajax canvas multiplayer

我正在使用Canvas和MySQL数据库在PHP中开发多人游戏。 两名球员加入比赛,他们首先获得对手的位置(X,Y和角度)。

当他们准备好了,游戏开始了。游戏Algorthim是这样的。
每50毫升

  1. 计算自己的位置(X,Y)
  2. 获得对手角度(AJAX)并计算对手位置(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);
    
  4. 但不幸的是我得到了这个结果。接收数据有很大的延迟。谁能帮助我如何摆脱这个伟大的错误?真的很感激。

    玩家1的屏幕 Player 1 in one computer

    玩家2的屏幕 Player 2

2 个答案:

答案 0 :(得分:4)

您的脚本没有每隔50ms运行一次 - 因为只有在所有其他功能运行后才设置超时。根据{{​​1}}的工作方式,这可以为每个时间间隔添加往返时间。

例如,请考虑以下时间:

updateRound

因此,使用这些示例时序,您的循环将仅在~306ms之后运行。

可能值得考虑使用websockets将数据推送到客户端,而不是使用AJAX将其拉出来。

答案 1 :(得分:1)

我终于使用 Node.JS Socket.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。太棒了。