From 86bb0e4239215eeb0f809516981f3d888b90fa9c Mon Sep 17 00:00:00 2001 From: Nomango Date: Wed, 20 May 2020 00:55:51 +0800 Subject: [PATCH] use application scoped timer --- src/kiwano/platform/Application.cpp | 10 ++++------ src/kiwano/platform/Application.h | 25 ++++++++++++------------ src/kiwano/platform/win32/WindowImpl.cpp | 14 ++++++++++++- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/kiwano/platform/Application.cpp b/src/kiwano/platform/Application.cpp index 3c17a16f..5222fe11 100644 --- a/src/kiwano/platform/Application.cpp +++ b/src/kiwano/platform/Application.cpp @@ -68,15 +68,13 @@ void Application::Run(RunnerPtr runner, bool debug) // Everything is ready runner->OnReady(); - running_ = true; - last_update_time_ = Time::Now(); + running_ = true; + timer_ = Timer::Create(); while (running_) { - const Time now = Time::Now(); - const Duration dt = (now - last_update_time_); - last_update_time_ = now; + timer_->Tick(); - if (!runner->MainLoop(dt)) + if (!runner->MainLoop(timer_->GetDeltaTime())) running_ = false; } diff --git a/src/kiwano/platform/Application.h b/src/kiwano/platform/Application.h index e64d3e5a..6fe77c3c 100644 --- a/src/kiwano/platform/Application.h +++ b/src/kiwano/platform/Application.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -77,6 +78,12 @@ public: */ WindowPtr GetMainWindow() const; + /** + * \~chinese + * @brief 获取计时器 + */ + TimerPtr GetTimer() const; + /** * \~chinese * @brief 是否正在运行 @@ -142,17 +149,11 @@ public: */ void Destroy(); - /** - * \~chinese - * @brief 获取上一次更新时间 - */ - Time GetLastUpdateTime() const; - private: bool running_; float time_scale_; RunnerPtr runner_; - Time last_update_time_; + TimerPtr timer_; List modules_; std::mutex perform_mutex_; Queue> functions_to_perform_; @@ -169,14 +170,14 @@ inline WindowPtr Application::GetMainWindow() const return runner_->GetMainWindow(); } +inline TimerPtr Application::GetTimer() const +{ + return timer_; +} + inline bool Application::IsRunning() const { return running_; } -inline Time Application::GetLastUpdateTime() const -{ - return last_update_time_; -} - } // namespace kiwano diff --git a/src/kiwano/platform/win32/WindowImpl.cpp b/src/kiwano/platform/win32/WindowImpl.cpp index 3c8f5322..38da0b70 100644 --- a/src/kiwano/platform/win32/WindowImpl.cpp +++ b/src/kiwano/platform/win32/WindowImpl.cpp @@ -502,9 +502,21 @@ LRESULT WindowWin32Impl::MessageProc(HWND hwnd, UINT32 msg, WPARAM wparam, LPARA case WM_ACTIVATE: { + bool active = (LOWORD(wparam) != WA_INACTIVE); + WindowFocusChangedEventPtr evt = new WindowFocusChangedEvent; - evt->focus = (LOWORD(wparam) != WA_INACTIVE); + evt->focus = active; this->PushEvent(evt); + + // Pause game when window is inactive + TimerPtr timer = Application::GetInstance().GetTimer(); + if (timer) + { + if (active) + timer->Resume(); + else + timer->Pause(); + } } break;