Body ground = null;
{
BodyDef bd = new BodyDef();
ground = m_world.createBody(bd);
EdgeShape shape = new EdgeShape();
FixtureDef fd = new FixtureDef();
fd.shape = shape;
fd.density = 0.0f;
fd.friction = 0.6f;
shape.set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f));
ground.createFixture(fd);
float hs[] = {0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f};
float x = 20.0f, y1 = 0.0f, dx = 5.0f;
for (int i = 0; i < 10; ++i) {
float y2 = hs[i];
shape.set(new Vec2(x, y1), new Vec2(x + dx, y2));
ground.createFixture(fd);
y1 = y2;
x += dx;
}
for (int i = 0; i < 10; ++i) {
float y2 = hs[i];
shape.set(new Vec2(x, y1), new Vec2(x + dx, y2));
ground.createFixture(fd);
y1 = y2;
x += dx;
}
shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
ground.createFixture(fd);
x += 80.0f;
shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
ground.createFixture(fd);
x += 40.0f;
shape.set(new Vec2(x, 0.0f), new Vec2(x + 10.0f, 5.0f));
ground.createFixture(fd);
x += 20.0f;
shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
ground.createFixture(fd);
x += 40.0f;
shape.set(new Vec2(x, 0.0f), new Vec2(x, 20.0f));
ground.createFixture(fd);
}
// Teeter
{
BodyDef bd = new BodyDef();
bd.position.set(140.0f, 1.0f);
bd.type = BodyType.DYNAMIC;
Body body = m_world.createBody(bd);
PolygonShape box = new PolygonShape();
box.setAsBox(10.0f, 0.25f);
body.createFixture(box, 1.0f);
RevoluteJointDef jd = new RevoluteJointDef();
jd.initialize(ground, body, body.getPosition());
jd.lowerAngle = -8.0f * MathUtils.PI / 180.0f;
jd.upperAngle = 8.0f * MathUtils.PI / 180.0f;
jd.enableLimit = true;
m_world.createJoint(jd);
body.applyAngularImpulse(100.0f);
}
// Bridge
{
int N = 20;
PolygonShape shape = new PolygonShape();
shape.setAsBox(1.0f, 0.125f);
FixtureDef fd = new FixtureDef();
fd.shape = shape;
fd.density = 1.0f;
fd.friction = 0.6f;