我到处找了找和我有类似问题的人,但什么也找不到。基本上我是在用NodeJS,Socket.io,Express和Jade创建一个实时多人游戏。
到目前为止,一切都很好,但是这看起来是一个相对较大的游戏,所以我决定使用OOP的概念,但是我不知道如何将它与socket.io结合起来。
例如,我有我的主服务器文件,我们将此文件称为server.js:
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 4040;
server.listen(port, function() {
console.log('Server listening on port %d', port);
});
app.set('views', __dirname + '/client');
app.set('view engine', 'jade');
app.engine('jade', require('jade').__express);
//Have a custom routing setup, works fine.
app.get('/', routes.index);
//The /client refers to where the views and css and everything is located
app.use(express.static(__dirname + '/client'));
io.on('connection', function (socket) {
socket.on ...
}
现在一切都很好,但是让我们假设我引入了一个player类,我们将调用player.js:
var name = '';
function player (name) {
this.name = name;
};
player.prototype.getName = function () {
return this.name;
};
module.exports = player;
然后将其导入server.js类,如下所示:
var player = require('./player.js');
这里一切都还很好。我可以创建新的player对象并调用它们的函数。
我遇到的困难是在主server.js文件之外使用socket.io。
据我所知,我的所有socket.on或socket.emit调用都需要在io.on('connection')中,因为socket是在那里创建的。
我见过的唯一接近这一点的是使用socket.io名称空间,这似乎并不能真正解决我的问题,因为事情仍然必须在它们自己的io.on('connection')中。
我也见过socketio-emitter,但我肯定需要在调用时监听Socket.on调用,而不仅仅是发射东西。
似乎应该有一种方法在更全球化的范围内使用这一点。
所以我所看到的是,看起来您需要将套接字从连接侦听器中取出,进入player对象。
如何做到这一点取决于您的体系结构,当套接字连接时,播放器对象是否已经在附近?如果是这样,您将需要跟踪套接字“为”的播放器(可能通过在套接字请求查询字符串中附加一个playerid或其他东西,如socket.io中的Send custom data with handshakeData?,然后在您的播放器列表中搜索该播放器),并将套接字提供给播放器对象,这样它就可以与前端播放器对象进行通信。
如果玩家obejct还不在,那就更容易了,因为你可以在那里构建它并传递它