【发布时间】:2016-03-23 14:58:07
【问题描述】:
我刚刚使用 socket.io 制作了 Pong 游戏的多人浏览器实现,并且有一个关于实时物流的问题。基本上,玩家的桨只是一个彩色的 div,根据他们按下的按钮上下移动。当我使用 AWS 在两台不同的计算机上测试我的程序时,我注意到运动几乎完全同步,但有时并不精确。对于控制桨的玩家,他们的桨的移动是在本地完成的,但对于他们正在与服务器对战的人来说,他们会不断地向他们发送他们的对手是向上还是向下移动的数据。
我的问题是我应该在服务器端进行所有移动吗?就像用户按下向上键,它向服务器发送一个请求,该请求向两个玩家发出桨应该移动的请求,或者我的方式是在本地完成桨的移动吗?
我现在的代码如下所示:
客户端检查是否按下向上或向下按钮并发出移动请求:
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
上面的代码是在每隔几分之一秒运行的时间间隔内。
那么服务器端是这样的:
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'
});
正如我所说,现在的运动非常好,但并不完美。我是否应该不进行任何本地移动并使其全部在服务器上发出?
【问题讨论】:
-
Imo 你应该在客户端做动作并在特定时间与服务器端同步,在这种情况下,当球触摸桨时,这样你就可以防止服务器过载并防止黑客攻击。