From 806c905c41467f55d5bf68a9da97379cb4c3c3e1 Mon Sep 17 00:00:00 2001 From: FrozenCow Date: Fri, 2 Aug 2013 16:55:05 +0200 Subject: [PATCH] Initial work for multiple rooms --- index.js | 67 +++++++++++++++++++++++++++---------------- web/main.js | 2 +- web/network-server.js | 6 ++++ 3 files changed, 49 insertions(+), 26 deletions(-) diff --git a/index.js b/index.js index f8e3fe8..cf3e250 100644 --- a/index.js +++ b/index.js @@ -9,18 +9,45 @@ requirejs(['./web/utils','./web/simulator','./web/wsball-game','./web/jsonwebsoc var app = express(); -var clients = []; -var newid = 1; app.use(express.static('web')); -var simulator = new Simulator(game); -var networkServer = new NetworkServer(simulator); -var updateGame = simulator.updateGame.bind(simulator); -var insertEvent = simulator.insertEvent.bind(simulator); +var rooms = {}; + +function createRoom(name) { + var simulator = new Simulator(game); + var networkServer = new NetworkServer(simulator); + networkServer.messageHandlers['up'] = handleKeyMsg; + networkServer.messageHandlers['down'] = handleKeyMsg; + networkServer.messageHandlers['setname'] = handleSetname; + var room = { + simulator: simulator, + networkServer: networkServer + }; + rooms[name] = room; + return room; +} + +function getRoom(name) { + return rooms[name]; +} + +function createClientInRoom(ws,room) { + var networkServer = room.networkServer; + var messenger = new JsonWebsocketMessenger(ws); + var client = networkServer.createClient(messenger); + + networkServer.clients.forEach(function(other) { + if (other === client) { return; } + if (!other.name) { return; } + client.messenger.send({ + type: 'setname', + clientid: other.id, + name: other.name + }); + }); -networkServer.messageHandlers['up'] = handleKeyMsg; -networkServer.messageHandlers['down'] = handleKeyMsg; -networkServer.messageHandlers['setname'] = handleSetname; + return client; +} function handleKeyMsg(msg) { var simulator = this.server.simulator; @@ -58,25 +85,15 @@ function handleSetname(msg) { } } -app.ws.usepath('/client',function(req,next) { +app.ws.usepath('/rooms/hallo',function(req,next) { + var roomName = 'hallo'; + var room = getRoom(roomName) || createRoom(roomName); + if (!utils.contains(req.requestedProtocols,'game')) { console.log('Rejected'); return req.reject(); } console.log('connected'); var ws = req.accept('game',req.origin); - var messenger = new JsonWebsocketMessenger(ws); - var client = networkServer.createClient(messenger); - clients.forEach(function(other) { - if (other === client) { return; } - if (!other.name) { return; } - client.messenger.send({ - type: 'setname', - clientid: other.id, - name: other.name - }); - }); - ws.on('error',function() { - console.error('websocket error',arguments); - }); + createClientInRoom(ws,room); }); @@ -114,7 +131,7 @@ function update() { });*/ } -setInterval(update,1000*(1/30)); +// setInterval(update,1000*(1/30)); process.on('uncaughtException', function (err) { diff --git a/web/main.js b/web/main.js index 42155e4..71c148e 100644 --- a/web/main.js +++ b/web/main.js @@ -100,7 +100,7 @@ define(['platform','game','vector','staticcollidable','linesegment','editor','re new_uri = 'ws:'; } new_uri += '//' + loc.host; - new_uri += '/client'; + new_uri += '/rooms/hallo'; var ws = new WebSocket(new_uri, 'game'); ws.onopen = function() { diff --git a/web/network-server.js b/web/network-server.js index d238767..4bedbc9 100644 --- a/web/network-server.js +++ b/web/network-server.js @@ -17,6 +17,12 @@ define(['./utils'],function(utils) { 'ack': handleAck, 'resetrequest': handleResetrequest }; + this.defaultgamerate = 1000*(1/30); + this.gameupdateTimeout = setTimeout(update.bind(this), this.defaultgamerate); + } + function update() { + this.simulator.updateGame(); + this.gameupdateTimeout = setTimeout(update.bind(this), this.defaultgamerate); } (function(p) { p.createClient = function(messenger) {