package org.jbox2d.testbed.tests; import org.jbox2d.collision.Distance; import org.jbox2d.collision.TimeOfImpact; import org.jbox2d.collision.shapes.EdgeShape; import org.jbox2d.collision.shapes.PolygonShape; import org.jbox2d.common.MathUtils; import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.Body; import org.jbox2d.dynamics.BodyDef; import org.jbox2d.dynamics.BodyType; import org.jbox2d.testbed.framework.TestbedSettings; import org.jbox2d.testbed.framework.TestbedTest; public class BulletTest extends TestbedTest { Body m_body; Body m_bullet; float m_x; @Override public Vec2 getDefaultCameraPos() { return new Vec2(0, 6); } @Override public float getDefaultCameraScale() { return 40; } @Override public void initTest(boolean 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 void launch() { m_body.setTransform(new Vec2(0.0f, 4.0f), 0.0f); m_body.setLinearVelocity(new Vec2()); m_body.setAngularVelocity(0.0f); m_x = MathUtils.randomFloat(-1.0f, 1.0f); m_bullet.setTransform(new Vec2(m_x, 10.0f), 0.0f); m_bullet.setLinearVelocity(new Vec2(0.0f, -50.0f)); m_bullet.setAngularVelocity(0.0f); Distance.GJK_CALLS = 0; Distance.GJK_ITERS = 0; Distance.GJK_MAX_ITERS = 0; TimeOfImpact.toiCalls = 0; TimeOfImpact.toiIters = 0; TimeOfImpact.toiMaxIters = 0; TimeOfImpact.toiRootIters = 0; TimeOfImpact.toiMaxRootIters = 0; } @Override public void step(TestbedSettings settings) { super.step(settings); if (Distance.GJK_CALLS > 0) { addTextLine(String.format("gjk calls = %d, ave gjk iters = %3.1f, max gjk iters = %d", Distance.GJK_CALLS, Distance.GJK_ITERS * 1.0 / (Distance.GJK_CALLS), Distance.GJK_MAX_ITERS)); } if (TimeOfImpact.toiCalls > 0) { addTextLine(String.format("toi calls = %d, ave toi iters = %3.1f, max toi iters = %d", TimeOfImpact.toiCalls, TimeOfImpact.toiIters * 1f / (TimeOfImpact.toiCalls), TimeOfImpact.toiMaxRootIters)); addTextLine(String.format("ave toi root iters = %3.1f, max toi root iters = %d", TimeOfImpact.toiRootIters * 1f / (TimeOfImpact.toiCalls), TimeOfImpact.toiMaxRootIters)); } if (getStepCount() % 60 == 0) { launch(); } } @Override public String getTestName() { return "Bullet Test"; } }