示例#1
0
    public override void ForceFlight(cmd_effect_Flight param)
    {
        if (bNotMove)
        {
            return;
        }

        if (bIsForceMoving && m_bForceFlighting == false)
        {
            Trace.Log("在进行其他强制移动,不浮空");
            return;
        }


        if (param.nFlight == 0)
        {
            //此参数为0时,停止浮空,开始下落
            uint tick = GameLogicAPI.getTickCount();
            if (m_bForceFlighting && m_uResidenceStopTick > tick)
            {
                m_uResidenceStopTick = tick;
            }
            return;
        }

        if (m_bForceFlighting == true)
        {
            //已经在浮空状态,第二次浮空
            if ((m_fFlightVel > 0 && param.fHeight <= m_fFlightHeight) || //在上升状态,最终升空高度比fHeight要求的高
                (transform.position.y - m_flightEndPosition.y > param.fHeight))    //在下降状态,但已经比fHeight要求的高
            {
                //不会比目前状态升的更高,不需要重新上升,所以忽略
                return;
            }
            else
            {
                upAcc   = param.nGoUpAcceleration;
                downAcc = param.nDropAcceleration;
                float acc       = currentGravity + upAcc;
                float newHeight = param.fHeight - (transform.position.y - m_flightEndPosition.y);
                m_fFlightV0           = Mathf.Sqrt(2.0f * newHeight * acc);
                m_fFlightVel          = m_fFlightV0;
                m_uResidenceStopTick  = 0;
                m_uResidenceTick      = (uint)param.nResidenceTime;
                m_fFlightHeight       = param.fHeight;
                m_flightStartPosition = transform.position;
                //m_flightEndPosition不变
                m_fFlightTime = 0.0f;
            }
        }
        else
        {
            upAcc   = param.nGoUpAcceleration;
            downAcc = param.nDropAcceleration;
            float acc = currentGravity + upAcc;
            m_fFlightV0           = Mathf.Sqrt(2.0f * param.fHeight * acc);
            m_bForceFlighting     = true;
            m_fFlightVel          = m_fFlightV0;
            m_uResidenceStopTick  = 0;
            m_uResidenceTick      = (uint)param.nResidenceTime;
            m_fFlightHeight       = param.fHeight;
            m_flightStartPosition = transform.position;
            m_flightEndPosition   = transform.position;
            m_fFlightTime         = 0.0f;
        }


        m_nForceMoveStartTick = GameLogicAPI.getTickCount();
        m_nForceMoveEndTick   = 0;
        m_ForceMovePos        = transform.position;
        m_fForceMoveSpeed     = Vector3.zero;
        m_fForceStartPos      = transform.position;
    }
示例#2
0
    public void ForceFlight(cmd_effect_Flight param)
    {
        if (m_pFSM.bNotMove)
        {
            return;
        }

        if (m_pFSM.showLog)
        {
            Trace.Log(GameLogicAPI.getTickCount().ToString() + "ForceFlight" + param.nFlight + ". height" + param.fHeight + " upAcc" + param.nGoUpAcceleration.ToString() + " downAcc" + param.nDropAcceleration.ToString());
        }


        if (bForceMoving && bForceFlighting == false)
        {
            Trace.Log("在进行其他强制移动,不浮空");
            return;
        }

        if (param.nFlight == 0)
        {
            //此参数为0时,停止浮空,开始下落
            uint tick = GameLogicAPI.getTickCount();
            if (bForceFlighting)
            {
                if (m_fFlightVel > 0.0f)
                {
                    m_fFlightVel = 0.0f;
                }
                if (m_uResidenceStopTick > tick)
                {
                    m_uResidenceStopTick = tick;
                }
            }
            return;
        }

        if (bForceFlighting == true)
        {
            //已经在浮空状态,第二次浮空
            if ((m_fFlightVel > 0 && param.fHeight <= m_fFlightHeight) || //在上升状态,最终升空高度比fHeight要求的高
                (m_pFSM.transform.position.y - m_flightEndPosition.y > param.fHeight))    //在下降状态,但已经比fHeight要求的高
            {
                //不会比目前状态升的更高,不需要重新上升,所以忽略
                return;
            }
            else
            {
                upAcc   = param.nGoUpAcceleration;
                downAcc = param.nDropAcceleration;
                float acc       = m_pFSM.currentGravity + upAcc;
                float newHeight = param.fHeight - (m_pFSM.transform.position.y - m_flightEndPosition.y);
                m_fFlightV0           = Mathf.Sqrt(2.0f * newHeight * acc);
                m_fFlightVel          = m_fFlightV0;
                m_uResidenceStopTick  = 0;
                m_uResidenceTick      = (uint)param.nResidenceTime;
                m_fFlightHeight       = param.fHeight;
                m_flightStartPosition = m_pFSM.transform.position;
                //m_flightEndPosition不变
                m_fFlightTime = 0.0f;
                isGounded     = true;
            }
        }
        else
        {
            upAcc   = param.nGoUpAcceleration;
            downAcc = param.nDropAcceleration;
            float acc = m_pFSM.currentGravity + upAcc;
            m_fFlightV0           = Mathf.Sqrt(2.0f * param.fHeight * acc);
            bForceFlighting       = true;
            m_fFlightVel          = m_fFlightV0;
            m_uResidenceStopTick  = 0;
            m_uResidenceTick      = (uint)param.nResidenceTime;
            m_fFlightHeight       = param.fHeight;
            m_flightStartPosition = m_pFSM.transform.position;
            m_flightEndPosition   = m_pFSM.transform.position;
            m_fFlightTime         = 0.0f;
            isGounded             = true;
        }


        m_nForceMoveStartTick = GameLogicAPI.getTickCount();
        m_nForceMoveEndTick   = 0;
        m_ForceMovePos        = m_pFSM.transform.position;
        m_fForceMoveSpeed     = Vector3.zero;
        m_fForceStartPos      = m_pFSM.transform.position;

        //冲锋完成后向逻辑层回报一次同步,请根据需求取舍
        //syncVelocity = Vector3.zero;
        //syncDetalTime = 0;
        //syncPosition = m_flightStartPosition + new Vector3(0, m_fFlightHeight, 0);
        //m_CurStateHandler.Send_Sync_Position();
    }