javascript - 用户断开连接后删除 Canvas 和套接字 IO 中的形状

标签 javascript html node.js socket.io html5-canvas

所以,我正在 SocketIO 和 Canvas 中开发多人游戏,但遇到了问题。每当用户断开游戏连接时,他们的 Angular 色仍然存在。我认为解决这个问题的方法是在他们断开连接时从游戏中删除他们的绘画或 Angular 色,但我就是不知道如何做到这一点。请帮忙!谢谢!

这是我的代码:

服务器.js

    var express = require('express');
    var http = require('http');
    var path = require('path');
    var socketIO = require('socket.io');

    //starts the express app
    var app = express();
    var server = http.Server(app);
    var io = socketIO(server);

    //where to run the server
    app.set('port', 5000);
    //Static files such as css, html, and javascript
    app.use('/public', express.static(__dirname + '/public'));

    // Routing
    app.get('/', function(req, res) {
      res.sendFile(path.join(__dirname, 'index.html'));
    });

    //Starting the Server
    server.listen(5000, function() {
      console.log('server running on port 5000');
    });

    io.on('connection', function(socket) {

    });

    setInterval(function() {
      io.sockets.emit('message', 'hi');
    }, 1000);

    //player connection
    var players = {};
    io.on('connection', function(socket) {
      socket.on('new player', function() {
        players[socket.id] = {
          x: 300,
          y: 300
        }
      });

      socket.on('movement', function(data) {
        var player = players[socket.id] || {};

        if(data.left) {
          player.x -= 5;
        }
        if(data.up) {
          player.y -= 5;
        }
        if(data.right) {
          player.x += 5;
        }
        if(data.down) {
          player.y += 5;
        }
      });

      socket.on('disconnect', function() {
        io.emit('user disconnected', 'user disconnected');
      })
    });

    setInterval(function() {
      io.sockets.emit('state', players);
    }, 1000 / 60);

index.html

<!DOCTYPE html>
<html>
   <head>
      <style>
         canvas {
         width: 800px;
         height: 600px;
         border: 5px solid black;
         }
      </style>
      <script src="/socket.io/socket.io.js"></script>
   </head>
   <body>
      <div id="gameBoard">
         <canvas id="canvas"></canvas>
      </div>
      <script>
         var socket = io();
         socket.on('message', function(data) {
           console.log(data);
         });


         socket.emit('new player');
         setInterval(function() {
           socket.emit('movement', movement);
         }, 1000/ 60);

         //Actual Canvas Code
         var movement = {
           up: false,
           down: false,
           left: false,
           right: false
         }

         document.addEventListener('keydown', function(event) {
           switch(event.keyCode) {
             case 65:
               movement.left = true;
               break;
             case 87: 
               movement.up = true;
               break;
             case 68:
               movement.right = true;
               break;
             case 83: 
               movement.down = true;
               break;
           }
         });

         document.addEventListener('keyup', function(event) {
           switch(event.keyCode) {
             case 65:
               movement.left = false;
               break;
             case 87:
               movement.up = false;
               break;
             case 68:
               movement.right = false;
               break;
             case 83:
               movement.down = false;
               break;
           }
         });

         var canvas = document.getElementById('canvas');
         canvas.width = 800;
         canvas.height = 600;
         var context = canvas.getContext('2d');
         socket.on('state', function(players) {
         context.clearRect(0, 0, 800, 600);
         context.fillStyle = 'green';
         for (var id in players) {
         var player = players[id];
         context.beginPath();
         context.arc(player.x, player.y, 10, 0, 2 * Math.PI);
         context.fill();
         }

         });

      </script>
   </body>
</html>

最佳答案

您可以使用断开连接事件来查找和删除用户:

socket.on('disconnect', ()  => {
    let i = players.indexOf(socket.id);
    players.splice(i, 1);
    socket.emit('userDisconnect', socket.id); 
    //you can use socket.id to identify the user in the front end
    //and delete his objects if necessary
});

关于javascript - 用户断开连接后删除 Canvas 和套接字 IO 中的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49459666/

相关文章:

javascript - 从 readFile 内部设置全局数组

node.js - 使用 AWS Lambda( Node )在 AWS DynamoDB 中更新项目

javascript - 如何解析这样的 Json 列表并在 HTML 中显示其元素?

javascript - 在 javascript 正则表达式中否定并重复原子组

html - 具有自动高度的子 div 彼此相邻

python - 带有用于上传的 Flask 的 HTML 文件夹选择器

node.js - 在 Windows 7 上安装 Node-xmpp

javascript - 从用户在 HTML 和 Javascript 中输入的数字开始倒计时

javascript - 例如,在使用 JWT 时如何保持共享 secret ?

html - 非HTML5支架的Grails 2