From 2cb401bbd3f745bc3fb2573a19f645d2f859a950 Mon Sep 17 00:00:00 2001 From: Jeena Paradies Date: Fri, 13 Jul 2012 21:10:08 +0200 Subject: [PATCH] ground work for different users on server and players on client --- lib/Chuck/ClientGame.js | 7 +++- lib/Chuck/Physics/Doll.js | 11 ++--- lib/Chuck/Player.js | 9 ++-- lib/Chuck/Processors/ClientProcessor.js | 38 ++++++++++------- lib/Chuck/Processors/ServerProcessor.js | 56 +++++++++++++++++++++---- lib/Chuck/ServerGame.js | 18 +++++--- lib/Client/Networker.js | 20 ++++----- lib/Server/Channel.js | 14 +++++-- lib/Server/User.js | 3 +- 9 files changed, 122 insertions(+), 54 deletions(-) diff --git a/lib/Chuck/ClientGame.js b/lib/Chuck/ClientGame.js index ec6a3a9..d1bf21b 100644 --- a/lib/Chuck/ClientGame.js +++ b/lib/Chuck/ClientGame.js @@ -1,14 +1,19 @@ define(["Chuck/Processors/ClientProcessor"], function(ClientProcessor) { - function ClientGame(networker){ + function ClientGame(networker, id) { this.networker = networker; this.processor = new ClientProcessor(); + this.processor.spawnMeWithId(id); } ClientGame.prototype.loadLevel = function(path) { this.processor.loadLevel(path); } + ClientGame.prototype.userJoined = function(userId) { + this.processor.spawnNewPlayerWithId(userId); + }; + ClientGame.prototype.processGameCommand = function(command, options){ console.log('(not implemented) processGameCommand:', command, options); } diff --git a/lib/Chuck/Physics/Doll.js b/lib/Chuck/Physics/Doll.js index e04c9c7..caea7d2 100644 --- a/lib/Chuck/Physics/Doll.js +++ b/lib/Chuck/Physics/Doll.js @@ -1,6 +1,7 @@ define(["Vendor/Box2D", "Chuck/Settings"], function(Box2D, Settings){ - function Doll (physicsEngine){ + function Doll (physicsEngine, id){ + this.id = id; this._physicsEngine = physicsEngine; this._body; this._legs; @@ -30,14 +31,14 @@ define(["Vendor/Box2D", "Chuck/Settings"], function(Box2D, Settings){ headShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, -37 / Settings.RATIO)); fixtureDef.shape = headShape; fixtureDef.isSensor = false; - fixtureDef.userData = 'myHead'; + fixtureDef.userData = 'myHead' + this.id; this._body.CreateFixture(fixtureDef); var bodyShape = new Box2D.Collision.Shapes.b2PolygonShape(); bodyShape.SetAsOrientedBox(5 / Settings.RATIO, 16 / Settings.RATIO, new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, -21 / Settings.RATIO)); fixtureDef.shape = bodyShape; fixtureDef.isSensor = false; - fixtureDef.userData = 'myBody'; + fixtureDef.userData = 'myBody' + this.id; this._body.CreateFixture(fixtureDef); var legsShape = new Box2D.Collision.Shapes.b2CircleShape(); @@ -46,7 +47,7 @@ define(["Vendor/Box2D", "Chuck/Settings"], function(Box2D, Settings){ fixtureDef.shape = legsShape; fixtureDef.friction = Settings.PLAYER_FRICTION; fixtureDef.isSensor = false; - fixtureDef.userData = 'myLegs'; + fixtureDef.userData = 'myLegs' + this.id; this._legs = this._body.CreateFixture(fixtureDef); var feetShape = new Box2D.Collision.Shapes.b2CircleShape(); @@ -54,7 +55,7 @@ define(["Vendor/Box2D", "Chuck/Settings"], function(Box2D, Settings){ feetShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, 0 / Settings.RATIO)); fixtureDef.shape = feetShape; fixtureDef.isSensor = true; - fixtureDef.userData = 'myFeet'; + fixtureDef.userData = 'myFeet' + this.id; this._body.CreateFixture(fixtureDef); this._body.SetActive(false); diff --git a/lib/Chuck/Player.js b/lib/Chuck/Player.js index 43abf55..525a5c3 100644 --- a/lib/Chuck/Player.js +++ b/lib/Chuck/Player.js @@ -1,7 +1,8 @@ define(["Chuck/Physics/Doll", "Chuck/Settings"], function(Doll, Settings){ - function Player (physicsEngine, repository) { + function Player (physicsEngine, id, repository) { this._physicsEngine = physicsEngine; + this.id = id; this._repository = repository; this._standing = false; this._doll; @@ -10,11 +11,11 @@ define(["Chuck/Physics/Doll", "Chuck/Settings"], function(Doll, Settings){ this._lookDirection = 1; this._moveDirection = 0; - this.init(); + this.init(id); } - Player.prototype.init = function() { - this._doll = new Doll(this._physicsEngine); + Player.prototype.init = function(id) { + this._doll = new Doll(this._physicsEngine, id); //this._mc = EmbedHandler.load(EmbedHandler.CHUCK); //this._mc.stop(); //var mclp = new MovieClipLabelParser(); diff --git a/lib/Chuck/Processors/ClientProcessor.js b/lib/Chuck/Processors/ClientProcessor.js index 047f4de..b6c626b 100755 --- a/lib/Chuck/Processors/ClientProcessor.js +++ b/lib/Chuck/Processors/ClientProcessor.js @@ -12,22 +12,18 @@ var requires = [ define(requires, function(ViewController, PhysicsEngine, Player, InputControlUnit, Settings, Box2D, Level, requestAnimFrame) { - function ClientGame () { + function ClientProcessor () { this.init(); }; - ClientGame.prototype.init = function() { + ClientProcessor.prototype.init = function() { this.viewController = new ViewController(); this.physicsEngine = new PhysicsEngine(); - this.me = new Player(this.physicsEngine, null); - this.me.spawn(100, 0); - this.inputControlUnit = new InputControlUnit(this.me); - this.physicsEngine.setCollisionDetector(this.me); this.update(); } - ClientGame.prototype.loadLevel = function(path) { + ClientProcessor.prototype.loadLevel = function(path) { if (this.level) { this.level.unload(); } @@ -36,27 +32,41 @@ define(requires, this.level.loadLevelInToEngine(); } - ClientGame.prototype.getPhysicsEngine = function() { + ClientProcessor.prototype.getPhysicsEngine = function() { return this.physicsEngine; } - ClientGame.prototype.getMe = function() { + ClientProcessor.prototype.getMe = function() { return this.me; } - ClientGame.prototype.update = function() { + ClientProcessor.prototype.update = function() { requestAnimFrame(this.update.bind(this)); this.physicsEngine.update(); this.viewController.update(); - this.inputControlUnit.update(); - this.me.update(); + if(this.me) { + this.inputControlUnit.update(); + this.me.update(); + } } - ClientGame.prototype.destruct = function() { + ClientProcessor.prototype.destruct = function() { } - return ClientGame; + ClientProcessor.prototype.spawnNewPlayerWithId = function(id) { + var player = new Player(this.physicsEngine, id, null); + player.spawn(100, 0); + this.physicsEngine.setCollisionDetector(player); + return player; + } + + ClientProcessor.prototype.spawnMeWithId = function(id) { + this.me = this.spawnNewPlayerWithId(id); + this.inputControlUnit = new InputControlUnit(this.me); + } + + return ClientProcessor; }); diff --git a/lib/Chuck/Processors/ServerProcessor.js b/lib/Chuck/Processors/ServerProcessor.js index a8fecce..412ac4e 100755 --- a/lib/Chuck/Processors/ServerProcessor.js +++ b/lib/Chuck/Processors/ServerProcessor.js @@ -8,39 +8,77 @@ var requires = [ define(requires, function(PhysicsEngine, Player, Box2D, Level, requestAnimFrame){ - function ServerGame () { + function ServerProcessor (ServerProcessor) { + this.ServerProcessor = ServerProcessor; + this.players = {}; this.init(); }; - ServerGame.prototype.init = function() { + ServerProcessor.prototype.init = function() { this.physicsEngine = new PhysicsEngine(); this.update(); } - ServerGame.prototype.loadLevel = function(path) { + ServerProcessor.prototype.loadLevel = function(path) { if (this.level) { this.level.unload(); } this.level = new Level(path, this.physicsEngine); this.level.loadLevelInToEngine(); - - console.log(this.level); } - ServerGame.prototype.getPhysicsEngine = function() { + ServerProcessor.prototype.getPhysicsEngine = function() { return this.physicsEngine; } - ServerGame.prototype.update = function() { + ServerProcessor.prototype.update = function() { + requestAnimFrame(this.update.bind(this)); + this.physicsEngine.update(); + for(var id in this.players) { + this.players[id].update(); + } } - ServerGame.prototype.destruct = function() { + ServerProcessor.prototype.destruct = function() { } - return ServerGame; + ServerProcessor.prototype.createPlayerWithId = function(id) { + var player = new Player(this.physicsEngine, id, null); + this.players[id] = player; + + player.spawn(100, 0); + this.physicsEngine.setCollisionDetector(player); + } + + ServerProcessor.prototype.updateWorld = function() { + + var update = {}; + var isUpdateNeeded = false; + + var body = world.GetBodyList(); + do { + var userData = body.GetUserData(); + + if(userData && userData.bodyId && body.IsAwake()){ + update[userData.bodyId] = { + p: body.GetPosition(), + a: body.GetAngle(), + lv: body.GetLinearVelocity(), + av: body.GetAngularVelocity() + }; + isUpdateNeeded = true; + } + } while (body = body.GetNext()); + + if(isUpdateNeeded) { + this.ServerProcessor.updateClientsWorld(update); + } + } + + return ServerProcessor; }); diff --git a/lib/Chuck/ServerGame.js b/lib/Chuck/ServerGame.js index bccdf90..2965864 100644 --- a/lib/Chuck/ServerGame.js +++ b/lib/Chuck/ServerGame.js @@ -1,12 +1,12 @@ define(["Chuck/Processors/ServerProcessor"], function(ServerProcessor) { - function ServerGame(chanel) { - this.chanel = chanel; - this.processor = new ServerProcessor(); + function ServerGame(channel) { + this.channel = channel; + this.serverProcessor = new ServerProcessor(this); } ServerGame.prototype.loadLevel = function(path) { - this.processor.loadLevel(path); + this.serverProcessor.loadLevel(path); } ServerGame.prototype.processGameCommand = function(command, options) { @@ -14,7 +14,15 @@ define(["Chuck/Processors/ServerProcessor"], function(ServerProcessor) { } ServerGame.prototype.destruct = function() { - this.processor.destruct(); + this.serverProcessor.destruct(); + } + + ServerGame.prototype.createPlayerForUser = function(user) { + this.serverProcessor.createPlayerWithId(user.id); + } + + ServerGame.prototype.updateClientsWorld = function(update_world) { + this.channel.sendCommandToAllUsers('gameCommand', update_world); } return ServerGame; diff --git a/lib/Client/Networker.js b/lib/Client/Networker.js index a6be2d4..8657eec 100644 --- a/lib/Client/Networker.js +++ b/lib/Client/Networker.js @@ -7,19 +7,19 @@ define(["Protocol/Helper", "Chuck/ClientGame"], function(ProtocolHelper, ClientG this.init(); } - Networker.prototype.init = function(){ + Networker.prototype.init = function() { var self = this; - this.socketLink.on('connect', function(){ + this.socketLink.on('connect', function() { self.onConnect(); }); - this.socketLink.on('message', function(message){ + this.socketLink.on('message', function(message) { self.onMessage(message); }); - this.socketLink.on('disconnect', function(){ + this.socketLink.on('disconnect', function() { self.onDisconnect(); }); } @@ -30,7 +30,7 @@ define(["Protocol/Helper", "Chuck/ClientGame"], function(ProtocolHelper, ClientG Networker.prototype.onMessage = function(message) { var self = this; - ProtocolHelper.runCommands(message, function(command, options){ + ProtocolHelper.runCommands(message, function(command, options) { self.processControlCommand(command, options); }); } @@ -49,18 +49,18 @@ define(["Protocol/Helper", "Chuck/ClientGame"], function(ProtocolHelper, ClientG this.socketLink.send(message); } - Networker.prototype.onJoinSuccess = function(channelName) { - this.clientGame = new ClientGame(this); + Networker.prototype.onJoinSuccess = function(options) { + this.clientGame = new ClientGame(this, options.id); this.clientGame.loadLevel("default.json") - console.log("Joined " + channelName); + console.log("Joined " + options.channelName); } Networker.prototype.onUserJoined = function(userId) { - //this.clientGame.userJoined(userId); + this.clientGame.userJoined(userId); console.log("User " + userId + " joined"); }; - Networker.prototype.processControlCommand = function(command, options){ + Networker.prototype.processControlCommand = function(command, options) { switch(command) { case 'joinSuccess': this.onJoinSuccess(options); diff --git a/lib/Server/Channel.js b/lib/Server/Channel.js index 10db7d1..2fed92f 100644 --- a/lib/Server/Channel.js +++ b/lib/Server/Channel.js @@ -13,8 +13,10 @@ define(["Chuck/ServerGame"], function(ServerGame) { Channel.prototype.addUser = function(user){ this.users[user.id] = user; - user.sendCommand('joinSuccess', this.name); - this.sendCommandToAllUsersBut('userJoined', user.id, user); + user.sendCommand('joinSuccess', {chanelName: this.name, id: user.id}); + this.sendCommandToAllUsersExcept('userJoined', user.id, user); + + this.serverGame.createPlayerForUser(user) } Channel.prototype.releaseUser = function(user){ @@ -27,14 +29,18 @@ define(["Chuck/ServerGame"], function(ServerGame) { } } - Channel.prototype.sendCommandToAllUsersBut = function(command, options, user) { + Channel.prototype.sendCommandToAllUsersExcept = function(command, options, except_user) { for(var id in this.users) { - if (id != user.id) { + if (id != except_user.id) { this.users[id].sendCommand(command, options); } } } + Channel.prototype.processGameCommandFromUser = function(command, user) { + console.log("not implemented processGameCommandFromUser: " + command + user); + } + return Channel; }); \ No newline at end of file diff --git a/lib/Server/User.js b/lib/Server/User.js index bb15c0a..452d8a7 100644 --- a/lib/Server/User.js +++ b/lib/Server/User.js @@ -25,7 +25,6 @@ define(["Protocol/Helper"], function(ProtocolHelper) { User.prototype.setChannel = function(channel){ this.channel = channel; - this.sendCommand('joinSuccess', channel.name); } User.prototype.sendCommand = function(command, options) { @@ -56,7 +55,7 @@ define(["Protocol/Helper"], function(ProtocolHelper) { break; case 'gameCommand': - //this.channel.game.processGameCommand(options); + this.channel.processGameCommandFromUser(options, this); break; default: