Exemplo n.º 1
0
    void fillBallContacts(NewBallParticle ball, List <ParticleContact> contacts)
    {
        ParticleContact contact = default(ParticleContact);

        if (ball.height >= m_doorHeight)
        {
            for (int i = 0; i < m_ballEdges.Count; ++i)
            {
                if (ball.intersect(m_ballEdges[i].normal, m_ballEdges[i].d, ref contact))
                {
                    contacts.Add(contact);
                }
            }
        }
        else
        {
            #region jlx 2017.05.15-log:添加动态计算碰撞球门斜边

            var dynamicSlopeEdge = calculateSlopeEdge(ball.position);
            if (ball.intersect(dynamicSlopeEdge.normal, dynamicSlopeEdge.d, ref contact))
            {
                contact.tagI = (int)(
                    DoorSide.kDoor |
                    DoorSide.kBack |
                    (ball.position.x > Fix64.Zero ? DoorSide.kFieldA : DoorSide.kFieldB));
                contacts.Add(contact);
            }

            #endregion
        }
    }
Exemplo n.º 2
0
    //public void moveToward(FixVector2 velocity, Fix64 flyVelocity, bool pass)
    //{
    //    m_willBeCatched = false;
    //    m_particle.clearCollidedEventFlag();
    //    m_particle.velocity = velocity;
    //    m_particle.dampingAcceleration_land = landDampingAcceleration;
    //    m_particle.dampingAcceleration_air = airDampingAcceleration;
    //    m_particle.landingDamping = landingDamping;
    //    m_particle.angularVelocity = Fix64.Zero;
    //    m_particle.fly(Fix64.Zero, flyVelocity, gravity);
    //    kickIsPass = pass;
    //}

    //public void moveToward(FixVector2 velocity, Fix64 angularVelocity, Fix64 flyVelocity, bool pass)
    //{
    //    m_willBeCatched = false;
    //    m_particle.clearCollidedEventFlag();
    //    m_particle.velocity = velocity;
    //    m_particle.dampingAcceleration_land = landDampingAcceleration;
    //    m_particle.dampingAcceleration_air = airDampingAcceleration;
    //    m_particle.landingDamping = landingDamping;
    //    m_particle.angularVelocity = angularVelocity;
    //    m_particle.fly(Fix64.Zero, flyVelocity, gravity);
    //    kickIsPass = pass;
    //}

    public FBBall(Configuration config, FBWorld.Configuration worldConfig)
    {
        m_configuration               = config;
        m_particle                    = new NewBallParticle();
        m_particle.radius             = config.radius;
        m_particle.linearDamping_land = config.linearDamping_land;
        m_particle.linearDamping_air  = config.linearDamping_air;
        m_particle.landHitDamping     = config.landHitVerticleDamping;
        m_particle.ceilHitDamping     = worldConfig.ballCollisionRestitution[4];
        m_particle.ceilHeight         = worldConfig.doorHeight;
        m_particle.angularDamping     = config.angularDamping;
        m_particle.gravity            = config.gravity;
        m_particle.tag                = this;
        energy = config.getEnergy(0);
        m_particle.onLanded += (times, preHeightVelocity) =>
        {
            world.onBallLanded(m_particle.position, ballState == BallState.PassBall, times, get3DVelocity(), preHeightVelocity);
            ballState = BallState.Free;
        };
    }