Пример #1
0
    /// Set the active state of the body. An inactive body is not
    /// simulated and cannot be collided with or woken up.
    /// If you pass a flag of true, all fixtures will be added to the
    /// broad-phase.
    /// If you pass a flag of false, all fixtures will be removed from
    /// the broad-phase and all contacts will be destroyed.
    /// Fixtures and joints are otherwise unaffected. You may continue
    /// to create/destroy fixtures and joints on inactive bodies.
    /// Fixtures on an inactive body are implicitly inactive and will
    /// not participate in collisions, ray-casts, or queries.
    /// Joints connected to an inactive body are implicitly inactive.
    /// An inactive body is still owned by a b2World object and remains
    /// in the body list.
    public void SetActive(bool flag)
    {
        Debug.Assert(m_world.IsLocked() == false);

        if (flag == IsActive())
        {
            return;
        }

        if (flag)
        {
            m_flags |= BodyFlags.e_activeFlag;

            // Create all proxies.
            b2BroadPhase broadPhase = m_world.m_contactManager.m_broadPhase;
            for (b2Fixture f = m_fixtureList; f != null; f = f.m_next)
            {
                f.CreateProxies(broadPhase, m_xf);
            }

            // Contacts are created the next time step.
        }
        else
        {
            m_flags &= ~BodyFlags.e_activeFlag;

            // Destroy all proxies.
            b2BroadPhase broadPhase = m_world.m_contactManager.m_broadPhase;
            for (b2Fixture f = m_fixtureList; f != null; f = f.m_next)
            {
                f.DestroyProxies(broadPhase);
            }

            // Destroy the attached contacts.
            b2ContactEdge ce = m_contactList;
            while (ce != null)
            {
                b2ContactEdge ce0 = ce;
                ce = ce.next;
                m_world.m_contactManager.Destroy(ce0.contact);
            }
            m_contactList = null;
        }
    }
Пример #2
0
    /// Creates a fixture and attach it to this body. Use this function if you need
    /// to set some fixture parameters, like friction. Otherwise you can create the
    /// fixture directly from a shape.
    /// If the density is non-zero, this function automatically updates the mass of the body.
    /// Contacts are not created until the next time step.
    /// @param def the fixture definition.
    /// @warning This function is locked during callbacks.
    public b2Fixture CreateFixture(b2FixtureDef def)
    {
        Debug.Assert(m_world.IsLocked() == false);
        if (m_world.IsLocked() == true)
        {
            return(null);
        }

        b2Fixture fixture = new b2Fixture();

        fixture.Create(this, def);

        if ((m_flags & BodyFlags.e_activeFlag) != 0)
        {
            b2BroadPhase broadPhase = m_world.m_contactManager.m_broadPhase;
            fixture.CreateProxies(broadPhase, m_xf);
        }

        fixture.m_next = m_fixtureList;
        m_fixtureList  = fixture;
        ++m_fixtureCount;

        fixture.m_body = this;

        // Adjust mass properties if needed.
        if (fixture.m_density > 0.0f)
        {
            ResetMassData();
        }

        // Let the world know we have a new fixture. This will cause new contacts
        // to be created at the beginning of the next time step.
        m_world.m_flags |= b2World.WorldFlags.e_newFixture;

        return(fixture);
    }