播放器定位服务器端还是客户端?

时间:2016-03-21 21:43:48

标签: node.js socket.io pong

我刚刚使用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);
});

反过来警告另一部分用户端代码移动另一个paddle:

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'
        });

正如我所说,现在的运动非常好但不完美。我应该不在本地运动,并将其全部放在服务器上吗?

2 个答案:

答案 0 :(得分:4)

目前我甚至使用网络套接字进行多人游戏。 如果你想要实时的玩家位置,则需要很多带宽。

到目前为止,我所做的是预测和学习。 假设有两个连接的玩家名为A&amp; B。

假设播放器 A默认为x = 0(t = 0),所以在B上它也将在x = 0上。 现在我们要做的是每1秒开始发出一次x-positon (取决于你的游戏,如果fps然后降低值)

1秒(t = 1)之后,A的位置在x = 2(根据您的2px)。 B在1.2秒后收到A的位置(由于网络问题而考虑迟到)。现在我们必须将位置从x = 0变为x = 1来预测时间。 (这一切都可以通过脚本实现)

基本公式(这将在更新功能中完成)

CurrentXposition = (NewXPosition - CurrentXPosition) * deltatime ;

你必须完全按照上述公式进行操作。每当我们收到新职位时,都会计算deltatime。所以我们在这里使用deltatime来预测和预测所有内容。

Lerping将平滑玩家的移动,delta time将作为预测工作,根据收到的位置设置正确的时间和lerping的平滑度。

Refer this blog for more into this ,

And This for lerping formula

答案 1 :(得分:2)

立即在客户端更新位置。然后将移动消息发送到服务器。 当您从服务器收到消息时,将位置同步到服务器的值。

这样,客户端移动在片状或高延迟连接上看起来仍然应该是平滑的。然而,在某些极端情况下,客户端可能会非常不同步,以至于球拍看起来处于不可能的位置(球可能看起来通过球拍) - 尽管高ping是两种方式要解决问题