diff --git a/core/e2dmodule.h b/core/e2dmodule.h index eecec8df..a8127dff 100644 --- a/core/e2dmodule.h +++ b/core/e2dmodule.h @@ -73,6 +73,9 @@ namespace e2d // 获取 Round 样式的 ID2D1StrokeStyle ID2D1StrokeStyle * GetRoundStrokeStyle(); + // 获取 DPI + static float GetDpi(); + protected: D2D1_COLOR_F clear_color_; ID2D1Factory* factory_; @@ -298,6 +301,9 @@ namespace e2d int height ); + // 进入下一场景 + void EnterNextScene(); + // Win32 窗口消息回调程序 static LRESULT CALLBACK WndProc( HWND hwnd, diff --git a/core/e2dobject.h b/core/e2dobject.h index 42b7f224..eb8a8df2 100644 --- a/core/e2dobject.h +++ b/core/e2dobject.h @@ -270,6 +270,7 @@ namespace e2d class Node : public Ref { + friend class Game; friend class Scene; public: @@ -281,6 +282,12 @@ namespace e2d virtual ~Node(); + // 渲染节点 + virtual void Draw() const {} + + // 更新节点 + virtual void Update(float dt) {} + // 获取节点显示状态 bool IsVisible() const; @@ -624,17 +631,19 @@ namespace e2d // 获取所有任务 const Tasks& GetAllTasks() const; - // 渲染节点 - virtual void Draw() const {} + protected: + E2D_DISABLE_COPY(Node); - // 更新节点 - virtual void Update(float dt) {} + // 遍历节点 + virtual void Visit(); // 渲染节点边缘 void DrawBorder(); - // 更新子节点 - void UpdateChildren(float dt); + // 设置节点所在场景 + void SetParentScene( + Scene * scene + ); // 分发鼠标消息 virtual bool Dispatch( @@ -648,16 +657,8 @@ namespace e2d bool handled ); - protected: - E2D_DISABLE_COPY(Node); - - // 遍历节点 - virtual void Visit(); - - // 设置节点所在场景 - void SetParentScene( - Scene * scene - ); + // 更新子节点 + void UpdateChildren(float dt); // 更新转换矩阵 void UpdateTransform(); diff --git a/core/events/MouseEvent.cpp b/core/events/MouseEvent.cpp index 8189626b..eda078cd 100644 --- a/core/events/MouseEvent.cpp +++ b/core/events/MouseEvent.cpp @@ -30,29 +30,22 @@ e2d::MouseEvent::MouseEvent(UINT message, WPARAM w_param, LPARAM l_param) float e2d::MouseEvent::GetX() const { - HDC hdc = ::GetDC(0); - int dpi_x = ::GetDeviceCaps(hdc, LOGPIXELSX); - ::ReleaseDC(0, hdc); - return ((float)(short)LOWORD(l_param_)) * 96.f / dpi_x; + float dpi = Graphics::GetDpi(); + return ((float)(short)LOWORD(l_param_)) * 96.f / dpi; } float e2d::MouseEvent::GetY() const { - HDC hdc = ::GetDC(0); - int dpi_y = ::GetDeviceCaps(hdc, LOGPIXELSY); - ::ReleaseDC(0, hdc); - return ((float)(short)HIWORD(l_param_)) * 96.f / dpi_y; + float dpi = Graphics::GetDpi(); + return ((float)(short)HIWORD(l_param_)) * 96.f / dpi; } e2d::Point e2d::MouseEvent::GetPosition() const { - HDC hdc = ::GetDC(0); - int dpi_x = ::GetDeviceCaps(hdc, LOGPIXELSX); - int dpi_y = ::GetDeviceCaps(hdc, LOGPIXELSY); - ::ReleaseDC(0, hdc); + float dpi = Graphics::GetDpi(); return Point( - ((float)(short)LOWORD(l_param_)) * 96.f / dpi_x, - ((float)(short)HIWORD(l_param_)) * 96.f / dpi_y + ((float)(short)LOWORD(l_param_)) * 96.f / dpi, + ((float)(short)HIWORD(l_param_)) * 96.f / dpi ); } diff --git a/core/modules/Game.cpp b/core/modules/Game.cpp index c6a83835..42f8ffcc 100644 --- a/core/modules/Game.cpp +++ b/core/modules/Game.cpp @@ -32,6 +32,11 @@ static e2d::Game * instance = nullptr; +e2d::Game * e2d::Game::GetInstance() +{ + return instance; +} + e2d::Game::Game() : hwnd_(nullptr) , quit_(true) @@ -88,9 +93,9 @@ void e2d::Game::Run(const Options& options) Start(); // 刷新场景 + EnterNextScene(); ::ShowWindow(hwnd_, SW_SHOWNORMAL); ::UpdateWindow(hwnd_); - UpdateScene(0); // 运行 const int min_interval = 5; @@ -211,19 +216,7 @@ void e2d::Game::UpdateScene(float dt) } } - if (next_scene_) - { - if (curr_scene_) - { - curr_scene_->OnExit(); - curr_scene_->Release(); - } - - next_scene_->OnEnter(); - - curr_scene_ = next_scene_; - next_scene_ = nullptr; - } + EnterNextScene(); } void e2d::Game::DrawScene() @@ -260,11 +253,6 @@ void e2d::Game::DrawScene() graphics->EndDraw(); } -e2d::Game * e2d::Game::GetInstance() -{ - return instance; -} - void e2d::Game::Init() { WNDCLASSEX wcex = { 0 }; @@ -369,11 +357,8 @@ e2d::Rect e2d::Game::Locate(int width, int height) int max_width = ::GetSystemMetrics(SM_CXSCREEN); int max_height = ::GetSystemMetrics(SM_CYSCREEN); - HDC hdc = ::GetDC(0); - int dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); - int dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); - ::ReleaseDC(0, hdc); - RECT rect = { 0, 0, LONG(ceil(width * dpi_x / 96.f)), LONG(ceil(height * dpi_y / 96.f)) }; + float dpi = Graphics::GetDpi(); + RECT rect = { 0, 0, LONG(ceil(width * dpi / 96.f)), LONG(ceil(height * dpi / 96.f)) }; // 计算合适的窗口大小 ::AdjustWindowRectEx(&rect, WINDOW_STYLE, FALSE, NULL); @@ -394,6 +379,23 @@ e2d::Rect e2d::Game::Locate(int width, int height) return std::move(client_rect); } +void e2d::Game::EnterNextScene() +{ + if (next_scene_) + { + if (curr_scene_) + { + curr_scene_->OnExit(); + curr_scene_->Release(); + } + + next_scene_->OnEnter(); + + curr_scene_ = next_scene_; + next_scene_ = nullptr; + } +} + int e2d::Game::GetWidth() const { return width_; @@ -556,12 +558,9 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param) if (w_param == SIZE_RESTORED) { - HDC hdc = ::GetDC(0); - int dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); - int dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); - ::ReleaseDC(0, hdc); - game->width_ = static_cast(width * 96.f / dpi_x); - game->height_ = static_cast(height * 96.f / dpi_y); + float dpi = Graphics::GetDpi(); + game->width_ = static_cast(width * 96.f / dpi); + game->height_ = static_cast(height * 96.f / dpi); } // 如果程序接收到一个 WM_SIZE 消息,这个方法将调整渲染 @@ -570,7 +569,7 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param) auto render_target = Device::GetGraphics()->GetRenderTarget(); if (render_target) { - render_target->Resize(D2D1::SizeU(game->width_, game->height_)); + render_target->Resize(D2D1::SizeU(width, height)); } } break; diff --git a/core/modules/Graphics.cpp b/core/modules/Graphics.cpp index fb392192..6def70e7 100644 --- a/core/modules/Graphics.cpp +++ b/core/modules/Graphics.cpp @@ -311,3 +311,11 @@ ID2D1StrokeStyle * e2d::Graphics::GetRoundStrokeStyle() } return round_stroke_style_; } + +float e2d::Graphics::GetDpi() +{ + HDC hdc = ::GetDC(0); + int dpi = ::GetDeviceCaps(hdc, LOGPIXELSX); + ::ReleaseDC(0, hdc); + return static_cast(dpi); +} diff --git a/core/modules/Input.cpp b/core/modules/Input.cpp index 6c2ace4e..91cede2d 100644 --- a/core/modules/Input.cpp +++ b/core/modules/Input.cpp @@ -147,15 +147,11 @@ float e2d::Input::GetMouseY() e2d::Point e2d::Input::GetMousePos() { - HDC hdc = ::GetDC(0); - int dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); - int dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); - ::ReleaseDC(0, hdc); - POINT mousePos; ::GetCursorPos(&mousePos); ::ScreenToClient(Game::GetInstance()->GetHWnd(), &mousePos); - return Point(mousePos.x * 96.f / dpi_x, mousePos.y * 96.f / dpi_y); + float dpi = Graphics::GetDpi(); + return Point(mousePos.x * 96.f / dpi, mousePos.y * 96.f / dpi); } float e2d::Input::GetMouseDeltaX()