Socket io多人游戏基础设施

时间:2013-11-27 18:32:20

标签: javascript node.js express socket.io

var connectionHandler = function(socket) {
var player = null;

socket.on('login', function(data) {
    player = {
        data: okeyServer.playerJoin(data),
        socket: socket
             };
    socket.emit('welcome');
});

socket.on('info server', function(data) {
    var info = okeyServer.Info();
    socket.emit('info server', info);
});

socket.on('join game', function (data) {
    var gameid = data.gameid;
    var side = data.side;
    okeyServer.playerJoinGame(player, gameid, side);
});

socket.on('disconnect', function () {
    okeyServer.playerLeave(player);
    io.sockets.emit('player leave', player);
});
}

我正在尝试使用socket.io进行多人游戏应用。当玩家连接时,我希望首先发送“登录”消息。我初始化播放器变量以供进一步使用。 其他消息稍后使用播放器变量。

如何确保客户在发出其他请求之前发送了“登录”消息。 我可以检查玩家在我需要玩家的每个请求中是否为空,但这看起来很难看。

1 个答案:

答案 0 :(得分:0)

您可以在login侦听器中安装其他侦听器:

var connectionHandler = function(socket) {
  var player = null;

  socket.on('login', function(data) {
    // If we already have a player, just return a `welcome` message.
    if (player !== null) {
      return socket.emit('welcome');
    }

    // Store player.
    player = {
      data: okeyServer.playerJoin(data),
      socket: socket
    };

    // Emit welcome message.
    socket.emit('welcome');

    // Set up the rest of the listeners.
    socket.on('info server', function(data) {
      var info = okeyServer.Info();
      socket.emit('info server', info);
    });

    socket.on('join game', function (data) {
      var gameid = data.gameid;
      var side = data.side;
      okeyServer.playerJoinGame(player, gameid, side);
    });

    socket.on('disconnect', function () {
      okeyServer.playerLeave(player);
      io.sockets.emit('player leave', player);
    });
  });
};

这假设客户端在连接的生命周期内只发送一次login消息。如果情况并非如此,则需要进行一些更改。