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
Node.js 如何使用socket.io检测画布中矩形的某些边上的冲突_Node.js_Html_Socket.io_Html5 Canvas_Collision Detection - Fatal编程技术网

Node.js 如何使用socket.io检测画布中矩形的某些边上的冲突

Node.js 如何使用socket.io检测画布中矩形的某些边上的冲突,node.js,html,socket.io,html5-canvas,collision-detection,Node.js,Html,Socket.io,Html5 Canvas,Collision Detection,我正在学习多人游戏开发,我想知道如何检测碰撞,不让玩家进入碰撞,而是让他们远离碰撞。我目前有一个碰撞检测设置,当玩家尝试移动时,它是服务器端的。虽然这种碰撞检测在玩家碰撞时工作得很好,但他们无法从碰撞中移出,并且永远被卡住。以下是我使用服务器端检测玩家移动或碰撞时的代码: socket.on('moveEvent', function(data) { var player = players[find(connections, this.id)] var r1 = { left:

我正在学习多人游戏开发,我想知道如何检测碰撞,不让玩家进入碰撞,而是让他们远离碰撞。我目前有一个碰撞检测设置,当玩家尝试移动时,它是服务器端的。虽然这种碰撞检测在玩家碰撞时工作得很好,但他们无法从碰撞中移出,并且永远被卡住。以下是我使用服务器端检测玩家移动或碰撞时的代码:

socket.on('moveEvent', function(data) {
  var player = players[find(connections, this.id)]
  var r1 = {
    left: player.position.x,
    top: player.position.y,
    bottom: player.position.y + 100,
    right: player.position.x + 100
  }
  var intersects = false;
  for (var i = 0; i < players.length; i++) {
    if (connections[i] != this.id) {
      var currPlayer = players[i]
      var r2 = {
        left: currPlayer.position.x,
        top: currPlayer.position.y,
        bottom: currPlayer.position.y + 100,
        right: currPlayer.position.x + 100
      }
      intersects = intersectRect(r1, r2)
    }
  }
  console.log(intersects)
  if (data.direction == "x+" && intersects == false) {
    player.position.x = player.position.x - speed
  }
  if (data.direction == "y+" && intersects == false) {
    player.position.y = player.position.y - speed
  }
  if (data.direction == "x-" && intersects == false) {
    player.position.x = player.position.x + speed
  }
  if (data.direction == "y-" && intersects == false) {
    player.position.y = player.position.y + speed
  }
});

function intersectRect(r1, r2) {
  socket.emit('checkPlayers', {
    p1: r1,
    p2: r2
  })
  if (!(r2.left > r1.right || r2.right < r1.left || r2.top > r1.bottom || r2.bottom < r1.top)) {
    return true;
  } else {
    return false;
  }
}
socket.on('moveEvent',函数(数据){
var player=players[find(connections,this.id)]
变量r1={
左:player.position.x,
顶部:玩家。位置。y,
底部:玩家。位置。y+100,
右:玩家。位置。x+100
}
var相交=假;
对于(变量i=0;ir1.right | | r2.rightr1.bottom | | r2.bottom
下面是获取新坐标并将其绘制到屏幕上的setInterval代码。我目前在intersectRect函数中有一个emit事件,它会发出它正在检查冲突的两个播放器。然后,服务器接收发出的数据并打印出它发送的两个播放器。这完全是为了修复bug:

setInterval(function() {
  if (w == true) {
    socket.emit('moveEvent', {
      direction: "y+",
      id: sesID
    })
  }
  if (a == true) {
    socket.emit('moveEvent', {
      direction: "x+",
      id: sesID
    })
  }
  if (s == true) {
    socket.emit('moveEvent', {
      direction: "y-",
      id: sesID
    })
  }
  if (d == true) {
    socket.emit('moveEvent', {
      direction: "x-",
      id: sesID
    })
  }
  gamectx.canvas.width = window.innerWidth;
  gamectx.canvas.height = window.innerHeight;
  gamectx.clearRect(0, 0, game.width, game.height);
  socket.emit('request', {
    request: "players",
    id: sesID
  });
  for (var i = 0; i < players.length; i++) {
    gamectx.fillStyle = "#ff0000"
    gamectx.fillRect(((game.width / 2) + (players[i].position.x - player.position.x)) - 50, ((game.height / 2) + (players[i].position.y - player.position.y)) - 50, 100, 100)
  }
  gamectx.fillStyle = "#0000ff"
  gamectx.fillRect((window.innerWidth / 2) - 50, (window.innerHeight / 2) - 50, 100, 100);
  gamectx.font = "48px sans-serif";
  gamectx.strokeText("x: " + GameX + ", y: " + GameY, 10, 50);
  var playersList = ""
  for (var i = 0; i < players.length; i++) {
    playersList += "x: " + players[i].position.x + ", y: " + players[i].position.y + ", "
  }
  gamectx.font = "30px sans-serif";
  gamectx.strokeText(playersList, 10, 100);
  console.log(p1, p2)
}, 30);
setInterval(函数(){
如果(w==true){
socket.emit('moveEvent'{
方向:“y+”,
id:sesID
})
}
如果(a==true){
socket.emit('moveEvent'{
方向:“x+”,
id:sesID
})
}
如果(s==true){
socket.emit('moveEvent'{
方向:“y-”,
id:sesID
})
}
如果(d==true){
socket.emit('moveEvent'{
方向:“x-”,
id:sesID
})
}
gamectx.canvas.width=window.innerWidth;
gamectx.canvas.height=window.innerHeight;
gamectx.clearRect(0,0,game.width,game.height);
socket.emit('request'{
请求:“玩家”,
id:sesID
});
对于(变量i=0;i
因此,我认为我可能需要检测每一侧的碰撞,并且在碰撞时不允许玩家朝那个方向移动,或者在碰撞发生时将玩家从碰撞中移开。提前谢谢你的帮助。没有答案,所以我转载了这个,希望能找到一些答案。谢谢