Пример #1
0
        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));
                }
            }
        }
Пример #2
0
 public override long getTag(Body body)
 {
     if (body == m_body)
     {
         return BODY_TAG;
     }
     return base.getTag(body);
 }
Пример #3
0
 public override long getTag(Body body)
 {
     if (body == m_attachment)
         return ATTACHMENT_TAG;
     if (body == m_platform)
         return PLATFORM_TAG;
     return base.getTag(body);
 }
Пример #4
0
 public override long getTag(Body argBody)
 {
     if (argBody == m_character)
     {
         return CHARACTER_TAG;
     }
     return base.getTag(argBody);
 }
Пример #5
0
 public override long getTag(Body argBody)
 {
     if (argBody == m_bullet)
     {
         return BULLET_TAG;
     }
     return base.getTag(argBody);
 }
Пример #6
0
 public Fixture()
 {
     m_userData = null;
     m_body = null;
     m_next = null;
     m_proxies = null;
     m_proxyCount = 0;
     m_shape = null;
     m_filter = new Filter();
 }
Пример #7
0
 public override long getTag(Body argBody)
 {
     if (argBody == m_chassis)
     {
         return CHASSIS_TAG;
     }
     else if (argBody == m_wheel)
     {
         return WHEEL_TAG;
     }
     return default(long);
 }
Пример #8
0
 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);
 }
Пример #9
0
        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));
            }
        }
Пример #10
0
        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;
        }
Пример #11
0
        // 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;
        }
Пример #12
0
        /**
           * 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;
        }
Пример #13
0
        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;
        }
Пример #14
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);
            }
        }
Пример #15
0
        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);
            }
        }
Пример #16
0
        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);
                }
            }
        }
Пример #17
0
 public override void processBody(Body body, long tag)
 {
     if (tag == BODY_TAG)
     {
         m_body = body;
     }
     base.processBody(body, tag);
 }
Пример #18
0
        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;
        }
Пример #19
0
 public override void processBody(Body argBody, long argTag)
 {
     if (argTag == BULLET_TAG)
     {
         m_bullet = argBody;
         return;
     }
     base.processBody(argBody, argTag);
 }
Пример #20
0
        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;
            }
        }
Пример #21
0
 public override void processBody(Body argBody, long argTag)
 {
     if (argTag == CHARACTER_TAG)
     {
         m_character = argBody;
         return;
     }
     base.processBody(argBody, argTag);
 }
Пример #22
0
 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);
     }
 }
Пример #23
0
 public virtual void processBody(Body body, long tag)
 {
 }
Пример #24
0
 public override void processBody(Body argBody, long argTag)
 {
     if (argTag == CHASSIS_TAG)
     {
         m_chassis = argBody;
     }
     else if (argTag == WHEEL_TAG)
     {
         m_wheel = argBody;
     }
 }
Пример #25
0
 public void add(Body body)
 {
     Debug.Assert(m_bodyCount < m_bodyCapacity);
     body.m_islandIndex = m_bodyCount;
     m_bodies[m_bodyCount] = body;
     ++m_bodyCount;
 }
Пример #26
0
        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);
        }
Пример #27
0
        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);
        }
Пример #28
0
        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);
        }
Пример #29
0
        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;
        }
Пример #30
0
        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);
            }
        }