public override void initTest(bool deserialized) { if (deserialized) { return; } Body[] bodies = new Body[e_count]; { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.m_radius = 1.0f; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(0.0f, 4.0f + 3.0f*i); bodies[i] = getWorld().createBody(bd); bodies[i].createFixture(shape, 1.0f); // m_bodies[i].setLinearVelocity(new Vec2(0.0f, -100.0f)); } } }
public override long getTag(Body body) { if (body == m_body) { return BODY_TAG; } return base.getTag(body); }
public override long getTag(Body body) { if (body == m_attachment) return ATTACHMENT_TAG; if (body == m_platform) return PLATFORM_TAG; return base.getTag(body); }
public override long getTag(Body argBody) { if (argBody == m_character) { return CHARACTER_TAG; } return base.getTag(argBody); }
public override long getTag(Body argBody) { if (argBody == m_bullet) { return BULLET_TAG; } return base.getTag(argBody); }
public Fixture() { m_userData = null; m_body = null; m_next = null; m_proxies = null; m_proxyCount = 0; m_shape = null; m_filter = new Filter(); }
public override long getTag(Body argBody) { if (argBody == m_chassis) { return CHASSIS_TAG; } else if (argBody == m_wheel) { return WHEEL_TAG; } return default(long); }
public override long getTag(Body body) { if (body == m_car) { return CAR_TAG; } if (body == m_wheel1) { return WHEEL1_TAG; } if (body == m_wheel2) { return WHEEL2_TAG; } return base.getTag(body); }
public override void initTest(bool deserialized) { { BodyDef bd = new BodyDef(); bd.position.set(0.0f, 0.0f); Body body = m_world.createBody(bd); EdgeShape edge = new EdgeShape(); edge.set(new Vec2(-10.0f, 0.0f), new Vec2(10.0f, 0.0f)); body.createFixture(edge, 0.0f); PolygonShape shape = new PolygonShape(); shape.setAsBox(0.2f, 1.0f, new Vec2(0.5f, 1.0f), 0.0f); body.createFixture(shape, 0.0f); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(0.0f, 4.0f); PolygonShape box = new PolygonShape(); box.setAsBox(2.0f, 0.1f); m_body = m_world.createBody(bd); m_body.createFixture(box, 1.0f); box.setAsBox(0.25f, 0.25f); // m_x = RandomFloat(-1.0f, 1.0f); m_x = -0.06530577f; bd.position.set(m_x, 10.0f); bd.bullet = true; m_bullet = m_world.createBody(bd); m_bullet.createFixture(box, 100.0f); m_bullet.setLinearVelocity(new Vec2(0.0f, -50.0f)); } }
public override void initTest(bool argDeserialized) { { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); } BodyDef bd2 = new BodyDef(); bd2.type = BodyType.DYNAMIC; bd2.position.set(0.0f, 10.0f); m_body = getWorld().createBody(bd2); PolygonShape shape2 = new PolygonShape(); shape2.setAsBox(4.0f, 4.0f, new Vec2(0.0f, 0.0f), 0.0f); m_fixture1 = m_body.createFixture(shape2, 10.0f); m_fixture2 = null; }
// We need separation create/destroy functions from the constructor/destructor because // the destructor cannot access the allocator (no destructor arguments allowed by C++). public void create(Body body, FixtureDef def) { m_userData = def.userData; m_friction = def.friction; m_restitution = def.restitution; m_body = body; m_next = null; m_filter.set(def.filter); m_isSensor = def._isSensor; m_shape = def.shape.clone(); // Reserve proxy space int childCount = m_shape.getChildCount(); if (m_proxies == null) { m_proxies = new FixtureProxy[childCount]; for (int i = 0; i < childCount; i++) { m_proxies[i] = new FixtureProxy(); m_proxies[i].fixture = null; m_proxies[i].proxyId = (int) BroadPhaseProxy.Null; } } if (m_proxies.Length < childCount) { FixtureProxy[] old = m_proxies; int newLen = MathUtils.max(old.Length*2, childCount); m_proxies = new FixtureProxy[newLen]; Array.Copy(old, 0, m_proxies, 0, old.Length); for (int i = 0; i < newLen; i++) { if (i >= old.Length) { m_proxies[i] = new FixtureProxy(); } m_proxies[i].fixture = null; m_proxies[i].proxyId = (int) BroadPhaseProxy.Null; } } m_proxyCount = 0; m_density = def.density; }
/** * This is used to prevent connected bodies from colliding. It may lie, depending on the * collideConnected flag. * * @param other * @return */ public bool shouldCollide(Body other) { // At least one body should be dynamic. if (m_type != BodyType.DYNAMIC && other.m_type != BodyType.DYNAMIC) { return false; } // Does a joint prevent collision? for (JointEdge jn = m_jointList; jn != null; jn = jn.next) { if (jn.other == other) { if (jn.joint.getCollideConnected() == false) { return false; } } } return true; }
public Body(BodyDef bd, World world) { Debug.Assert(bd.position.isValid()); Debug.Assert(bd.linearVelocity.isValid()); Debug.Assert(bd.gravityScale >= 0.0f); Debug.Assert(bd.angularDamping >= 0.0f); Debug.Assert(bd.linearDamping >= 0.0f); m_flags = 0; if (bd.bullet) { m_flags |= BodyFlags.Bullet; } if (bd.fixedRotation) { m_flags |= BodyFlags.FixedRotation; } if (bd.allowSleep) { m_flags |= BodyFlags.AutoSleep; } if (bd.awake) { m_flags |= BodyFlags.Awake; } if (bd.active) { m_flags |= BodyFlags.Active; } m_world = world; m_xf.p.set(bd.position); m_xf.q.set(bd.angle); m_sweep.localCenter.setZero(); m_sweep.c0.set(m_xf.p); m_sweep.c.set(m_xf.p); m_sweep.a0 = bd.angle; m_sweep.a = bd.angle; m_sweep.alpha0 = 0.0f; m_jointList = null; m_contactList = null; m_prev = null; m_next = null; m_linearVelocity.set(bd.linearVelocity); m_angularVelocity = bd.angularVelocity; m_linearDamping = bd.linearDamping; m_angularDamping = bd.angularDamping; m_gravityScale = bd.gravityScale; m_force.setZero(); m_torque = 0.0f; m_sleepTime = 0.0f; m_type = bd.type; if (m_type == BodyType.DYNAMIC) { m_mass = 1f; m_invMass = 1f; } else { m_mass = 0f; m_invMass = 0f; } m_I = 0.0f; m_invI = 0.0f; m_userData = bd.userData; m_fixtureList = null; m_fixtureCount = 0; }
public override void initTest(bool deserialized) { { BodyDef bd = new BodyDef(); Body ground = m_world.createBody(bd); { PolygonShape shape = new PolygonShape(); Vec2[] vertices = new Vec2[] {new Vec2(-40, -10), new Vec2(40, -10), new Vec2(40, 0), new Vec2(-40, 0)}; shape.set(vertices, 4); ground.createFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); Vec2[] vertices = new Vec2[] {new Vec2(-40, -1), new Vec2(-20, -1), new Vec2(-20, 20), new Vec2(-40, 30)}; shape.set(vertices, 4); ground.createFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); Vec2[] vertices = new Vec2[] {new Vec2(20, -1), new Vec2(40, -1), new Vec2(40, 30), new Vec2(20, 20)}; shape.set(vertices, 4); ground.createFixture(shape, 0.0f); } } m_world.setParticleRadius(0.2f); { PolygonShape shape = new PolygonShape(); shape.setAsBox(20, 10, new Vec2(0, 10), 0); ParticleGroupDef pd = new ParticleGroupDef(); pd.flags = flags; pd.shape = shape; m_world.createParticleGroup(pd); } { BodyDef bd = new BodyDef(); bd.type = BodyType.KINEMATIC; Body body = m_world.createBody(bd); circle = body; CircleShape shape = new CircleShape(); shape.m_p.set(0, 5); shape.m_radius = 1; body.createFixture(shape, 0.1f); body.setLinearVelocity(new Vec2(-6, 0.0f)); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(1, 1, new Vec2(-10, 5), 0); body.createFixture(shape, 0.1f); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(1, 1, new Vec2(10, 5), 0.5f); body.createFixture(shape, 0.1f); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(0, 20), new Vec2(1, 21)); body.createFixture(shape, 0.1f); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(3, 20), new Vec2(4, 21)); body.createFixture(shape, 0.1f); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-3, 21), new Vec2(-2, 20)); body.createFixture(shape, 0.1f); } }
public override void initTest(bool deserialized) { if (deserialized) { return; } m_hz = 4.0f; 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 anchor2 = new Vec2(160.0f + 2.0f*N, -0.125f); jd.initialize(prevBody, ground, anchor2); 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); FixtureDef fd = new FixtureDef(); fd.shape = circle; fd.density = 1.0f; fd.friction = 0.9f; bd.position.set(-1.0f, 0.35f); m_wheel1 = m_world.createBody(bd); m_wheel1.createFixture(fd); bd.position.set(1.0f, 0.4f); m_wheel2 = m_world.createBody(bd); m_wheel2.createFixture(fd); WheelJointDef jd = new WheelJointDef(); Vec2 axis = new Vec2(0.0f, 1.0f); jd.initialize(m_car, m_wheel1, m_wheel1.getPosition(), axis); jd.motorSpeed = 0.0f; jd.maxMotorTorque = 20.0f; jd.enableMotor = true; jd.frequencyHz = m_hz; jd.dampingRatio = m_zeta; m_spring1 = (WheelJoint) m_world.createJoint(jd); jd.initialize(m_car, m_wheel2, m_wheel2.getPosition(), axis); jd.motorSpeed = 0.0f; jd.maxMotorTorque = 10.0f; jd.enableMotor = false; jd.frequencyHz = m_hz; jd.dampingRatio = m_zeta; m_spring2 = (WheelJoint) m_world.createJoint(jd); } }
public override void initTest(bool deserialized) { if (deserialized) { return; } getWorld().setGravity(new Vec2(0.0f, 0.0f)); float k_restitution = 0.4f; Body ground; { BodyDef bd = new BodyDef(); bd.position.set(0.0f, 20.0f); ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); FixtureDef sd = new FixtureDef(); sd.shape = shape; sd.density = 0.0f; sd.restitution = k_restitution; // Left vertical shape.set(new Vec2(-20.0f, -20.0f), new Vec2(-20.0f, 20.0f)); ground.createFixture(sd); // Right vertical shape.set(new Vec2(20.0f, -20.0f), new Vec2(20.0f, 20.0f)); ground.createFixture(sd); // Top horizontal shape.set(new Vec2(-20.0f, 20.0f), new Vec2(20.0f, 20.0f)); ground.createFixture(sd); // Bottom horizontal shape.set(new Vec2(-20.0f, -20.0f), new Vec2(20.0f, -20.0f)); ground.createFixture(sd); } { Transform xf1 = new Transform(); xf1.q.set(0.3524f*MathUtils.PI); Rot.mulToOutUnsafe(xf1.q, new Vec2(1.0f, 0.0f), ref xf1.p); Vec2[] vertices = new Vec2[3]; vertices[0] = Transform.mul(xf1, new Vec2(-1.0f, 0.0f)); vertices[1] = Transform.mul(xf1, new Vec2(1.0f, 0.0f)); vertices[2] = Transform.mul(xf1, new Vec2(0.0f, 0.5f)); PolygonShape poly1 = new PolygonShape(); poly1.set(vertices, 3); FixtureDef sd1 = new FixtureDef(); sd1.shape = poly1; sd1.density = 4.0f; Transform xf2 = new Transform(); xf2.q.set(-0.3524f*MathUtils.PI); Rot.mulToOut(xf2.q, new Vec2(-1.0f, 0.0f), ref xf2.p); vertices[0] = Transform.mul(xf2, new Vec2(-1.0f, 0.0f)); vertices[1] = Transform.mul(xf2, new Vec2(1.0f, 0.0f)); vertices[2] = Transform.mul(xf2, new Vec2(0.0f, 0.5f)); PolygonShape poly2 = new PolygonShape(); poly2.set(vertices, 3); FixtureDef sd2 = new FixtureDef(); sd2.shape = poly2; sd2.density = 2.0f; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.angularDamping = 2.0f; bd.linearDamping = 0.5f; bd.position.set(0.0f, 2.0f); bd.angle = MathUtils.PI; bd.allowSleep = false; m_body = getWorld().createBody(bd); m_body.createFixture(sd1); m_body.createFixture(sd2); } { PolygonShape shape = new PolygonShape(); shape.setAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; fd.friction = 0.3f; for (int i = 0; i < 10; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(0.0f, 5.0f + 1.54f*i); Body body = getWorld().createBody(bd); body.createFixture(fd); float gravity = 10.0f; float I = body.getInertia(); float mass = body.getMass(); // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m) float radius = MathUtils.sqrt(2.0f*I/mass); FrictionJointDef jd = new FrictionJointDef(); jd.localAnchorA.setZero(); jd.localAnchorB.setZero(); jd.bodyA = ground; jd.bodyB = body; jd.collideConnected = true; jd.maxForce = mass*gravity; jd.maxTorque = mass*radius*gravity; getWorld().createJoint(jd); } } }
public override void processBody(Body body, long tag) { if (tag == BODY_TAG) { m_body = body; } base.processBody(body, tag); }
public override void initTest(bool deserialized) { if (deserialized) { return; } { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); // shape.setAsBox(40, 10, new Vec2(0,-10), 0); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); shape.set(new Vec2(20.0f, 0.0f), new Vec2(20.0f, 20.0f)); ground.createFixture(shape, 0.0f); } float[] xs = new float[] {0.0f, -10.0f, -5.0f, 5.0f, 10.0f}; for (int j = 0; j < e_columnCount; ++j) { PolygonShape shape = new PolygonShape(); shape.setAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; fd.friction = 0.3f; for (int i = 0; i < e_rowCount; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; int n = j*e_rowCount + i; Debug.Assert(n < e_rowCount*e_columnCount); float x = 0.0f; // float x = RandomFloat(-0.02f, 0.02f); // float x = i % 2 == 0 ? -0.025f : 0.025f; bd.position.set(xs[j] + x, 0.752f + 1.54f*i); Body body = getWorld().createBody(bd); body.createFixture(fd); } } m_bullet = null; }
public override void processBody(Body argBody, long argTag) { if (argTag == BULLET_TAG) { m_bullet = argBody; return; } base.processBody(argBody, argTag); }
public override void keyPressed(char argKeyChar, int argKeyCode) { switch (argKeyChar) { case ',': if (m_bullet != null) { getWorld().destroyBody(m_bullet); m_bullet = null; } { CircleShape shape = new CircleShape(); shape.m_radius = 0.25f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.restitution = 0.05f; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.bullet = true; bd.position.set(-31.0f, 5.0f); m_bullet = getWorld().createBody(bd); m_bullet.createFixture(fd); m_bullet.setLinearVelocity(new Vec2(400.0f, 0.0f)); } break; } }
public override void processBody(Body argBody, long argTag) { if (argTag == CHARACTER_TAG) { m_character = argBody; return; } base.processBody(argBody, argTag); }
public override void processBody(Body body, long tag) { if (tag == CAR_TAG) { m_car = body; } else if (tag == WHEEL1_TAG) { m_wheel1 = body; } else if (tag == WHEEL2_TAG) { m_wheel2 = body; } else { base.processBody(body, tag); } }
public virtual void processBody(Body body, long tag) { }
public override void processBody(Body argBody, long argTag) { if (argTag == CHASSIS_TAG) { m_chassis = argBody; } else if (argTag == WHEEL_TAG) { m_wheel = argBody; } }
public void add(Body body) { Debug.Assert(m_bodyCount < m_bodyCapacity); body.m_islandIndex = m_bodyCount; m_bodies[m_bodyCount] = body; ++m_bodyCount; }
private void launchBomb(Vec2 position, Vec2 velocity) { if (bomb != null) { m_world.destroyBody(bomb); bomb = null; } // todo optimize this BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(position); bd.bullet = true; bomb = m_world.createBody(bd); bomb.setLinearVelocity(velocity); CircleShape circle = new CircleShape(); circle.m_radius = 0.3f; FixtureDef fd = new FixtureDef(); fd.shape = circle; fd.density = 20f; fd.restitution = 0; Vec2 minV = new Vec2(position); Vec2 maxV = new Vec2(position); minV.subLocal(new Vec2(.3f, .3f)); maxV.addLocal(new Vec2(.3f, .3f)); aabb.lowerBound.set(minV); aabb.upperBound.set(maxV); bomb.createFixture(fd); }
public void init(TestbedModel model) { this.model = model; Vec2 gravity = new Vec2(0, -10f); m_world = model.getWorldCreator().createWorld(gravity); m_world.setParticleGravityScale(0.4f); m_world.setParticleDensity(1.2f); bomb = null; mouseJoint = null; mouseTracing = false; mouseTracerPosition.setZero(); mouseTracerVelocity.setZero(); BodyDef bodyDef = new BodyDef(); groundBody = m_world.createBody(bodyDef); init(m_world, false); }
public override void initTest(bool argDeserialized) { if (argDeserialized) { return; } m_offset.set(0.0f, 8.0f); m_motorSpeed = 2.0f; m_motorOn = true; Vec2 pivot = new Vec2(0.0f, 0.8f); // Ground { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-50.0f, 0.0f), new Vec2(50.0f, 0.0f)); ground.createFixture(shape, 0.0f); shape.set(new Vec2(-50.0f, 0.0f), new Vec2(-50.0f, 10.0f)); ground.createFixture(shape, 0.0f); shape.set(new Vec2(50.0f, 0.0f), new Vec2(50.0f, 10.0f)); ground.createFixture(shape, 0.0f); } // Balls for (int i = 0; i < 40; ++i) { CircleShape shape = new CircleShape(); shape.m_radius = 0.25f; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-40.0f + 2.0f*i, 0.5f); Body body = getWorld().createBody(bd); body.createFixture(shape, 1.0f); } // Chassis { PolygonShape shape = new PolygonShape(); shape.setAsBox(2.5f, 1.0f); FixtureDef sd = new FixtureDef(); sd.density = 1.0f; sd.shape = shape; sd.filter.groupIndex = -1; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(pivot); bd.position.addLocal(m_offset); m_chassis = getWorld().createBody(bd); m_chassis.createFixture(sd); } { CircleShape shape = new CircleShape(); shape.m_radius = 1.6f; FixtureDef sd = new FixtureDef(); sd.density = 1.0f; sd.shape = shape; sd.filter.groupIndex = -1; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(pivot); bd.position.addLocal(m_offset); m_wheel = getWorld().createBody(bd); m_wheel.createFixture(sd); } { RevoluteJointDef jd = new RevoluteJointDef(); jd.initialize(m_wheel, m_chassis, pivot.add(m_offset)); jd.collideConnected = false; jd.motorSpeed = m_motorSpeed; jd.maxMotorTorque = 400.0f; jd.enableMotor = m_motorOn; m_motorJoint = (RevoluteJoint) getWorld().createJoint(jd); } Vec2 wheelAnchor; wheelAnchor = pivot.add(new Vec2(0.0f, -0.8f)); createLeg(-1.0f, wheelAnchor); createLeg(1.0f, wheelAnchor); m_wheel.setTransform(m_wheel.getPosition(), 120.0f*MathUtils.PI/180.0f); createLeg(-1.0f, wheelAnchor); createLeg(1.0f, wheelAnchor); m_wheel.setTransform(m_wheel.getPosition(), -120.0f*MathUtils.PI/180.0f); createLeg(-1.0f, wheelAnchor); createLeg(1.0f, wheelAnchor); }
public override void initTest(bool argDeserialized) { // Ground body { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); } // Breakable dynamic body { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(0.0f, 40.0f); bd.angle = 0.25f*MathUtils.PI; m_body1 = getWorld().createBody(bd); m_shape1 = new PolygonShape(); m_shape1.setAsBox(0.5f, 0.5f, new Vec2(-0.5f, 0.0f), 0.0f); m_piece1 = m_body1.createFixture(m_shape1, 1.0f); m_shape2 = new PolygonShape(); m_shape2.setAsBox(0.5f, 0.5f, new Vec2(0.5f, 0.0f), 0.0f); m_piece2 = m_body1.createFixture(m_shape2, 1.0f); } m_break = false; m_broke = false; }
public override void initTest(bool deserialized) { if (deserialized) { return; } // Ground body { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f)); ground.createFixture(shape, 0.0f); } // Collinear edges // This shows the problematic case where a box shape can hit // an internal vertex. { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.m_radius = 0.0f; shape.set(new Vec2(-8.0f, 1.0f), new Vec2(-6.0f, 1.0f)); ground.createFixture(shape, 0.0f); shape.set(new Vec2(-6.0f, 1.0f), new Vec2(-4.0f, 1.0f)); ground.createFixture(shape, 0.0f); shape.set(new Vec2(-4.0f, 1.0f), new Vec2(-2.0f, 1.0f)); ground.createFixture(shape, 0.0f); } // Chain shape { BodyDef bd = new BodyDef(); bd.angle = 0.25f*MathUtils.PI; Body ground = getWorld().createBody(bd); Vec2[] vs = new Vec2[4]; vs[0] = new Vec2(5.0f, 7.0f); vs[1] = new Vec2(6.0f, 8.0f); vs[2] = new Vec2(7.0f, 8.0f); vs[3] = new Vec2(8.0f, 7.0f); ChainShape shape = new ChainShape(); shape.createChain(vs, 4); ground.createFixture(shape, 0.0f); } // Square tiles. This shows that adjacency shapes may // have non-smooth collision. There is no solution // to this problem. { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(1.0f, 1.0f, new Vec2(4.0f, 3.0f), 0.0f); ground.createFixture(shape, 0.0f); shape.setAsBox(1.0f, 1.0f, new Vec2(6.0f, 3.0f), 0.0f); ground.createFixture(shape, 0.0f); shape.setAsBox(1.0f, 1.0f, new Vec2(8.0f, 3.0f), 0.0f); ground.createFixture(shape, 0.0f); } // Square made from an edge loop. Collision should be smooth. { BodyDef bd = new BodyDef(); Body ground = m_world.createBody(bd); Vec2[] vs = new Vec2[4]; vs[0] = new Vec2(-1.0f, 3.0f); vs[1] = new Vec2(1.0f, 3.0f); vs[2] = new Vec2(1.0f, 5.0f); vs[3] = new Vec2(-1.0f, 5.0f); ChainShape shape = new ChainShape(); shape.createLoop(vs, 4); ground.createFixture(shape, 0.0f); } // Edge loop. Collision should be smooth. { BodyDef bd = new BodyDef(); bd.position.set(-10.0f, 4.0f); Body ground = getWorld().createBody(bd); Vec2[] vs = new Vec2[10]; vs[0] = new Vec2(0.0f, 0.0f); vs[1] = new Vec2(6.0f, 0.0f); vs[2] = new Vec2(6.0f, 2.0f); vs[3] = new Vec2(4.0f, 1.0f); vs[4] = new Vec2(2.0f, 2.0f); vs[5] = new Vec2(0.0f, 2.0f); vs[6] = new Vec2(-2.0f, 2.0f); vs[7] = new Vec2(-4.0f, 3.0f); vs[8] = new Vec2(-6.0f, 2.0f); vs[9] = new Vec2(-6.0f, 0.0f); ChainShape shape = new ChainShape(); shape.createLoop(vs, 10); ground.createFixture(shape, 0.0f); } // Square character 1 { BodyDef bd = new BodyDef(); bd.position.set(-3.0f, 8.0f); bd.type = BodyType.DYNAMIC; bd.fixedRotation = true; bd.allowSleep = false; Body body = getWorld().createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; body.createFixture(fd); } // Square character 2 { BodyDef bd = new BodyDef(); bd.position.set(-5.0f, 5.0f); bd.type = BodyType.DYNAMIC; bd.fixedRotation = true; bd.allowSleep = false; Body body = getWorld().createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(0.25f, 0.25f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; body.createFixture(fd); } // Hexagon character { BodyDef bd = new BodyDef(); bd.position.set(-5.0f, 8.0f); bd.type = BodyType.DYNAMIC; bd.fixedRotation = true; bd.allowSleep = false; Body body = getWorld().createBody(bd); float angle = 0.0f; float delta = MathUtils.PI/3.0f; Vec2[] vertices = new Vec2[6]; for (int i = 0; i < 6; ++i) { vertices[i] = new Vec2(0.5f*MathUtils.cos(angle), 0.5f*MathUtils.sin(angle)); angle += delta; } PolygonShape shape = new PolygonShape(); shape.set(vertices, 6); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; body.createFixture(fd); } // Circle character { BodyDef bd = new BodyDef(); bd.position.set(3.0f, 5.0f); bd.type = BodyType.DYNAMIC; bd.fixedRotation = true; bd.allowSleep = false; Body body = getWorld().createBody(bd); CircleShape shape = new CircleShape(); shape.m_radius = 0.5f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; body.createFixture(fd); } // Circle character { BodyDef bd = new BodyDef(); bd.position.set(-7.0f, 6.0f); bd.type = BodyType.DYNAMIC; bd.allowSleep = false; m_character = getWorld().createBody(bd); CircleShape shape = new CircleShape(); shape.m_radius = 0.25f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.friction = 1; m_character.createFixture(fd); } }