Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何修复Node.JS和Socket.io中关闭的播放器定位_Javascript_Node.js_Websocket_Socket.io - Fatal编程技术网

Javascript 如何修复Node.JS和Socket.io中关闭的播放器定位

Javascript 如何修复Node.JS和Socket.io中关闭的播放器定位,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,我正在制作一个多人游戏,我制作玩家移动的方式是,每当你点击一个键,该键就会被发送到大厅中的所有其他用户。然后,他们会根据您单击的键更改您的位置。例如,如果我单击“W”键,它将发送给每个人,他们都会将我的角色向前移动。我这样做的原因是为了节省带宽,并试图消除很多延迟。但是,这会导致两个问题。其中一个原因是客户机不会同时收到密钥码。每当我在JavaScript上调用Date.now()时,当我收到该键时,它与其他客户端的距离大约为1。这将在它应该位于的位置之间产生大约3像素的间隙。我已经实现了增量时

我正在制作一个多人游戏,我制作玩家移动的方式是,每当你点击一个键,该键就会被发送到大厅中的所有其他用户。然后,他们会根据您单击的键更改您的位置。例如,如果我单击“W”键,它将发送给每个人,他们都会将我的角色向前移动。我这样做的原因是为了节省带宽,并试图消除很多延迟。但是,这会导致两个问题。其中一个原因是客户机不会同时收到密钥码。每当我在JavaScript上调用Date.now()时,当我收到该键时,它与其他客户端的距离大约为1。这将在它应该位于的位置之间产生大约3像素的间隙。我已经实现了增量时间,所以它在所有帧率上看起来都是一样的。第二个问题是我极力避免在服务器上托管玩家位置,除非必要。这是一个问题,因为如果玩家需要获得相同的位置,服务器无法向客户端提供该数据。为了解决这个问题,当我需要一个新的位置更新时,无论是因为我不在标签上,错过了一个键,还是因为我的位置关闭,我都会向另一个客户询问他们现有的球员位置。此解决方案仅在至少一个客户(询问者除外)在选项卡上时有效

我试着用一个设定间隔来不断地改变球员的位置,并将他们匹配起来,但这使得球员们到处都夹着。我也尝试过在服务器上托管玩家的位置,但它滞后了很多,如果服务器上有1000人,那就不好了

对于客户端,我使用p5js

这是一段代码,每当我单击一个键时,它都会向服务器发送我单击的键:

function keyPressed() {
  if (gameStarted) {
    if (keyCode === 122) {
      return false;
    }
    if (currentKey.key != null) {
      //if (currentKey.on == false || currentKey.key != keyCode) {
        currentKey.key = keyCode;
        currentKey.on = true;
        socket.emit('newKeyCode',{key:currentKey.key,on:true});

      //}
    }
    else {
      currentKey.key = keyCode;
      currentKey.on = true;
      socket.emit('newKeyCode',{key:currentKey.key,on:currentKey.on});
    }
  }
}

function keyReleased() {
  if (gameStarted) {
    if (currentKey.key != null) {
      currentKey.key = keyCode;
      currentKey.on = false;
      socket.emit('newKeyCode',{key:currentKey.key,on:currentKey.on});
    }
  }
}
这是每当我告诉服务器我按下了一个新键时服务器上的代码:

socket.on('newKeyCode',function(data) {
  var lobby = LOBBY_DATA[PLAYER_LIST[socket.id].lobby];
  if (lobby != null && lobby != undefined) {
    //console.log(data);
    for (var i in lobby.players) {           
      SOCKET_LIST[lobby.players[i].id].emit('newKeyFromClient', {id:socket.id,name:PLAYER_LIST[socket.id].user,key:data.key,on:data.on});
    }
  }
});
这是从服务器获取新密钥时运行的客户端代码:

socket.on('newKeyFromClient',function(data) {
  socket.emit('receivedKey');
  console.log(Date.now());
  if (gameStarted) {
    changePlayerDirections(data.key, data.on, data.id);
  }
});
我的目标是让客户都有完全相同的球员定位,你可以在。注册并登录后,单击左上角的“播放”按钮,然后再复制3个选项卡,这样您总共有4个选项卡,在其中一个选项卡上创建一个新的大厅,并将计算机屏幕拆分为4个窗口,这样您可以一次看到所有窗口,然后在所有窗口上加入您的大厅。当您的大厅中有4人时,单击主机窗口上的开始游戏。这将使你进入游戏,在游戏中你可以移动WASD,你会看到它在其他客户端屏幕上移动。不过,这会有点不对劲,这就是问题所在。我希望它在每一个屏幕上都是绝对准确的

编辑:
很抱歉,如果服务器发生了快速变化,我现在正在处理它。

我想您已经阅读了有关多人游戏的文章:使用UDP或TCP、发送接收数据的帧速率、在服务器上模拟游戏和同步等。我将写下我的体验

我制作了一个多人游戏,方式与此完全相同(使用node.js和socket.io发送关键事件)。局域网测试一切顺利。然后我在wifi上测试了它,结果是一场灾难。然后我发送了一个位置,他们开始四处跳跃。更大的问题是它变得很随机,更新速度也很慢

我读了几篇关于多人游戏的文章,决定使用UDP更新位置。它的速度很快,在wifi上,它的跳动可以忽略不计。现在正在服务器上部署,端口开始更改。我学习了NAT遍历和其他东西,但它太庞大了,我自己无法实现。我发现,至少服务器的端口是常量:“3000”

然后我回到TCP,尝试在服务器上模拟游戏并与客户端同步。我将关键事件和第三帧上的同步位置从服务器发送到客户端。没有太多的改进,我仍然需要同步游戏逻辑。那就是我停下来的地方


有一个逻辑,我想尝试,但一直无所事事。使用UDP将密钥事件发送到服务器,在服务器上进行模拟,并使用TCP进行同步,但这次使用时间戳来确定以哪个值为准(服务器或客户端)。减少要发送的数据,仅使用整数数组。

我想您已经阅读了关于多人游戏的文章:使用UDP或TCP、发送接收数据的帧速率、在服务器上模拟游戏和同步等。我只写我的经验

我制作了一个多人游戏,方式与此完全相同(使用node.js和socket.io发送关键事件)。局域网测试一切顺利。然后我在wifi上测试了它,结果是一场灾难。然后我发送了一个位置,他们开始四处跳跃。更大的问题是它变得很随机,更新速度也很慢

我读了几篇关于多人游戏的文章,决定使用UDP更新位置。它的速度很快,在wifi上,它的跳动可以忽略不计。现在正在服务器上部署,端口开始更改。我学习了NAT遍历和其他东西,但它太庞大了,我自己无法实现。我发现,至少服务器的端口是常量:“3000”

然后我回到TCP,尝试在服务器上模拟游戏并与客户端同步。我将关键事件和第三帧上的同步位置从服务器发送到客户端。没有太多的改进,我仍然需要同步游戏逻辑。那就是我停下来的地方

有一个逻辑,我想尝试,但一直无所事事。使用UDP将密钥事件发送到服务器,在服务器上进行模拟,并使用TCP进行同步,但这次使用时间戳来确定以哪个值为准(服务器或客户端)。并减少要发送的数据,仅使用整数数组