示例#1
0
int KRLTarget::Update(double /* fTime */, double /* fTimeLast */, DWORD /* dwGameLoop */, BOOL /* bFrame */)
{
	int nRetCode = false;
    int nResult = false;
	HRESULT hr = E_FAIL;

    StartProfile(&g_pRL->m_Profile, KRLPROFILE_TARGET);

    nRetCode = m_nObjectType == RL_OBJECT_UNKNOWN;
	KG_PROCESS_SUCCESS(nRetCode);

	nRetCode = m_ap3DModel[m_nRLForceRelation] == NULL;
	KG_PROCESS_SUCCESS(nRetCode);

    switch (m_nObjectType)
    {
    case RL_OBJECT_PLAYER:
    case RL_OBJECT_NPC:
        {
            KRLRemoteCharacter* pRLRemoteCharacter = NULL;

            pRLRemoteCharacter = m_pRLScene->m_CharacterMgr.Lookup(m_dwObjectID);
            if (pRLRemoteCharacter)
            {
                pRLRemoteCharacter->m_RLCharacter.GetPosition(m_vPosition);
            }
            else
            {
                m_vPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f);

                hr = Hide();
                KGLOG_COM_PROCESS_ERROR(hr);
            }
        }
        break;
    case RL_OBJECT_DOODAD:
    case RL_OBJECT_RIDES:
        break;
    default:
        ASSERT(0);
        break;
    }

	hr = KModel::SetPosition(m_ap3DModel[m_nRLForceRelation], m_vPosition);
	KGLOG_COM_PROCESS_ERROR(hr);

Exit1:
	nResult = true;
