0

我正在制作一个 node.js 游戏服务器,并且我正在将 socket.io 用于 webscockets 和房间。然而,这主要是一个纯 JavaScript 问题:

我正在为每 2 个玩家创建一个随机数的房间,它的工作原理是这样的:

  • 随机生成一个房间号并全局存储;
  • 玩家加入房间
  • 如果他是这个房间的第二个玩家,则生成一个新的房间号,下一个玩家加入下一个随机号房间

    var openRoom = Math.floor(Math.random() * 90000) + 10000;
    
    io.sockets.on('connection', function (socket) {
    
        socket.on('addPlayer', function(username) {
    
            if (io.sockets.clients(openRoom).length <= 2)  {
                socket.join(openRoom);
            } else {
                openRoom = Math.floor(Math.random() * 90000) + 10000;
                socket.join(openRoom);
            }
    ...
    

    有没有办法不使用 global openRoom

  • 4

    2 回答 2

    3

    您需要使用闭包,以便将openRoom变量公开给内部函数。

    例如:

    (function() {
    
    var openRoom = Math.floor(Math.random() * 90000) + 10000;
    
    io.sockets.on('connection', function (socket) {
    
        socket.on('addPlayer', function(username) {
    
            if (io.sockets.clients(openRoom).length <= 2)  {
                socket.join(openRoom);
            } else {
                openRoom = Math.floor(Math.random() * 90000) + 10000;
                socket.join(openRoom);
            }
    ...
    
    })();
    

    您还可以创建一个全局对象来存储您的任何全局变量:

    if (typeof window['MyApp'] == 'undefined') {
    
        MyApp = {
            someVar: someValue
        };
    
    }
    

    这使您可以稍后获取/设置它:

    var x = MyApp.someVar;
    
    于 2013-02-08T09:42:56.067 回答
    0

    查看 Redis.io 等数据存储解决方案。它们是为这类瞬态事物而设计的,以帮助您不让代码与全局变量混淆,同时具有足够的性能以不会显着减慢速度。

    使用 redis,您只需调用一个函数,将 redis 中的键更新为新值。

    于 2013-02-08T09:48:43.253 回答