onFixtureWithinReach implemented

This commit is contained in:
jeena 2013-12-27 05:09:28 +01:00
parent 1dcc21d0b5
commit fa110ff4a8
3 changed files with 41 additions and 12 deletions

View file

@ -26,9 +26,9 @@ function (Box2D) {
var userDataB = point.GetFixtureB().GetUserData(); var userDataB = point.GetFixtureB().GetUserData();
if (userDataA && userDataA.onCollisionChange) { if (userDataA && userDataA.onCollisionChange) {
userDataA.onCollisionChange(isColliding); userDataA.onCollisionChange(isColliding, point.GetFixtureB());
} else if (userDataB && userDataB.onCollisionChange) { } else if (userDataB && userDataB.onCollisionChange) {
userDataB.onCollisionChange(isColliding); userDataB.onCollisionChange(isColliding, point.GetFixtureA());
} }
} }

View file

@ -2,10 +2,11 @@ define([
"Game/" + GLOBALS.context + "/GameObjects/GameObject", "Game/" + GLOBALS.context + "/GameObjects/GameObject",
"Lib/Vendor/Box2D", "Lib/Vendor/Box2D",
"Game/Config/Settings", "Game/Config/Settings",
"Game/" + GLOBALS.context + "/Collision/Detector" "Game/" + GLOBALS.context + "/Collision/Detector",
"Game/" + GLOBALS.context + "/GameObjects/Item"
], ],
function (Parent, Box2D, Settings, CollisionDetector) { function (Parent, Box2D, Settings, CollisionDetector, Item) {
function Doll (physicsEngine, uid) { function Doll (physicsEngine, uid) {
@ -16,7 +17,11 @@ function (Parent, Box2D, Settings, CollisionDetector) {
this.lookDirection = 0; this.lookDirection = 0;
this.legs; this.legs;
this.actionState = null; this.actionState = null;
this.lookAtXY = {x:0, y:0}; this.lookAtXY = { x:0, y:0 };
this.reachableItems = {
left: [],
right: []
};
this.createFixtures(); this.createFixtures();
this.body.SetActive(false); this.body.SetActive(false);
@ -35,6 +40,7 @@ function (Parent, Box2D, Settings, CollisionDetector) {
}; };
Doll.prototype.createFixtures = function () { Doll.prototype.createFixtures = function () {
var self = this;
var fixtureDef = new Box2D.Dynamics.b2FixtureDef(); var fixtureDef = new Box2D.Dynamics.b2FixtureDef();
fixtureDef.density = Settings.PLAYER_DENSITY; fixtureDef.density = Settings.PLAYER_DENSITY;
@ -63,6 +69,8 @@ function (Parent, Box2D, Settings, CollisionDetector) {
this.legs = this.body.CreateFixture(fixtureDef); this.legs = this.body.CreateFixture(fixtureDef);
fixtureDef.density = 0;
var feetShape = new Box2D.Collision.Shapes.b2CircleShape(); var feetShape = new Box2D.Collision.Shapes.b2CircleShape();
feetShape.SetRadius(4 / Settings.RATIO); feetShape.SetRadius(4 / Settings.RATIO);
feetShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, 2 / Settings.RATIO)); feetShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0 / Settings.RATIO, 2 / Settings.RATIO));
@ -79,12 +87,24 @@ function (Parent, Box2D, Settings, CollisionDetector) {
grabSensorLeftShape.SetAsOrientedBox(10 / Settings.RATIO, 20 / Settings.RATIO, new Box2D.Common.Math.b2Vec2(-10 / Settings.RATIO, -10 / Settings.RATIO)); grabSensorLeftShape.SetAsOrientedBox(10 / Settings.RATIO, 20 / Settings.RATIO, new Box2D.Common.Math.b2Vec2(-10 / Settings.RATIO, -10 / Settings.RATIO));
fixtureDef.shape = grabSensorLeftShape; fixtureDef.shape = grabSensorLeftShape;
fixtureDef.isSensor = true; fixtureDef.isSensor = true;
fixtureDef.userData = {
onCollisionChange: function(isColliding, fixture) {
self.onFixtureWithinReach(isColliding, "left", fixture);
}
}
this.body.CreateFixture(fixtureDef); this.body.CreateFixture(fixtureDef);
var grabSensorRightShape = new Box2D.Collision.Shapes.b2PolygonShape(); var grabSensorRightShape = new Box2D.Collision.Shapes.b2PolygonShape();
grabSensorRightShape.SetAsOrientedBox(10 / Settings.RATIO, 20 / Settings.RATIO, new Box2D.Common.Math.b2Vec2(10 / Settings.RATIO, -10 / Settings.RATIO)); grabSensorRightShape.SetAsOrientedBox(10 / Settings.RATIO, 20 / Settings.RATIO, new Box2D.Common.Math.b2Vec2(10 / Settings.RATIO, -10 / Settings.RATIO));
fixtureDef.shape = grabSensorRightShape; fixtureDef.shape = grabSensorRightShape;
fixtureDef.isSensor = true; fixtureDef.isSensor = true;
fixtureDef.userData = {
onCollisionChange: function(isColliding, fixture) {
self.onFixtureWithinReach(isColliding, "right", fixture);
}
}
this.body.CreateFixture(fixtureDef); this.body.CreateFixture(fixtureDef);
} }
@ -192,20 +212,30 @@ function (Parent, Box2D, Settings, CollisionDetector) {
this.lookAtXY.y = y; this.lookAtXY.y = y;
}; };
Doll.prototype.onFootSensorDetection = function(isColliding) { Doll.prototype.onFootSensorDetection = function(isColliding, fixture) {
//if(isColliding && !(this.body.GetLinearVelocity().y < -Settings.JUMP_SPEED && !this.isStanding())) {
// this.setStanding(true);
//}
var hasJumpStartVelocity = this.body.GetLinearVelocity().y < -Settings.JUMP_SPEED; var hasJumpStartVelocity = this.body.GetLinearVelocity().y < -Settings.JUMP_SPEED;
if(isColliding && !hasJumpStartVelocity) { if(isColliding && !hasJumpStartVelocity) {
this.setStanding(true); this.setStanding(true);
} }
}
Doll.prototype.onFixtureWithinReach = function(isColliding, side, fixture) {
var item = fixture.GetBody().GetUserData();
if (!(item instanceof Item)) return;
}; if(isColliding) {
this.reachableItems[side].push(item);
} else {
var i = this.reachableItems[side].indexOf(item);
if (i >= 0) {
this.reachableItems[side].splice(i, 1);
}
}
}
Doll.prototype.update = function() { Doll.prototype.update = function() {

View file

@ -15,7 +15,6 @@
#loading { #loading {
border: 1px solid white; border: 1px solid white;
width: 500px;
display: table-cell; display: table-cell;
vertical-align: middle; vertical-align: middle;
height: 100%; height: 100%;