我在构建node.js socket.io项目时遇到了问题。 用户可以加入客房。游戏室有一个队列,他们可以排队等待游戏。如果有足够的人排队,他们会被扔进游戏大厅。客房实现聊天功能,应该在Gamerooms和Lobbies中使用。
现在我将io对象传递给实例化,并使用它来侦听特定于其类功能的事件。
我可以做些什么改进?为什么这是一个糟糕或好的设计选择?有什么替代品?有什么需要考虑的? 我应该分开课程" Room"," Gameroom"和"大厅"进入一个更加独特的模型&控制器。
我知道这是一个相当"讨论"问题,但我对每一个输入都是开放的。感谢。
服务器实例化房间。
const io = socket.listen(
http.createServer(app).listen(8080)
);
console.log('Server listening..');
app.get('/', function (req, res) {
res.sendFile(__dirname + '/test.html');
});
var main = new Room('', io);
var a = new Gameroom('a', io);
var b = new Gameroom('b', io);
Room是父类,但也可以实例化。它应该是一个根通道,每个人登录时都会加入。
class Room {
constructor(name, io) {
this.name = name;
this.users = [];
this.namespace = io.of('/' + name);
this.listenOnRoom();
}
listenOnRoom() {
this.namespace.on('connection', (socket) => {
...
socket.on('disconnect', (msg) => {
...
});
socket.on('chatMessage', (msg) => {
...
});
});
}
}
module.exports = Room;
Gameroom增加了为游戏排队的能力。
class Gameroom extends Room {
constructor(name, io) {
super(name, io);
this.io = io;
this.queue = [];
this.lobbies = [];
this.listenOnGameroom();
}
listenOnGameroom() {
this.namespace.on('connection', (socket) => {
socket.on('userJoinQueue', () => {
...
this.lobbies.push(new Lobby(this.name ,lobbyId, participants, this.io));
});
socket.on('userLeaveQueue', () => {
...
});
socket.on('userLeaveLobby', () => {
...
});
});
}
}
module.exports = Gameroom;
当队列中有足够的玩家时,游戏室会实例化大厅。
class Lobby extends Room {
constructor(gameroom, name, users, io) {
super(gameroom + '/' + name, io);
this.users = users;
this.readyUsers = [];
this.listenOnLobby();
}
listenOnLobby() {
this.namespace.on('connection', (socket) => {
socket.on('userReady', () => {
...
});
socket.on('userUnready', () => {
...
});
});
}
}
module.exports = Lobby;