define([ "Game/Core/GameController", "Game/Core/Physics/Engine", "Game/Config/Settings", "Game/Core/Control/InputController", "Lib/Utilities/RequestAnimFrame", "Game/Server/NotificationCenter" ], function(Parent, PhysicsEngine, Settings, InputController, requestAnimFrame, NotificationCenter) { function GameController () { Parent.call(this, new PhysicsEngine()); this.inputControllers = {}; this.update(); this.updateWorld(); NotificationCenter.on('user/joined', this.userJoined, this); NotificationCenter.on('user/left', this.userLeft, this); } GameController.prototype = Object.create(Parent.prototype); GameController.prototype.update = function() { requestAnimFrame(this.update.bind(this)); this.physicsEngine.update(); for(var id in this.players) { this.players[id].update(); } } GameController.prototype.userJoined = function(user) { Parent.prototype.userJoined.call(this, user); var id = user.id; var player = this.players[id]; this.inputControllers[id] = new InputController(player); } GameController.prototype.userLeft = function(user) { Parent.prototype.userLeft.call(this, user); delete this.inputControllers[user.id]; } GameController.prototype.progressGameCommandFromUser = function(command, options, user) { var inputController = this.inputControllers[user.id]; if (typeof inputController[command] == 'function') { inputController[command](options); } } GameController.prototype.updateWorld = function() { var update = {}; var isUpdateNeeded = false; var body = this.physicsEngine.world.GetBodyList(); do { var userData = body.GetUserData(); if(userData && body.IsAwake()){ update[userData] = { p: body.GetPosition(), a: body.GetAngle(), lv: body.GetLinearVelocity(), av: body.GetAngularVelocity() }; isUpdateNeeded = true; } } while (body = body.GetNext()); if(isUpdateNeeded) { //NotificationCenter.trigger("sendCommandToAllUsers", ['gameCommand', {worldUpdate:update}]); } setTimeout(this.updateWorld.bind(this), Settings.WORLD_UPDATE_BROADCAST_INTERVAL); } return GameController; });