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
因此,我认为我可能需要检测每一侧的碰撞,并且在碰撞时不允许玩家朝那个方向移动,或者在碰撞发生时将玩家从碰撞中移开。提前谢谢你的帮助。没有答案,所以我转载了这个,希望能找到一些答案。谢谢