【问题标题】:converting this singleplayergame into a multiplayergame将此单人游戏转换为多人游戏
【发布时间】:2019-05-28 10:19:40
【问题描述】:

我正在尝试使用 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);
  }
}

在游戏文件的“创建:”部分,我添加了这个:

        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 控制台以及谷歌浏览器的客户端控制台中看到头部的位置。

要在这些坐标上实际绘制一条蛇,我已经尝试过了,但它不起作用。我真的不知道从这里去哪里,所以如果有人想参与进来,我会很高兴!

  function newDrawing(snakehead){
      var snake = new PlayerSnake(this.game, 'circle', snakehead, snakehead);
    }

【问题讨论】:

  • 你能检查一下是连接问题还是渲染问题?

标签: javascript websocket socket.io multiplayer phaser-framework


【解决方案1】:

仅传输头部位置不足以对数据做任何有用的事情。相反,您必须序列化这些部分及其位置:

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

【讨论】:

  • 好的,蛇现在每 2 秒被发送到服务器,当我控制台登录节点时,我看到每个 clents 蛇位置 X 和 Y。但是当它们被广播到客户端时赛斯; “game.js:63 Uncaught ReferenceError: game is not defined” 我试着把它改成“this.game”,但是当我这样做时,我得到了一个新错误:“game.js:63 Uncaught ReferenceError: snake is not定义”。有任何想法吗? @乔纳斯·威尔姆斯
  • @ja 你必须在index.html全局公开它
  • 我想它已经是了吗?生病编辑帖子以包含 index.html 文件,以便您可以看到
  • @ja var game 是一个局部范围的变量,删除它周围的 (function() { /*..*/ })() 使其成为全局变量。在开始编码之前,你应该真正学习范围界定......
  • @ja 和我链接了文件,所以我看了看,没有理由编辑问题,index.html 的内容不是你问题的一部分
猜你喜欢
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多