Exit0:
    StopProfile(&g_pRL->m_Profile, KRLPROFILE_TARGET);
	return nResult;
}
示例#2
0
BOOL KRLSkillEffectResult::Activate(double fTime, double fTimeLast, DWORD dwGameLoop, BOOL bFrame)
{
    StartProfile(&g_pRL->m_Profile, KRLPROFILE_SKILL_EFFECT_RESULT);

    KSkillEffectResultDataMap::iterator it = m_aData.begin();
    for (; it != m_aData.end();)
    {
        KSkillEffectResultData& Data = it->second;

        if (Data.IsFinished(fTime))
            m_aData.erase(it++);
        else
            ++it;
    }

    StopProfile(&g_pRL->m_Profile, KRLPROFILE_SKILL_EFFECT_RESULT);
    return TRUE;
}
示例#3
0
HRESULT KRLTrackCamera::FrameMove(KRLCameraParam* pResultParam, float fDeltaTime)
{
    HRESULT hrResult = E_FAIL;
    int nRetCode = false;
    float fDeltaDistance = 0.0f;
    KRLSpringParam RLSpringParam;
    KRLSpringResult RLSpringResult;

    StartProfile(&g_pRL->m_Profile, KRLPROFILE_TRACK_CAMERA);

    KGLOG_PROCESS_ERROR(pResultParam);
    KG_PROCESS_SUCCESS(!m_nUpdateFlag);

    // 利用弹簧系统移动Camera到期待的位置
    if (m_nUseFlexFlag)
    {
        fDeltaDistance = m_fExpectDistance - m_fDistance - m_fWheelOffset;     // 要参与弹簧系统的距离
        ASSERT(fDeltaDistance >= 0.0f);
        KGLOG_CHECK_ERROR(fDeltaDistance >= 0.0f);

        fDeltaTime *= 0.001f;
 
        RLSpringParam.fDistance = fDeltaDistance;
        RLSpringParam.fTime = fDeltaTime;
        RLSpringParam.fVelocity = m_fCurrentVelocity;
        RLSpringParam.fEpsilon = RL_SPRING_EPSILON;

        nRetCode = RunSpringSystem(RLSpringParam, &RLSpringResult);
        KGLOG_PROCESS_ERROR(nRetCode);

        if (!RLSpringResult.nFinished)
        {
            m_fDistance += RLSpringResult.fDistance;
            m_fCurrentVelocity = RLSpringResult.fVelocity;
        }
        else
        {
            StopSpringSystem((m_fExpectDistance + m_fDistance) * 0.5f);
        }
    }
    else
    {
        StopSpringSystem((m_fExpectDistance + m_fDistance) * 0.5f);
    }

    // 遮挡检测
    DetectObstruct(m_fExpectDistance);

    m_vPosition = m_vExpectTarget - m_vExpectFront * m_fDistance;

    m_fWheelOffset = 0.0f;

Exit1:
    hrResult = S_OK;
Exit0:
    pResultParam->vPosition = m_vPosition;
    pResultParam->vLookAt = m_vLookAt;
    pResultParam->vUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
    pResultParam->vTarget = m_vTarget;

    StopProfile(&g_pRL->m_Profile, KRLPROFILE_TRACK_CAMERA);
    return hrResult;
}
示例#4
0
HRESULT Window::MessageLoop()
{
    MSG msg;

    while (true) {
        //
        // Turn on Profiling
        //

        #ifdef ICAP
            if (s_bProfileStarted) {
                if (s_countProfile == 0) {
                    MarkProfile(2); 
                    StopProfile(PROFILE_THREADLEVEL, PROFILE_CURRENTID);
                    s_bProfileStarted = false;
                }
            } else {
                if (s_countProfile != 0) {
                    StartProfile(PROFILE_THREADLEVEL, PROFILE_CURRENTID);
                    MarkProfile(1); 
                    s_bProfileStarted = true;
                }

                if (s_countProfile > 0) {
                    s_countProfile--;
                }
            }
        #endif

        //
        // Call Timers and Idle functions
        //

        CallTimers();
        CallIdleFunctions();

        //
        // Handles Win32 messages
        //

        bool bAnyMessage = true;
        if (g_bContinuousIdle) {
            bAnyMessage = ::PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE) != 0;
        } else {
            ::GetMessageA(&msg, NULL, 0, 0);
        }

        if (bAnyMessage) {
            do {
                if (msg.message == WM_QUIT) {
                    s_mapWindow.SetEmpty();
                    return S_OK;
                }

                switch (msg.message) {
                    case WM_SYSKEYDOWN:
                    case WM_SYSKEYUP:
                    case WM_KEYDOWN:
                    case WM_KEYUP:
                        {
                            KeyState ks;
                            ks.vk = msg.wParam;
                            ks.bAlt = (msg.message == WM_SYSKEYUP || msg.message == WM_SYSKEYDOWN) 
                                && (msg.lParam & (1 << 29)); // See help for WM_SYSKEYDOWN
                            ks.bShift = (GetKeyState(VK_SHIFT) & 0x8000) !=0;
                            ks.bControl = (GetKeyState(VK_CONTROL) & 0x8000) !=0;
                            ks.bDown = (msg.message == WM_KEYDOWN || msg.message == WM_SYSKEYDOWN || ks.vk == 44); // special exception for PrintScreen key
                            ks.countRepeat = LOWORD(msg.lParam);

							bool fHandled = false;
                            bool fForceTranslate = false;

                            TList<TRef<IKeyboardInput> >::Iterator iter(g_listKeyboardInputFilters);
                            while (!iter.End() && !fHandled) {
                                fHandled = iter.Value()->OnKey(NULL, ks, fForceTranslate);
                                iter.Next();
                            }

                            if (!fHandled) {
                                fHandled = (::DispatchMessageA(&msg) == 0);
                            }

                            if (!fHandled || fForceTranslate) {
                                ::TranslateMessage(&msg);
                            }
                        }
                        break;

                    case WM_CHAR:
                        {
                            KeyState ks;
                            ks.vk = msg.wParam;
                            ks.bShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
                            ks.bControl = (GetKeyState(VK_CONTROL) & 0x8000) !=0;
                            ks.countRepeat = LOWORD(msg.lParam);

                            bool fHandled = false;

                            TList<TRef<IKeyboardInput> >::Iterator iter(g_listKeyboardInputFilters);
                            while (!iter.End() && !fHandled) {
                                fHandled = iter.Value()->OnChar(NULL, ks);
                                iter.Next();
                            }

                            if (fHandled) {
                                break;
                            }
                        }

                        //
                        // intentional fallthrough
                        //

                    default:
                        ::DispatchMessageA(&msg);
                        break;
                } 
            } while (::PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE));
        }
    }
}
示例#5
0
int KRLCamera::UpdateLocal(double fTime, double fTimeLast, DWORD dwGameLoop, BOOL bFrame)
{
    int nRetCode = false;
    int nResult = false;
    HRESULT hr = E_FAIL;
    KRLCameraParam RLCameraParam;
    float fDeltaTime = 0.0f;

    StartProfile(&g_pRL->m_Profile, KRLPROFILE_CAMERA);

    KG_PROCESS_SUCCESS(!m_bFrameMoveEnable);

    fDeltaTime = (float)(g_pRL->m_fTime - g_pRL->m_fTimeLast);

    hr = m_pCamera->Update(fTime, fTimeLast, dwGameLoop, bFrame, &m_CommonInfo);
    KGLOG_COM_PROCESS_ERROR(hr);

    nRetCode = ClearControlsImpluse();
    KGLOG_PROCESS_ERROR(nRetCode);

    hr = m_CommonInfo.RLTrackCamera.FrameMove(&RLCameraParam, fDeltaTime);
    KGLOG_COM_PROCESS_ERROR(hr);

    m_CommonInfo.p3DCamera->SetLookAtPosition(RLCameraParam.vLookAt);
    m_CommonInfo.p3DCamera->SetUpDirection(RLCameraParam.vUp);
    m_CommonInfo.p3DCamera->SetPosition(RLCameraParam.vPosition);
    m_CommonInfo.p3DScene->SetFocus(RLCameraParam.vTarget);

    hr = m_pCamera->PostUpdate(RLCameraParam);
    KGLOG_COM_PROCESS_ERROR(hr);

Exit1:
    nResult = true;
Exit0:

    if (g_pRL->m_CurrentTraceOption.bTraceCamera)
    {
        static D3DXVECTOR3 s_vPosition;

        if (s_vPosition != RLCameraParam.vPosition)
        {
            D3DXVECTOR3 vDelta = RLCameraParam.vPosition - s_vPosition;
            s_vPosition = RLCameraParam.vPosition;

            float fDelta = (float)(fTime - fTimeLast);

            if (fDelta > 0.1f)
            {
                D3DXVECTOR3 vSpeed = vDelta / fDelta;

                float fDeltaLength = D3DXVec3Length(&vDelta);
                float fSpeedLength = D3DXVec3Length(&vSpeed);

                printf("[RL] camera %d, [%.4f,%.4f,%.4f][%.4f,%.4f,%.4f](%.4f)\n",
                    dwGameLoop,
                    vDelta.x, vDelta.y, vDelta.z,
                    vSpeed.x, vSpeed.y, vSpeed.z, fSpeedLength);
            }
            else
            {
                printf("[RL] camera error\n");
            }
        }
    }

    if (g_pRL->m_CurrentTraceOption.bTraceTarget)
    {
        static D3DXVECTOR3 s_vTarget;

        if (s_vTarget != RLCameraParam.vTarget)
        {
            D3DXVECTOR3 vDelta = RLCameraParam.vTarget - s_vTarget;
            s_vTarget = RLCameraParam.vTarget;

            float fDelta = (float)(fTime - fTimeLast);

            D3DXVECTOR3 vSpeed = vDelta / fDelta;

            float fDeltaLength = D3DXVec3Length(&vDelta);
            float fSpeedLength = D3DXVec3Length(&vSpeed);

            printf("[RL] target %d, [%.4f,%.4f,%.4f][%.4f,%.4f,%.4f](%.4f)\n",
                dwGameLoop,
                vDelta.x, vDelta.y, vDelta.z,
                vSpeed.x, vSpeed.y, vSpeed.z, fSpeedLength);
        }
    }

    if (g_pRL->m_TraceOption.bTraceFrameInterval)
    {
        static float s_fDeltaTime = 0.0f;

        if (fDeltaTime > 25.0f)
        {
            s_fDeltaTime = fDeltaTime;

            printf("[RL] %d %d %.4f\n", dwGameLoop, bFrame, fDeltaTime);
        }
    }

    StopProfile(&g_pRL->m_Profile, KRLPROFILE_CAMERA);
    return nResult;
}