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; }
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; }
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; }
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)); } } }
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; }