Commit 5f907780 authored by Viktor Lidholt's avatar Viktor Lidholt

Working joints in sprite physics

parent 79c23548
......@@ -4,10 +4,6 @@ abstract class PhysicsJoint {
PhysicsJoint(this.bodyA, this.bodyB) {
bodyA._joints.add(this);
bodyB._joints.add(this);
if (bodyA._attached && bodyB._attached) {
_attach(bodyA._physicsNode);
}
}
PhysicsBody bodyA;
......@@ -18,6 +14,12 @@ abstract class PhysicsJoint {
PhysicsNode _physicsNode;
void _completeCreation() {
if (bodyA._attached && bodyB._attached) {
_attach(bodyA._physicsNode);
}
}
void _attach(PhysicsNode physicsNode) {
if (_joint == null) {
_physicsNode = physicsNode;
......@@ -40,7 +42,7 @@ class PhysicsJointRevolute extends PhysicsJoint {
PhysicsJointRevolute(
PhysicsBody bodyA,
PhysicsBody bodyB,
this.anchorWorld, {
this.worldAnchor, {
double lowerAngle: 0.0,
double upperAngle: 0.0,
bool enableLimit: false
......@@ -48,9 +50,11 @@ class PhysicsJointRevolute extends PhysicsJoint {
this.lowerAngle = lowerAngle;
this.upperAngle = upperAngle;
this.enableLimit = enableLimit;
_completeCreation();
}
Point anchorWorld;
Point worldAnchor;
double lowerAngle;
double upperAngle;
bool enableLimit;
......@@ -58,8 +62,8 @@ class PhysicsJointRevolute extends PhysicsJoint {
box2d.Joint _createB2Joint(PhysicsNode physicsNode) {
// Create Joint Definition
Vector2 vecAnchor = new Vector2(
anchorWorld.x / physicsNode.b2WorldToNodeConversionFactor,
anchorWorld.y / physicsNode.b2WorldToNodeConversionFactor
worldAnchor.x / physicsNode.b2WorldToNodeConversionFactor,
worldAnchor.y / physicsNode.b2WorldToNodeConversionFactor
);
box2d.RevoluteJointDef b2Def = new box2d.RevoluteJointDef();
......@@ -73,18 +77,37 @@ class PhysicsJointRevolute extends PhysicsJoint {
}
}
class PhysicsJointPrismatic extends PhysicsJoint {
PhysicsJointPrismatic(
PhysicsBody bodyA,
PhysicsBody bodyB,
this.axis) : super(bodyA, bodyB) {
_completeCreation();
}
Offset axis;
box2d.Joint _createB2Joint(PhysicsNode physicsNode) {
box2d.PrismaticJointDef b2Def = new box2d.PrismaticJointDef();
b2Def.initialize(bodyA._body, bodyB._body, bodyA._body.position, new Vector2(axis.dx, axis.dy));
return physicsNode.b2World.createJoint(b2Def);
}
}
class PhysicsJointWeld extends PhysicsJoint {
PhysicsJointWeld(
PhysicsBody bodyA,
PhysicsBody bodyB) : super(bodyA, bodyB);
box2d.Joint _createB2Joint(PhysicsNode physicsNode) {
box2d.WeldJointDef b2Def = new box2d.WeldJointDef();
Vector2 middle = new Vector2(
(bodyA._body.position.x + bodyB._body.position.x) / 2.0,
(bodyA._body.position.y + bodyB._body.position.y) / 2.0
);
b2Def.initialize(bodyA._body, bodyB._body, middle);
return physicsNode.b2World.createJoint(b2Def);
}
PhysicsBody bodyB) : super(bodyA, bodyB) {
_completeCreation();
}
box2d.Joint _createB2Joint(PhysicsNode physicsNode) {
box2d.WeldJointDef b2Def = new box2d.WeldJointDef();
Vector2 middle = new Vector2(
(bodyA._body.position.x + bodyB._body.position.x) / 2.0,
(bodyA._body.position.y + bodyB._body.position.y) / 2.0
);
b2Def.initialize(bodyA._body, bodyB._body, middle);
return physicsNode.b2World.createJoint(b2Def);
}
}
......@@ -33,7 +33,7 @@ class PhysicsNode extends Node {
List<box2d.Body> _bodiesScheduledForDestruction = [];
double b2WorldToNodeConversionFactor = 500.0;
double b2WorldToNodeConversionFactor = 10.0;
Offset get gravity {
Vector2 g = b2World.getGravity();
......@@ -282,7 +282,7 @@ class PhysicsNode extends Node {
// Draw the joint depending on type
box2d.JointType type = joint.getType();
if (type == box2d.JointType.WELD) {
if (type == box2d.JointType.WELD || type == box2d.JointType.REVOLUTE) {
// Draw weld joint
canvas.drawCircle(ptAnchorA, 5.0, shapePaint);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment