},
position: { alias: 'body.position' },
+ angle: { alias: 'body.angle' },
linearVelocity: { alias: 'body.linearVelocity' },
ApplyForce: { proxy: 'body.ApplyForce' },
this.drightLeft = this.drightRight = 0;
this.up = 0;
this.free = 0;
- this.leftPivot = 0;
- this.rightPivot = 0;
this.commands = {
dleftLeft: yuu.propcmd(this, 'dleftLeft'),
dleftRight: yuu.propcmd(this, 'dleftRight'),
},
_updatePivots: function () {
- var PIVOT_SPEED = 0.05;
- var leftSpeed = (this.dleftRight - this.dleftLeft) * PIVOT_SPEED;
- var rightSpeed = (this.drightLeft - this.drightRight) * PIVOT_SPEED;
- this.leftPivot = yf.clamp(this.leftPivot + leftSpeed, 0, 1);
- this.rightPivot = yf.clamp(this.rightPivot + rightSpeed, 0, 1);
+ var PIVOT_SPEED = 2;
+ this.leftJoint.motorSpeed =
+ (this.dleftRight - this.dleftLeft) * PIVOT_SPEED;
+ this.rightJoint.motorSpeed =
+ (this.drightRight - this.drightLeft) * PIVOT_SPEED;
},
_updateTransforms: function () {
- var gain = 1.0;
- var leftTarget = this.leftPivot * Math.PI / 2;
- var rightTarget = -this.rightPivot * Math.PI / 2;
- var leftError = this.leftJoint.jointAngle - leftTarget;
- var rightError = this.rightJoint.jointAngle - rightTarget;
- this.leftJoint.motorSpeed = -gain * leftError;
- this.rightJoint.motorSpeed = -gain * rightError;
},
tick: function () {
this._updatePivots();
- var THRUST = 3.5;
- var DRAG_FREE = 0.01;
+ var THRUST = 5;
+/* var DRAG_FREE = 0.01;
var DRAG_OPEN = 0.5;
var DRAG_LOCK = 1;
- var CORRECTION = 1;
+ var CORRECTION = 1;*/
- var leftAngle = (1 - this.leftPivot) * Math.PI / 2;
- var rightAngle = (1 - this.rightPivot) * Math.PI / 2;
+ var leftAngle = this.leftJoint.GetJointAngle();
+ var rightAngle = this.rightJoint.GetJointAngle();
+ var thrust = +!this.free * +this.up * THRUST;
+ var leftThrust = new b2Vec2(
+ Math.sin(leftAngle) * thrust, Math.cos(leftAngle) * thrust);
+ var rightThrust = new b2Vec2(
+ Math.sin(rightAngle) * thrust, Math.cos(rightAngle) * thrust);
+ this.body.body.ApplyForceToCenter(leftThrust);
+ this.body.body.ApplyForceToCenter(rightThrust);
var cleft = Math.cos(leftAngle);
var cright = Math.cos(rightAngle);
var sleft = Math.sin(leftAngle);
var sright = Math.sin(rightAngle);
- var thrust = +!this.free * +this.up * THRUST;
var ax = thrust * (cleft - cright);
var ay = thrust * (sright + sleft);
+ /*
var v = this.body.linearVelocity;
var drag = this.up ? DRAG_OPEN : this.free ? DRAG_FREE : DRAG_LOCK;
ax += drag * Math.max(cleft, cright) * v.x * v.x * -Math.sign(v.x);
if (!this.up || this.free)
ax += CORRECTION * (cleft - cright) * v.y * v.y * Math.sign(v.y);
+ */
this.body.ApplyForce(new b2Vec2(ax, ay), this.body.position);
TAPS: ['tick'],
});
-function bodyFromAABB (world, position, aabb, density) {
- var bd = new Box2D.b2BodyDef();
+function bodyFromAABB (world, position, aabb, density, center) {
+ var dfn = new Box2D.b2BodyDef();
var shape = new Box2D.b2PolygonShape();
- shape.SetAsBox(aabb.hw, aabb.hh);
- if (density)
- bd.type = Box2D.DYNAMIC_BODY;
- bd.position = new b2Vec2(position[0], position[1]);
- var body = world.CreateBody(bd);
- body.CreateFixture(shape, density || 0);
+ if (center)
+ shape.SetAsBox(aabb.hw, aabb.hh, new b2Vec2(center), 0);
+ else
+ shape.SetAsBox(aabb.hw, aabb.hh);
+ if (density !== undefined)
+ dfn.type = Box2D.DYNAMIC_BODY;
+ dfn.position = new b2Vec2(position[0], position[1]);
+ var body = world.CreateBody(dfn);
+ body.CreateFixture(shape, density || 0.0001);
return body;
}
function bodyFromLine (world, p0, p1) {
- var bd = new Box2D.b2BodyDef();
+ var dfn = new Box2D.b2BodyDef();
var shape = new Box2D.b2EdgeShape();
shape.Set(new b2Vec2(p0), new b2Vec2(p1));
- var body = world.CreateBody(bd);
+ var body = world.CreateBody(dfn);
body.CreateFixture(shape, 0);
return body;
}
function pinJoint (world, bodyA, bodyB, anchor) {
var dfn = new Box2D.b2RevoluteJointDef();
dfn.Initialize(bodyA, bodyB, new b2Vec2(anchor));
- dfn.maxMotorTorque = 10.0;
- dfn.motorSpeed = 0.0;
+ dfn.maxMotorTorque = 100.0;
+ dfn.motorSpeed = 0.1;
dfn.enableMotor = true;
+ dfn.enableLimit = true;
return Box2D.castObject(world.CreateJoint(dfn), Box2D.b2RevoluteJoint);
}
.setSize([0.89, 1.0])
);
- var leftWing = new yuu.E(left = new BodyC(
- bodyFromAABB(world, [-0.50, 5.15], new yuu.AABB(0.45, 0.22), 1.0)),
+ var leftWing = new yuu.E(
+ left = new BodyC(bodyFromAABB(
+ world, [-0.275, 5.15], new yuu.AABB(0.45, 0.22), 0,
+ [-0.45/2, 0.0])),
new yuu.QuadC('@left')
+ .setAnchorAtPosition("right")
.setZ(-1)
.setSize([0.45, 0.22]));
- var leftJoint = pinJoint(world, left.body, body.body, [-0.1, 5.15]);
+ var leftJoint = pinJoint(world, left.body, body.body, [0.1, 5.15]);
var rightWing = new yuu.E(right = new BodyC(
- bodyFromAABB(world, [0.50, 5.15], new yuu.AABB(0.45, 0.22), 1.0)),
+ bodyFromAABB(world, [0.50, 5.15], new yuu.AABB(0.45, 0.22), 0)),
new yuu.QuadC('@right')
.setZ(-1)
.setSize([0.45, 0.22]));
var rightJoint = pinJoint(world, right.body, body.body, [0.1, 5.15]);
this.player.addChildren(leftWing, rightWing);
this.entity0.addChild(this.player);
+ leftJoint.SetLimits(0, Math.PI / 2);
+ rightJoint.SetLimits(-Math.PI / 2, 0);
var ground = new yuu.E(
new BodyC(bodyFromLine(world, [-100, 0], [100, 0])),
this.player.attach(
this.controller = new PlayerController(body, left, right,
- leftJoint, rightJoint));
+ leftJoint, rightJoint));
Object.assign(this.commands, this.controller.commands);
this.entity0.attach(new yuu.Ticker(function () {