When i add some JointPairs to the world there is a Assertion Error comming from the box2d's step method that called inside draw loop. here is the full code i've tried to understand by nature of code examples.
import shiffman.box2d.*;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.joints.*;
import org.jbox2d.collision.shapes.*;
import org.jbox2d.collision.shapes.Shape;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.*;
import org.jbox2d.dynamics.contacts.*;
Box2DProcessing box2d;
ArrayList<Boundary> boundaries;
ArrayList<JointPair> pairs;
void setup() {
size(640, 360);
box2d = new Box2DProcessing(this);
box2d.createWorld();
pairs = new ArrayList<JointPair>();
boundaries = new ArrayList<Boundary>();
boundaries.add(new Boundary(width/4, height-5, width/2-50, 10));
boundaries.add(new Boundary(3*width/4, height-50, width/2-50, 10));
}
void draw() {
background(255);
box2d.step();
for (Boundary bounds : boundaries) {
bounds.display();
}
for (int i=pairs.size()-1; i>0; i--) {
pairs.get(i).display();
if (pairs.get(i).isPairOffScreen()) {
pairs.remove(i);
}
}
}
void mousePressed() {
JointPair p = new JointPair(mouseX, mouseY);
pairs.add(p);
}
class Boundary{
float x,y,w,h;
Body body;
Boundary(float _x, float _y, float _w, float _h){
x = _x;
y = _y;
w = _w;
h = _h;
//Define the shape
PolygonShape ps = new PolygonShape();
float box2dW = box2d.scalarPixelsToWorld(w/2);
float box2dH = box2d.scalarPixelsToWorld(h/2);
ps.setAsBox(box2dW,box2dH);
//create body definition
BodyDef bd = new BodyDef();
bd.type = BodyType.STATIC;
bd.position.set(box2d.coordPixelsToWorld(x,y));
body = box2d.createBody(bd);
//put all together
body.createFixture(ps,1);
}
void display() {
fill(0);
stroke(0);
rectMode(CENTER);
rect(x,y,w,h);
}
}
class Box {
Body body;
float w, h;
Box(float x, float y) {
w = 10;
h = 10;
makeBody(new Vec2(x, y), w, h);
}
void display() {
Vec2 pos = box2d.getBodyPixelCoord(body);
float a = body.getAngle();
rectMode(CENTER);
pushMatrix();
translate(pos.x, pos.y);
rotate(-a);
fill(127);
stroke(0);
strokeWeight(2);
rect(0, 0, w, h);
popMatrix();
}
boolean isOffScreen() {
Vec2 pos = box2d.getBodyPixelCoord(body);
if (pos.x > width || pos.x < 0 || pos.y > height || pos.y <0) {
killBody();
return true;
} else {
return false;
}
}
void killBody(){
box2d.destroyBody(body);
}
void makeBody(Vec2 center, float _w, float _h) {
//create shape here
PolygonShape ps = new PolygonShape();
float box2dW = box2d.scalarPixelsToWorld(_w/2);
float box2dH = box2d.scalarPixelsToWorld(_h/2);
ps.setAsBox(box2dW, box2dH);
//create fixture definition
FixtureDef fd = new FixtureDef();
fd.shape = ps;
fd.density = 1;
fd.friction = 0.3;
fd.restitution = 0.5;
//create body definition
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
bd.position.set(box2d.coordPixelsToWorld(center));
body = box2d.createBody(bd);
body.createFixture(fd);
//body.setLinearVelocity(new Vec2(random(-5,5), random(2,5)));
//body.setAngularVelocity(random(-5,5));
}
}
class JointPair {
Box b1, b2;
float len;
JointPair(float x, float y) {
len = 50;
b1 = new Box(x, y);
b2 = new Box(x+5, y+5);
DistanceJointDef djd = new DistanceJointDef();
djd.bodyA = b1.body;
djd.bodyB = b2.body;
djd.length = box2d.scalarPixelsToWorld(len);
djd.frequencyHz = 3;
djd.dampingRatio = 0.1;
DistanceJoint dj = (DistanceJoint) box2d.world.createJoint(djd);
}
void display(){
Vec2 box1 = box2d.getBodyPixelCoord(b1.body);
Vec2 box2 = box2d.getBodyPixelCoord(b2.body);
stroke(0);
strokeWeight(2);
line(box1.x,box1.y,box2.x,box2.y);
b1.display();
b2.display();
}
boolean isPairOffScreen(){
if(b1.isOffScreen() && b2.isOffScreen()){
b1.killBody();
b2.killBody();
return true;
}else{
return false;
}
}
}