将这个单人游戏转换为多人游戏
converting this singleplayergame into a multiplayergame
我正在尝试使用 websockets 将此单人游戏转换为多人游戏。
https://github.com/Loonride/slither.io-clone/tree/master/slither-io
到目前为止,我已经制作了一个服务器和一个客户端套接字,这样客户端 A 和客户端 B 就可以在各自的控制台中相互通信它们的蛇 X 和 Y 位置。到目前为止,这有效。但现在我试图在那些 x、y 位置上画一条蛇,我对此有点麻烦,因为我真的不确定从哪里开始做。 (我是编程新手,使用这个项目来学习和编码)。
这是我目前所拥有的。在服务器文件中(处理通信的部分):
socket.on('snakeemit', snakeMsg);
function snakeMsg(snakehead) {
socket.broadcast.emit('snakeemit', snakehead);
console.log(snakehead);
}
}
在游戏文件的 "create:" 部分,我添加了:
socket = io.connect('http://localhost:8080');
var snakehead = snake.head.position;
socket.emit('snakeemit', snakehead);
socket.on('snakeemit', newDrawing);
function newDrawing(snakehead){
console.log(snakehead);
}
所以这似乎可以让客户端和服务器进行通信,我可以在我的 node.js 控制台以及 google 的客户端控制台中看到头部的位置 chrome。
在这些坐标上实际画一条蛇,我已经试过了,但它不起作用。我真的不确定从这里去哪里,所以如果有人想参与其中,我会很高兴!
function newDrawing(snakehead){
var snake = new PlayerSnake(this.game, 'circle', snakehead, snakehead);
}
仅传输头部位置不足以对数据做任何有用的事情。相反,您必须序列化这些部分及其位置:
var username = "test"; // to be set on game start
function serializeSnake(snake) {
return {
username,
sections: snake.sections.map(section => ({ x: section.x, y: section.y })),
head: { x: snake.head.x, y: snake.head.y },
};
}
function deserializeSnake(data) {
const snake = new Snake(game, "circle", data.head.x, snake.data.y);
for(const section of data.sections)
snake.addSection(section.x, section.y);
}
现在您可以轻松地每隔 x 秒传输一次蛇数据:
setInterval(function () {
socket.emit('snakeemit', serializeSnake(snake));
}, 2000);
当它到达另一个客户端时,您可以将蛇添加到蛇中:
const snakeByPlayer = new Map/*<string, Snake>*/();
socket.on("snakeemit", function(data) {
if(snakeByPlayer.has(data.username)) {
// update the snake with the data
} else {
const snake = deserializeSnake(data);
game.snakes.push(snake);
snakeByPlayer.set(snake.username, snake);
}
});
我正在尝试使用 websockets 将此单人游戏转换为多人游戏。
https://github.com/Loonride/slither.io-clone/tree/master/slither-io
到目前为止,我已经制作了一个服务器和一个客户端套接字,这样客户端 A 和客户端 B 就可以在各自的控制台中相互通信它们的蛇 X 和 Y 位置。到目前为止,这有效。但现在我试图在那些 x、y 位置上画一条蛇,我对此有点麻烦,因为我真的不确定从哪里开始做。 (我是编程新手,使用这个项目来学习和编码)。
这是我目前所拥有的。在服务器文件中(处理通信的部分):
socket.on('snakeemit', snakeMsg);
function snakeMsg(snakehead) {
socket.broadcast.emit('snakeemit', snakehead);
console.log(snakehead);
}
}
在游戏文件的 "create:" 部分,我添加了:
socket = io.connect('http://localhost:8080');
var snakehead = snake.head.position;
socket.emit('snakeemit', snakehead);
socket.on('snakeemit', newDrawing);
function newDrawing(snakehead){
console.log(snakehead);
}
所以这似乎可以让客户端和服务器进行通信,我可以在我的 node.js 控制台以及 google 的客户端控制台中看到头部的位置 chrome。
在这些坐标上实际画一条蛇,我已经试过了,但它不起作用。我真的不确定从这里去哪里,所以如果有人想参与其中,我会很高兴!
function newDrawing(snakehead){
var snake = new PlayerSnake(this.game, 'circle', snakehead, snakehead);
}
仅传输头部位置不足以对数据做任何有用的事情。相反,您必须序列化这些部分及其位置:
var username = "test"; // to be set on game start
function serializeSnake(snake) {
return {
username,
sections: snake.sections.map(section => ({ x: section.x, y: section.y })),
head: { x: snake.head.x, y: snake.head.y },
};
}
function deserializeSnake(data) {
const snake = new Snake(game, "circle", data.head.x, snake.data.y);
for(const section of data.sections)
snake.addSection(section.x, section.y);
}
现在您可以轻松地每隔 x 秒传输一次蛇数据:
setInterval(function () {
socket.emit('snakeemit', serializeSnake(snake));
}, 2000);
当它到达另一个客户端时,您可以将蛇添加到蛇中:
const snakeByPlayer = new Map/*<string, Snake>*/();
socket.on("snakeemit", function(data) {
if(snakeByPlayer.has(data.username)) {
// update the snake with the data
} else {
const snake = deserializeSnake(data);
game.snakes.push(snake);
snakeByPlayer.set(snake.username, snake);
}
});