m_zeta = 0.7f;
m_speed = 50.0f;
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;
RevoluteJointDef jd = new RevoluteJointDef();
Body prevBody = ground;
for (int i = 0; i < N; ++i) {
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
bd.position.set(161.0f + 2.0f * i, -0.125f);
Body body = m_world.createBody(bd);
body.createFixture(fd);
Vec2 anchor = new Vec2(160.0f + 2.0f * i, -0.125f);
jd.initialize(prevBody, body, anchor);
m_world.createJoint(jd);
prevBody = body;
}
Vec2 anchor = new Vec2(160.0f + 2.0f * N, -0.125f);
jd.initialize(prevBody, ground, anchor);
m_world.createJoint(jd);
}
// Boxes
{
PolygonShape box = new PolygonShape();
box.setAsBox(0.5f, 0.5f);
Body body = null;
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
bd.position.set(230.0f, 0.5f);
body = m_world.createBody(bd);
body.createFixture(box, 0.5f);
bd.position.set(230.0f, 1.5f);
body = m_world.createBody(bd);
body.createFixture(box, 0.5f);
bd.position.set(230.0f, 2.5f);
body = m_world.createBody(bd);
body.createFixture(box, 0.5f);
bd.position.set(230.0f, 3.5f);
body = m_world.createBody(bd);
body.createFixture(box, 0.5f);
bd.position.set(230.0f, 4.5f);
body = m_world.createBody(bd);
body.createFixture(box, 0.5f);
}
// Car
{
PolygonShape chassis = new PolygonShape();
Vec2 vertices[] = new Vec2[8];
vertices[0] = new Vec2(-1.5f, -0.5f);
vertices[1] = new Vec2(1.5f, -0.5f);
vertices[2] = new Vec2(1.5f, 0.0f);
vertices[3] = new Vec2(0.0f, 0.9f);
vertices[4] = new Vec2(-1.15f, 0.9f);
vertices[5] = new Vec2(-1.5f, 0.2f);
chassis.set(vertices, 6);
CircleShape circle = new CircleShape();
circle.m_radius = 0.4f;
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
bd.position.set(0.0f, 1.0f);
m_car = m_world.createBody(bd);
m_car.createFixture(chassis, 1.0f);