Repaired Collision detecteion by adding one detector for each user - fixes #15

This commit is contained in:
Logsol 2013-01-06 01:40:46 +01:00
parent a1e94e1ed0
commit f07505bc20
9 changed files with 31 additions and 29 deletions

View file

@ -5,20 +5,11 @@ define([
function (Box2D, Parent) { function (Box2D, Parent) {
function Detector (me) { function Detector (player) {
Parent.call(this); Parent.call(this, player);
this.me = me;
} }
Detector.prototype = Object.create(Parent.prototype); Detector.prototype = Object.create(Parent.prototype);
Detector.prototype.handleStand = function (point, isColliding) {
if (point.GetFixtureA().GetUserData() == Detector.IDENTIFIER.PLAYER_FOOT_SENSOR
|| point.GetFixtureB().GetUserData() == Detector.IDENTIFIER.PLAYER_FOOT_SENSOR) {
this.me.onFootSensorDetection(isColliding);
}
}
return Detector; return Detector;
}); });

View file

@ -65,6 +65,8 @@ function (Parent, PhysicsEngine, ViewController, KeyboardController, Notificatio
//this.onSpawnPlayer(options); //this.onSpawnPlayer(options);
this.me = this.players[playerId]; this.me = this.players[playerId];
this.keyboardController = new KeyboardController(this.me, this); this.keyboardController = new KeyboardController(this.me, this);
this.physicsEngine.setCollisionDetector(this.me);
} }
GameController.prototype.onSpawnPlayer = function(options) { GameController.prototype.onSpawnPlayer = function(options) {

View file

@ -28,6 +28,7 @@ function (ProtocolHelper, GameController, User, NotificationCenter) {
NotificationCenter.on("sendGameCommand", this.sendGameCommand, this); NotificationCenter.on("sendGameCommand", this.sendGameCommand, this);
} }
// Socket callbacks // Socket callbacks
Networker.prototype.onConnect = function () { Networker.prototype.onConnect = function () {
@ -64,6 +65,7 @@ function (ProtocolHelper, GameController, User, NotificationCenter) {
} }
} }
// Sending commands // Sending commands
Networker.prototype.sendCommand = function (command, options) { Networker.prototype.sendCommand = function (command, options) {
@ -76,6 +78,7 @@ function (ProtocolHelper, GameController, User, NotificationCenter) {
this.sendCommand('gameCommand', message); this.sendCommand('gameCommand', message);
} }
// Commands from server // Commands from server
Networker.prototype.onUserJoined = function (userId) { Networker.prototype.onUserJoined = function (userId) {

View file

@ -5,12 +5,14 @@ define([
function (Box2D, Parent) { function (Box2D, Parent) {
function Detector () { function Detector (player) { // FIXME evtl.bind(this) ?
this.listener = new Box2D.Dynamics.b2ContactListener(); this.listener = new Box2D.Dynamics.b2ContactListener();
this.listener.chuckDetector = this; this.listener.chuckDetector = this;
this.listener.BeginContact = this.BeginContact; this.listener.BeginContact = this.BeginContact;
this.listener.PostSolve = this.PostSolve; this.listener.PostSolve = this.PostSolve;
this.listener.EndContact = this.EndContact; this.listener.EndContact = this.EndContact;
this.player = player;
} }
Detector.IDENTIFIER = { Detector.IDENTIFIER = {
@ -27,7 +29,12 @@ function (Box2D, Parent) {
} }
Detector.prototype.handleStand = function (point, isColliding) { Detector.prototype.handleStand = function (point, isColliding) {
throw "Overwrite this function";
if (point.GetFixtureA().GetUserData() == Detector.IDENTIFIER.PLAYER_FOOT_SENSOR + '-' + this.player.id
|| point.GetFixtureB().GetUserData() == Detector.IDENTIFIER.PLAYER_FOOT_SENSOR + '-' + this.player.id) {
this.player.onFootSensorDetection(isColliding);
}
} }
/** Extension **/ /** Extension **/

View file

@ -63,7 +63,7 @@ function (Box2D, Settings, CollisionDetector) {
feetShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, 0 / Settings.RATIO)); feetShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, 0 / Settings.RATIO));
fixtureDef.shape = feetShape; fixtureDef.shape = feetShape;
fixtureDef.isSensor = true; fixtureDef.isSensor = true;
fixtureDef.userData = CollisionDetector.IDENTIFIER.FOOTSENSOR; fixtureDef.userData = CollisionDetector.IDENTIFIER.PLAYER_FOOT_SENSOR + '-' + this.id;
this.body.CreateFixture(fixtureDef); this.body.CreateFixture(fixtureDef);
this.body.SetActive(false); this.body.SetActive(false);

View file

@ -17,9 +17,9 @@ function (Settings, Box2D, CollisionDetector) {
return this.world; return this.world;
} }
Engine.prototype.setCollisionDetector = function (me) { Engine.prototype.setCollisionDetector = function (player) {
var detector = new CollisionDetector(me); // FIXME: check if core collision detector works var detector = new CollisionDetector(player);
this.world.SetContactListener(detector.getListener()); this.world.SetContactListener(detector.getListener());
} }

View file

@ -158,12 +158,12 @@ function (Doll, Settings) {
} }
this.setStanding(true); this.setStanding(true);
} else { } else {
// TODO This needs some more thought to it. // TODO This needs some more thought to it.
// maybe take a look at collision groups for collision detection, // maybe take a look at collision groups for collision detection,
// to group all tiles together // to group all tiles together
//this.setStanding(false); //this.setStanding(false);
//this.animate('jumploop'); //this.animate('jumploop');
} }
} }
@ -174,7 +174,7 @@ function (Doll, Settings) {
this.stop(); this.stop();
} }
if (!this.doll.getBody().IsAwake()) { if (!this.doll.getBody().IsAwake() && !this.isStanding()) {
this.setStanding(true); this.setStanding(true);
} }
} }

View file

@ -5,15 +5,11 @@ define([
function (Box2D, Parent) { function (Box2D, Parent) {
function Detector () { function Detector (player) {
Parent.call(this); Parent.call(this, player);
} }
Detector.prototype = Object.create(Parent.prototype); Detector.prototype = Object.create(Parent.prototype);
Detector.prototype.handleStand = function (point, isColliding) {
throw "Implement this function";
}
return Detector; return Detector;
}); });

View file

@ -61,6 +61,9 @@ function (Parent, PhysicsEngine, Settings, InputController, requestAnimFrame, No
GameController.prototype.createPlayer = function(user) { GameController.prototype.createPlayer = function(user) {
var player = new Player(user.id, this.physicsEngine); var player = new Player(user.id, this.physicsEngine);
player.setInputController(new InputController(player)) player.setInputController(new InputController(player))
this.physicsEngine.setCollisionDetector(player);
return player; return player;
}; };