From ba99ca38c11ff55ecbedc49ed5bfd75028ee8379 Mon Sep 17 00:00:00 2001 From: Nomango <569629550@qq.com> Date: Wed, 3 Oct 2018 18:04:04 +0800 Subject: [PATCH] refactoring --- core/actions/Action.cpp | 1 - core/actions/JumpBy.cpp | 4 +- core/actions/Loop.cpp | 1 - core/actions/MoveBy.cpp | 4 +- core/components/Button.cpp | 17 +- core/e2daction.h | 2 +- core/e2devent.h | 2 +- core/e2dimpl.h | 8 +- core/e2dmacros.h | 1 + core/e2dmanager.h | 75 ------ core/e2dmodule.h | 294 +++++++++-------------- core/e2dobject.h | 216 ++--------------- core/e2dtool.h | 107 --------- core/e2dtransition.h | 18 +- core/e2dutil.h | 17 +- core/easy2d.h | 1 - core/events/Collision.cpp | 27 --- core/events/MouseEvent.cpp | 20 +- core/impl/TextRenderer.cpp | 38 +-- core/managers/CollisionManager.cpp | 126 ---------- core/modules/Audio.cpp | 19 +- core/modules/Device.cpp | 48 ++++ core/modules/GC.cpp | 21 -- core/modules/Game.cpp | 217 ++++++++++------- core/modules/Graphics.cpp | 301 ++++++++++-------------- core/modules/Input.cpp | 55 ++--- core/modules/Window.cpp | 113 --------- core/objects/Canvas.cpp | 8 +- core/objects/Collider.cpp | 201 ---------------- core/objects/Image.cpp | 26 +- core/objects/Node.cpp | 73 +----- core/objects/Sprite.cpp | 4 +- core/objects/Text.cpp | 8 +- core/tools/File.cpp | 14 +- core/tools/Music.cpp | 14 +- core/tools/Path.cpp | 4 +- core/tools/Player.cpp | 230 ------------------ core/transitions/BoxTransition.cpp | 4 +- core/transitions/EmergeTransition.cpp | 4 +- core/transitions/FadeTransition.cpp | 4 +- core/transitions/MoveTransition.cpp | 4 +- core/transitions/RotationTransition.cpp | 4 +- core/transitions/Transition.cpp | 8 +- project/vs2012/Easy2D.vcxproj | 10 +- project/vs2012/Easy2D.vcxproj.filters | 31 +-- project/vs2013/Easy2D.vcxproj | 10 +- project/vs2013/Easy2D.vcxproj.filters | 31 +-- project/vs2017/Easy2D.vcxproj | 8 +- project/vs2017/Easy2D.vcxproj.filters | 25 +- 49 files changed, 619 insertions(+), 1859 deletions(-) delete mode 100644 core/e2dmanager.h delete mode 100644 core/events/Collision.cpp delete mode 100644 core/managers/CollisionManager.cpp create mode 100644 core/modules/Device.cpp delete mode 100644 core/modules/GC.cpp delete mode 100644 core/modules/Window.cpp delete mode 100644 core/objects/Collider.cpp delete mode 100644 core/tools/Player.cpp diff --git a/core/actions/Action.cpp b/core/actions/Action.cpp index 5f46f2a6..9e10b8ef 100644 --- a/core/actions/Action.cpp +++ b/core/actions/Action.cpp @@ -1,5 +1,4 @@ #include "..\e2daction.h" -#include "..\e2dmanager.h" e2d::Action::Action() : running_(false) diff --git a/core/actions/JumpBy.cpp b/core/actions/JumpBy.cpp index fc52ba80..91ab95f8 100644 --- a/core/actions/JumpBy.cpp +++ b/core/actions/JumpBy.cpp @@ -25,7 +25,7 @@ void e2d::JumpBy::Init() if (target_) { - prev_pos_ = start_pos_ = target_->GetPos(); + prev_pos_ = start_pos_ = target_->GetPosition(); } } @@ -40,7 +40,7 @@ void e2d::JumpBy::Update() float y = height_ * 4 * frac * (1 - frac); y += delta_pos_.y * delta_; - Point currentPos = target_->GetPos(); + Point currentPos = target_->GetPosition(); Point diff = currentPos - prev_pos_; start_pos_ = diff + start_pos_; diff --git a/core/actions/Loop.cpp b/core/actions/Loop.cpp index 9a2b80ef..5457bf6b 100644 --- a/core/actions/Loop.cpp +++ b/core/actions/Loop.cpp @@ -1,5 +1,4 @@ #include "..\e2daction.h" -#include "..\e2dmanager.h" e2d::Loop::Loop(Action * action, int times /* = -1 */) : action_(action) diff --git a/core/actions/MoveBy.cpp b/core/actions/MoveBy.cpp index 007ed56b..7a5caf57 100644 --- a/core/actions/MoveBy.cpp +++ b/core/actions/MoveBy.cpp @@ -14,7 +14,7 @@ void e2d::MoveBy::Init() if (target_) { - prev_pos_ = start_pos_ = target_->GetPos(); + prev_pos_ = start_pos_ = target_->GetPosition(); } } @@ -24,7 +24,7 @@ void e2d::MoveBy::Update() if (target_) { - Point currentPos = target_->GetPos(); + Point currentPos = target_->GetPosition(); Point diff = currentPos - prev_pos_; start_pos_ = start_pos_ + diff; diff --git a/core/components/Button.cpp b/core/components/Button.cpp index e7d2a316..01aca27e 100644 --- a/core/components/Button.cpp +++ b/core/components/Button.cpp @@ -1,5 +1,4 @@ #include "..\e2dcomponent.h" -#include "..\e2dmanager.h" #include "..\e2dmodule.h" #define SAFE_SET(pointer, func, ...) if (pointer) { pointer->##func(__VA_ARGS__); } @@ -148,7 +147,7 @@ bool e2d::Button::Dispatch(const MouseEvent & e, bool handled) { if (!handled && enabled_ && visible_ && normal_) { - bool contains = normal_->ContainsPoint(e.GetPos()); + bool contains = normal_->ContainsPoint(e.GetPosition()); if (e.GetType() == MouseEvent::Type::LeftUp && is_selected_ && contains) { if (callback_) @@ -200,13 +199,21 @@ void e2d::Button::Visit() if (visible_ && !enabled_ && normal_ && - normal_->ContainsPoint(Input::GetInstance()->GetMousePos())) + normal_->ContainsPoint(Device::GetInput()->GetMousePos())) { - Window::GetInstance()->SetCursor(Window::Cursor::No); + HCURSOR hcursor = ::LoadCursor(nullptr, IDC_NO); + if (hcursor) + { + ::SetCursor(hcursor); + } } else if (status_ == Status::Mouseover || status_ == Status::Selected) { - Window::GetInstance()->SetCursor(Window::Cursor::Hand); + HCURSOR hcursor = ::LoadCursor(nullptr, IDC_HAND); + if (hcursor) + { + ::SetCursor(hcursor); + } } } diff --git a/core/e2daction.h b/core/e2daction.h index 82dd1326..bb84b4ec 100644 --- a/core/e2daction.h +++ b/core/e2daction.h @@ -1,6 +1,6 @@ #pragma once #include "e2dutil.h" -#include "e2dmodule.h" +#include "e2dobject.h" namespace e2d { diff --git a/core/e2devent.h b/core/e2devent.h index b2fc3033..4fb80216 100644 --- a/core/e2devent.h +++ b/core/e2devent.h @@ -73,7 +73,7 @@ namespace e2d float GetY() const; // 获取鼠标坐标 - Point GetPos() const; + Point GetPosition() const; // 获取事件类型 MouseEvent::Type GetType() const; diff --git a/core/e2dimpl.h b/core/e2dimpl.h index 7dccba16..47c747dc 100644 --- a/core/e2dimpl.h +++ b/core/e2dimpl.h @@ -41,17 +41,17 @@ namespace e2d // 文字渲染器 - class E2DTextRenderer + class E2DTextRender : public IDWriteTextRenderer { private: - E2DTextRenderer(); + E2DTextRender(); - ~E2DTextRenderer(); + ~E2DTextRender(); public: static HRESULT Create( - E2DTextRenderer** ppTextRenderer, + E2DTextRender** ppTextRenderer, ID2D1Factory* pD2DFactory, ID2D1HwndRenderTarget* pRT, ID2D1SolidColorBrush* pBrush diff --git a/core/e2dmacros.h b/core/e2dmacros.h index 37d7591f..cb808b3b 100644 --- a/core/e2dmacros.h +++ b/core/e2dmacros.h @@ -57,6 +57,7 @@ #pragma comment(lib, "windowscodecs.lib") #pragma comment(lib, "winmm.lib") #pragma comment(lib, "xaudio2.lib") +#pragma comment(lib, "dinput8.lib") #ifndef HINST_THISCOMPONENT diff --git a/core/e2dmanager.h b/core/e2dmanager.h deleted file mode 100644 index 7ffead55..00000000 --- a/core/e2dmanager.h +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once -#include "e2dobject.h" - -namespace e2d -{ - - - // 碰撞体管理器 - class CollisionManager - { - friend class Node; - friend class Collider; - - public: - // 获取碰撞体管理器实例 - static CollisionManager * GetInstance(); - - // 打开或关闭碰撞监听 - // 默认:关闭 - void SetCollisionEnabled( - bool enabled - ); - - // 添加可互相碰撞物体的名称 - void AddName( - const String& name1, - const String& name2 - ); - - // 添加可互相碰撞物体的名称 - void AddName( - const std::vector>& names - ); - - // 判断两个物体是否是可碰撞的 - bool IsCollidable( - Node * node1, - Node * node2 - ); - - // 判断两个物体是否是可碰撞的 - bool IsCollidable( - const String& name1, - const String& name2 - ); - - private: - CollisionManager(); - - ~CollisionManager(); - - E2D_DISABLE_COPY(CollisionManager); - - // 添加碰撞体 - void AddCollider( - Collider* collider - ); - - // 移除碰撞体 - void RemoveCollider( - Collider* collider - ); - - // 更新碰撞体 - void UpdateCollider( - Collider* collider - ); - - private: - bool collision_enabled_; - std::vector colliders_; - std::set> collision_list_; - }; - -} \ No newline at end of file diff --git a/core/e2dmodule.h b/core/e2dmodule.h index 0ba93728..a754b579 100644 --- a/core/e2dmodule.h +++ b/core/e2dmodule.h @@ -7,94 +7,16 @@ namespace e2d { - - // 窗口 - class Window - { - public: - // 鼠标指针样式 - enum class Cursor : int - { - Normal, /* 默认指针样式 */ - Hand, /* 手状指针 */ - No, /* 禁止指针 */ - Wait, /* 沙漏指针 */ - ArrowWait /* 默认指针和小沙漏 */ - }; - - // 弹窗样式 - enum class PopupStyle : int - { - Info, /* 提示 */ - Warning, /* 警告 */ - Error /* 错误 */ - }; - - public: - // 设置鼠标指针样式 - static void SetCursor( - Cursor cursor - ); - - // 打开或隐藏控制台 - static void ShowConsole( - bool enabled - ); - - // 弹出窗口 - // 返回值:当窗口包含取消按钮时,返回值表示用户是否点击确认按钮 - static bool Popup( - const String& text, /* 窗口内容 */ - const String& title, /* 窗口标题 */ - PopupStyle style = PopupStyle::Info,/* 弹窗样式 */ - bool has_cancel = false /* 包含取消按钮 */ - ); - - // 获取屏幕大小 - static Size GetScreenSize(); - }; - - - // 渲染器 + // 图形设备 class Graphics { public: - // 获取渲染器实例 - static Graphics * Get(); - - // 获取 ID2D1Factory 对象 - static ID2D1Factory * GetFactory(); - - // 获取 IWICImagingFactory 对象 - static IWICImagingFactory * GetImagingFactory(); - - // 获取 IDWriteFactory 对象 - static IDWriteFactory * GetWriteFactory(); - - // 获取 Miter 样式的 ID2D1StrokeStyle - static ID2D1StrokeStyle * GetMiterStrokeStyle(); - - // 获取 Bevel 样式的 ID2D1StrokeStyle - static ID2D1StrokeStyle * GetBevelStrokeStyle(); - - // 获取 Round 样式的 ID2D1StrokeStyle - static ID2D1StrokeStyle * GetRoundStrokeStyle(); - - // 获取文字渲染器 - E2DTextRenderer * GetTextRenderer(); - - // 获取 ID2D1HwndRenderTarget 对象 - ID2D1HwndRenderTarget * GetRenderTarget(); - - // 获取 ID2D1SolidColorBrush 对象 - ID2D1SolidColorBrush * GetSolidBrush(); - - // 显示或隐藏 FPS - // 默认:隐藏 - void ShowFps( - bool show + Graphics( + HWND hwnd ); + ~Graphics(); + // 开始渲染 void BeginDraw(); @@ -104,31 +26,46 @@ namespace e2d // 渲染调试信息 void DrawDebugInfo(); - protected: - Graphics(); + // 获取 ID2D1Factory 对象 + ID2D1Factory * GetFactory() const; - ~Graphics(); + // 获取 IWICImagingFactory 对象 + IWICImagingFactory * GetImagingFactory() const; - E2D_DISABLE_COPY(Graphics); + // 获取 IDWriteFactory 对象 + IDWriteFactory * GetWriteFactory() const; + + // 获取 ID2D1HwndRenderTarget 对象 + ID2D1HwndRenderTarget * GetRenderTarget() const; + + // 获取 ID2D1SolidColorBrush 对象 + ID2D1SolidColorBrush * GetSolidBrush() const; + + // 获取文字渲染工具 + E2DTextRender * GetTextRender() const; + + // 获取 Miter 样式的 ID2D1StrokeStyle + ID2D1StrokeStyle * GetMiterStrokeStyle(); + + // 获取 Bevel 样式的 ID2D1StrokeStyle + ID2D1StrokeStyle * GetBevelStrokeStyle(); + + // 获取 Round 样式的 ID2D1StrokeStyle + ID2D1StrokeStyle * GetRoundStrokeStyle(); protected: - bool show_fps_; - int render_times_; - Time last_render_time_; D2D1_COLOR_F clear_color_; - E2DTextRenderer* text_renderer_; + ID2D1Factory* factory_; + IWICImagingFactory* imaging_factory_; + IDWriteFactory* write_factory_; + ID2D1StrokeStyle* miter_stroke_style_; + ID2D1StrokeStyle* bevel_stroke_style_; + ID2D1StrokeStyle* round_stroke_style_; + E2DTextRender* text_renderer_; IDWriteTextFormat* fps_text_format_; IDWriteTextLayout* fps_text_layout_; ID2D1SolidColorBrush* solid_brush_; ID2D1HwndRenderTarget* render_target_; - - static ID2D1Factory* factory_; - static IWICImagingFactory* imaging_factory_; - static IDWriteFactory* write_factory_; - static ID2D1StrokeStyle* miter_stroke_style_; - static ID2D1StrokeStyle* bevel_stroke_style_; - static ID2D1StrokeStyle* round_stroke_style_; - static Graphics * instance_; }; @@ -136,11 +73,11 @@ namespace e2d class Input { public: - // 获取输入设备实例 - static Input * GetInstance(); + Input( + HWND hwnd + ); - // 销毁输入设备实例 - static void DestroyInstance(); + ~Input(); // 检测键盘某按键是否正被按下 bool IsDown( @@ -170,15 +107,8 @@ namespace e2d // 获得鼠标Z轴(鼠标滚轮)坐标增量 float GetMouseDeltaZ(); - // 刷新输入设备状态 - void Update(); - - protected: - Input(); - - ~Input(); - - E2D_DISABLE_COPY(Input); + // 刷新设备状态 + void Flush(); protected: IDirectInput8W * direct_input_; @@ -186,30 +116,28 @@ namespace e2d IDirectInputDevice8W* mouse_device_; DIMOUSESTATE mouse_state_; char key_buffer_[256]; - - static Input * instance_; }; - // 音频设备 class Audio { public: - // 获取音频设备实例 - static Audio * Get(); - - // 获取 XAudio2 实例对象 - IXAudio2 * GetXAudio2() const; - - // 获取 MasteringVoice 实例对象 - IXAudio2MasteringVoice* GetMasteringVoice() const; - - protected: Audio(); - virtual ~Audio(); + ~Audio(); - E2D_DISABLE_COPY(Audio); + // 开启设备 + void Open(); + + // 关闭设备 + void Close(); + + // 创建音源 + HRESULT CreateVoice( + IXAudio2SourceVoice ** voice, + WAVEFORMATEX * wfx, + VoiceCallback * callback + ); protected: IXAudio2 * x_audio2_; @@ -217,22 +145,43 @@ namespace e2d }; - // 选项 - struct Option + // 设备 + class Device { - String title; // 窗口标题 - int width; // 窗口宽度 - int height; // 窗口高度 - int icon; // 窗口图标 - Color background_color; // 背景色 - bool debug_mode; // Debug 模式 + public: + // 获取图形设备 + static Graphics * GetGraphics(); - Option() + // 获取输入设备 + static Input * GetInput(); + + // 获取音频设备 + static Audio * GetAudio(); + + // 初始化 + static void Init( + HWND hwnd + ); + + // 销毁资源 + static void Destroy(); + }; + + + // 启动选项 + struct Options + { + String title; // 标题 + int width; // 宽度 + int height; // 高度 + int icon; // 图标资源 ID + bool debug_mode; // 调试模式 + + Options() : title(L"Easy2D Game") , width(640) , height(480) , icon(0) - , background_color(Color::Black) , debug_mode(false) { } @@ -243,34 +192,17 @@ namespace e2d class Game { public: - static Game * New( - const Option& option + // 开始 + virtual void Start() = 0; + + // 运行 + void Run( + const Options& options = Options() ); - // 获取控制器 - static Game * Get(); - - // 启动游戏 - void Run(); - - // 结束游戏 + // 结束 void Quit(); - // 获取窗体标题 - const String& GetTitle() const; - - // 获取窗体宽度 - int GetWidth() const; - - // 获取窗体高度 - int GetHeight() const; - - // 获取窗体大小 - Size GetSize() const; - - // 获取窗口句柄 - HWND GetHWnd() const; - // 修改窗体大小 void SetSize( int width, /* 窗体宽度 */ @@ -287,6 +219,21 @@ namespace e2d int resource_id /* 图标资源 ID */ ); + // 获取窗体标题 + const String& GetTitle() const; + + // 获取窗体宽度 + int GetWidth() const; + + // 获取窗体高度 + int GetHeight() const; + + // 获取窗体大小 + Size GetSize() const; + + // 获取窗口句柄 + HWND GetHWnd() const; + // 切换场景 void EnterScene( Scene * scene, /* 场景 */ @@ -296,7 +243,7 @@ namespace e2d // 获取当前场景 Scene * GetCurrentScene(); - // 是否正在进行场景动画 + // 是否正在进行场景过渡 bool IsTransitioning() const; // 更新场景内容 @@ -305,13 +252,14 @@ namespace e2d // 渲染场景画面 void DrawScene(); + // 获取实例 + static Game * GetInstance(); + protected: Game(); ~Game(); - E2D_DISABLE_COPY(Game); - // 初始化 void Init(); @@ -329,7 +277,7 @@ namespace e2d LPARAM l_param ); - private: + protected: HWND hwnd_; String title_; int width_; @@ -340,22 +288,6 @@ namespace e2d Scene* curr_scene_; Scene* next_scene_; Transition* transition_; - - static Game * instance_; - }; - - - // 垃圾回收 - class GC - { - private: - GC(); - - ~GC(); - - E2D_DISABLE_COPY(GC); - - static GC instance_; }; } diff --git a/core/e2dobject.h b/core/e2dobject.h index 0c3baeaf..fe0798d3 100644 --- a/core/e2dobject.h +++ b/core/e2dobject.h @@ -80,22 +80,7 @@ namespace e2d const Rect& GetCropRect() const; // 获取 ID2D1Bitmap 对象 - ID2D1Bitmap * GetBitmap(); - - // 设置 Bitmap - void SetBitmap( - ID2D1Bitmap * bitmap - ); - - // 预加载图片资源 - static bool Preload( - const String& file_name - ); - - // 预加载图片资源 - static bool Preload( - const Resource& res - ); + ID2D1Bitmap * GetBitmap() const; // 清空缓存 static void ClearCache(); @@ -103,6 +88,21 @@ namespace e2d protected: E2D_DISABLE_COPY(Image); + // 加载图片资源 + bool Load( + const String& file_name + ); + + // 加载图片资源 + bool Load( + const Resource& res + ); + + // 设置 Bitmap + void SetBitmap( + ID2D1Bitmap * bitmap + ); + protected: Rect crop_rect_; ID2D1Bitmap * bitmap_; @@ -174,132 +174,6 @@ namespace e2d }; - // 碰撞体 - class Collider - { - public: - // 碰撞体形状 - enum class Shape - { - None, /* 无 */ - Rect, /* 矩形 */ - Circle, /* 圆形 */ - Ellipse /* 椭圆形 */ - }; - - // 碰撞体交集关系 - enum class Relation : int - { - Unknown = 0, /* 关系不确定 */ - Disjoin = 1, /* 没有交集 */ - IsContained = 2, /* 完全被包含 */ - Contains = 3, /* 完全包含 */ - Overlap = 4 /* 部分重叠 */ - }; - - public: - explicit Collider( - Node * parent - ); - - virtual ~Collider(); - - // 设置碰撞体形状 - void SetShape( - Shape shape - ); - - // 是否触发碰撞事件 - void SetCollisionNotify( - bool notify - ); - - // 启用或关闭该碰撞体 - void SetEnabled( - bool enabled - ); - - // 设置碰撞体的可见性 - void SetVisible( - bool visible - ); - - // 设置绘制颜色 - void SetBorderColor( - const Color& color - ); - - // 判断两碰撞体的交集关系 - Relation GetRelationWith( - Collider * collider - ) const; - - // 是否启用碰撞体 - bool IsEnabled() const; - - // 是否可见 - bool IsVisible() const; - - // 是否触发碰撞事件 - bool IsCollisionNotify() const; - - // 获取绘制颜色 - const Color& GetBorderColor() const; - - // 获取形状 - Shape GetShape() const; - - // 获取绑定节点 - Node* GetNode() const; - - // 获取 ID2D1Geometry* 对象 - ID2D1Geometry* GetGeometry() const; - - // 重新生成 - void Recreate(); - - // 渲染碰撞体 - void Draw(); - - protected: - E2D_DISABLE_COPY(Collider); - - protected: - bool enabled_; - bool visible_; - bool notify_; - Color border_color_; - Node * parent_node_; - Shape shape_; - ID2D1Geometry* geometry_; - }; - - - // 碰撞事件 - class Collision - { - public: - Collision(); - - explicit Collision( - Node* node, - Collider::Relation relation - ); - - ~Collision(); - - // 获取发生碰撞节点 - Node* GetNode() const; - - // 获取交集关系 - Collider::Relation GetRelation() const; - - protected: - Node * node_; - Collider::Relation relation_; - }; - - // 定时任务 class Task : public Ref @@ -353,24 +227,6 @@ namespace e2d }; - // 绘图接口 - class Drawable - { - public: - // 渲染图形 - virtual void Draw() const = 0; - }; - - - // 更新接口 - class Updatable - { - public: - // 渲染图形 - virtual void Update() = 0; - }; - - // 按键消息处理接口 class KeyEventHandler { @@ -389,15 +245,6 @@ namespace e2d }; - // 碰撞消息处理接口 - class CollisionHandler - { - public: - // 处理碰撞消息 - virtual void Handle(Collision collision) = 0; - }; - - class Action; // 节点 @@ -406,7 +253,6 @@ namespace e2d { friend class Game; friend class Scene; - friend class Collider; public: typedef std::vector Nodes; @@ -429,14 +275,8 @@ namespace e2d // 获取节点绘图顺序 int GetOrder() const; - // 获取节点横坐标 - float GetPosX() const; - - // 获取节点纵坐标 - float GetPosY() const; - // 获取节点坐标 - const Point& GetPos() const; + const Point& GetPosition() const; // 获取节点宽度 float GetWidth() const; @@ -483,9 +323,6 @@ namespace e2d // 获取节点透明度 float GetOpacity() const; - // 获取节点碰撞体 - Collider * GetCollider(); - // 获取父节点 Node * GetParent() const; @@ -769,6 +606,15 @@ namespace e2d // 获取所有任务 const Tasks& GetAllTasks() const; + // 渲染节点 + virtual void Draw() const {} + + // 更新节点 + virtual void Update() {} + + // 渲染节点边缘 + void DrawBorder(); + // 分发鼠标消息 virtual bool Dispatch( const MouseEvent& e, @@ -787,12 +633,6 @@ namespace e2d // 遍历节点 virtual void Visit(); - // 渲染节点边缘 - void DrawBorder(); - - // 渲染碰撞体轮廓 - void DrawCollider(); - // 设置节点所在场景 void SetParentScene( Scene * scene @@ -824,7 +664,6 @@ namespace e2d bool clip_enabled_; bool dirty_sort_; bool dirty_transform_; - Collider collider_; Scene * parent_scene_; Node * parent_; Color border_color_; @@ -840,7 +679,6 @@ namespace e2d // 精灵 class Sprite : public Node - , public Drawable { public: Sprite(); @@ -906,7 +744,6 @@ namespace e2d // 文本 class Text : public Node - , public Drawable { public: // 文本对齐方式 @@ -1124,7 +961,6 @@ namespace e2d // 画布 class Canvas : public Node - , public Drawable { public: Canvas( diff --git a/core/e2dtool.h b/core/e2dtool.h index 0b763d2c..2bd045c6 100644 --- a/core/e2dtool.h +++ b/core/e2dtool.h @@ -144,113 +144,6 @@ namespace e2d }; - // 音乐播放器 - class Player - { - public: - // 获取播放器实例 - static Player * GetInstance(); - - // 销毁实例 - static void DestroyInstance(); - - // 预加载音乐资源 - bool Preload( - const String& file_path /* 音乐文件路径 */ - ); - - // 播放音乐 - bool Play( - const String& file_path, /* 音乐文件路径 */ - int loop_count = 0 /* 重复播放次数,设置 -1 为循环播放 */ - ); - - // 暂停音乐 - void Pause( - const String& file_path /* 音乐文件路径 */ - ); - - // 继续播放音乐 - void Resume( - const String& file_path /* 音乐文件路径 */ - ); - - // 停止音乐 - void Stop( - const String& file_path /* 音乐文件路径 */ - ); - - // 获取音乐播放状态 - bool IsPlaying( - const String& file_path /* 音乐文件路径 */ - ); - - // 预加载音乐资源 - bool Preload( - const Resource& res /* 音乐资源 */ - ); - - // 播放音乐 - bool Play( - const Resource& res, /* 音乐资源 */ - int loop_count = 0 /* 重复播放次数,设置 -1 为循环播放 */ - ); - - // 暂停音乐 - void Pause( - const Resource& res /* 音乐资源 */ - ); - - // 继续播放音乐 - void Resume( - const Resource& res /* 音乐资源 */ - ); - - // 停止音乐 - void Stop( - const Resource& res /* 音乐资源 */ - ); - - // 获取音乐播放状态 - bool IsPlaying( - const Resource& res /* 音乐资源 */ - ); - - // 获取音量 - float GetVolume(); - - // 设置音量 - void SetVolume( - float volume /* 音量范围为 -224 ~ 224,0 是静音,1 是正常音量 */ - ); - - // 暂停所有音乐 - void PauseAll(); - - // 继续播放所有音乐 - void ResumeAll(); - - // 停止所有音乐 - void StopAll(); - - // 清空音乐缓存 - void ClearCache(); - - protected: - Player(); - - ~Player(); - - E2D_DISABLE_COPY(Player); - - protected: - float volume_; - std::map musics_; - - static Player * instance_; - }; - - // 数据管理工具 class Data { diff --git a/core/e2dtransition.h b/core/e2dtransition.h index 9bf74b93..8d41a278 100644 --- a/core/e2dtransition.h +++ b/core/e2dtransition.h @@ -28,7 +28,8 @@ namespace e2d // 初始化场景过渡动画 virtual void Init( Scene * prev, - Scene * next + Scene * next, + Game * game ); // 更新场景过渡动画 @@ -73,7 +74,8 @@ namespace e2d virtual void Init( Scene * prev, - Scene * next + Scene * next, + Game * game ) override; }; @@ -92,7 +94,8 @@ namespace e2d virtual void Init( Scene * prev, - Scene * next + Scene * next, + Game * game ) override; }; @@ -111,7 +114,8 @@ namespace e2d virtual void Init( Scene * prev, - Scene * next + Scene * next, + Game * game ) override; }; @@ -131,7 +135,8 @@ namespace e2d virtual void Init( Scene * prev, - Scene * next + Scene * next, + Game * game ) override; virtual void Reset() override; @@ -158,7 +163,8 @@ namespace e2d virtual void Init( Scene * prev, - Scene * next + Scene * next, + Game * game ) override; virtual void Reset() override; diff --git a/core/e2dutil.h b/core/e2dutil.h index 17f7cafa..c38be7e3 100644 --- a/core/e2dutil.h +++ b/core/e2dutil.h @@ -604,13 +604,6 @@ namespace e2d // 二维转换 class Transform { - public: - Transform(); - - E2D_OP_EXPLICIT operator D2D1::Matrix3x2F() const; - - bool operator== (const Transform& other) const; - public: Point position; // 坐标 Size size; // 大小 @@ -621,6 +614,13 @@ namespace e2d float skew_y; // 纵向倾斜角度 float pivot_x; // 支点横坐标 float pivot_y; // 支点纵坐标 + + public: + Transform(); + + E2D_OP_EXPLICIT operator D2D1::Matrix3x2F() const; + + bool operator== (const Transform& other) const; }; @@ -641,9 +641,6 @@ namespace e2d // 获取引用计数 LONG GetRefCount() const; - protected: - E2D_DISABLE_COPY(Ref); - protected: LONG ref_count_; }; diff --git a/core/easy2d.h b/core/easy2d.h index ba36c34b..c42212d0 100644 --- a/core/easy2d.h +++ b/core/easy2d.h @@ -19,7 +19,6 @@ #include "e2dmacros.h" #include "e2dutil.h" -#include "e2dmanager.h" #include "e2dobject.h" #include "e2dcomponent.h" #include "e2dtool.h" diff --git a/core/events/Collision.cpp b/core/events/Collision.cpp deleted file mode 100644 index f008cb71..00000000 --- a/core/events/Collision.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "..\e2dobject.h" - -e2d::Collision::Collision() - : node_(nullptr) - , relation_(Collider::Relation::Unknown) -{ -} - -e2d::Collision::Collision(Node* node, Collider::Relation relation) - : node_(node) - , relation_(relation) -{ -} - -e2d::Collision::~Collision() -{ -} - -e2d::Node * e2d::Collision::GetNode() const -{ - return node_; -} - -e2d::Collider::Relation e2d::Collision::GetRelation() const -{ - return relation_; -} diff --git a/core/events/MouseEvent.cpp b/core/events/MouseEvent.cpp index 55aa3f4d..ed43d949 100644 --- a/core/events/MouseEvent.cpp +++ b/core/events/MouseEvent.cpp @@ -10,22 +10,26 @@ e2d::MouseEvent::MouseEvent(UINT message, WPARAM w_param, LPARAM l_param) float e2d::MouseEvent::GetX() const { - const float dpi = Window::GetInstance()->GetDpi(); - return ((float)(short)LOWORD(l_param_)) * 96.f / dpi; + HDC hdc = ::GetDC(0); + int dpi_x = ::GetDeviceCaps(hdc, LOGPIXELSX); + return ((float)(short)LOWORD(l_param_)) * 96.f / dpi_x; } float e2d::MouseEvent::GetY() const { - const float dpi = Window::GetInstance()->GetDpi(); - return ((float)(short)HIWORD(l_param_)) * 96.f / dpi; + HDC hdc = ::GetDC(0); + int dpi_y = ::GetDeviceCaps(hdc, LOGPIXELSY); + return ((float)(short)HIWORD(l_param_)) * 96.f / dpi_y; } -e2d::Point e2d::MouseEvent::GetPos() const +e2d::Point e2d::MouseEvent::GetPosition() const { - const float dpi = Window::GetInstance()->GetDpi(); + HDC hdc = ::GetDC(0); + int dpi_x = ::GetDeviceCaps(hdc, LOGPIXELSX); + int dpi_y = ::GetDeviceCaps(hdc, LOGPIXELSY); return Point( - ((float)(short)LOWORD(l_param_)) * 96.f / dpi, - ((float)(short)HIWORD(l_param_)) * 96.f / dpi + ((float)(short)LOWORD(l_param_)) * 96.f / dpi_x, + ((float)(short)HIWORD(l_param_)) * 96.f / dpi_y ); } diff --git a/core/impl/TextRenderer.cpp b/core/impl/TextRenderer.cpp index 09f43cf9..e5dde44a 100644 --- a/core/impl/TextRenderer.cpp +++ b/core/impl/TextRenderer.cpp @@ -3,7 +3,7 @@ using namespace e2d; -E2DTextRenderer::E2DTextRenderer() +E2DTextRender::E2DTextRender() : cRefCount_(0) , pD2DFactory_(nullptr) , pRT_(nullptr) @@ -16,21 +16,21 @@ E2DTextRenderer::E2DTextRenderer() { } -E2DTextRenderer::~E2DTextRenderer() +E2DTextRender::~E2DTextRender() { SafeRelease(pD2DFactory_); SafeRelease(pRT_); SafeRelease(pBrush_); } -HRESULT E2DTextRenderer::Create( - E2DTextRenderer** ppTextRenderer, +HRESULT E2DTextRender::Create( + E2DTextRender** ppTextRenderer, ID2D1Factory* pD2DFactory, ID2D1HwndRenderTarget* pRT, ID2D1SolidColorBrush* pBrush ) { - *ppTextRenderer = new (std::nothrow) E2DTextRenderer(); + *ppTextRenderer = new (std::nothrow) E2DTextRender(); if (*ppTextRenderer) { pD2DFactory->AddRef(); @@ -46,7 +46,7 @@ HRESULT E2DTextRenderer::Create( return E_FAIL; } -STDMETHODIMP_(void) E2DTextRenderer::SetTextStyle( +STDMETHODIMP_(void) E2DTextRender::SetTextStyle( CONST D2D1_COLOR_F &fillColor, BOOL outline, CONST D2D1_COLOR_F &outline_color, @@ -62,13 +62,13 @@ STDMETHODIMP_(void) E2DTextRenderer::SetTextStyle( switch (outlineJoin) { case D2D1_LINE_JOIN_MITER: - pCurrStrokeStyle_ = Graphics::GetMiterStrokeStyle(); + pCurrStrokeStyle_ = Device::GetGraphics()->GetMiterStrokeStyle(); break; case D2D1_LINE_JOIN_BEVEL: - pCurrStrokeStyle_ = Graphics::GetBevelStrokeStyle(); + pCurrStrokeStyle_ = Device::GetGraphics()->GetBevelStrokeStyle(); break; case D2D1_LINE_JOIN_ROUND: - pCurrStrokeStyle_ = Graphics::GetRoundStrokeStyle(); + pCurrStrokeStyle_ = Device::GetGraphics()->GetRoundStrokeStyle(); break; default: pCurrStrokeStyle_ = nullptr; @@ -76,7 +76,7 @@ STDMETHODIMP_(void) E2DTextRenderer::SetTextStyle( } } -STDMETHODIMP E2DTextRenderer::DrawGlyphRun( +STDMETHODIMP E2DTextRender::DrawGlyphRun( __maybenull void* clientDrawingContext, FLOAT baselineOriginX, FLOAT baselineOriginY, @@ -165,7 +165,7 @@ STDMETHODIMP E2DTextRenderer::DrawGlyphRun( return hr; } -STDMETHODIMP E2DTextRenderer::DrawUnderline( +STDMETHODIMP E2DTextRender::DrawUnderline( __maybenull void* clientDrawingContext, FLOAT baselineOriginX, FLOAT baselineOriginY, @@ -232,7 +232,7 @@ STDMETHODIMP E2DTextRenderer::DrawUnderline( return S_OK; } -STDMETHODIMP E2DTextRenderer::DrawStrikethrough( +STDMETHODIMP E2DTextRender::DrawStrikethrough( __maybenull void* clientDrawingContext, FLOAT baselineOriginX, FLOAT baselineOriginY, @@ -299,7 +299,7 @@ STDMETHODIMP E2DTextRenderer::DrawStrikethrough( return S_OK; } -STDMETHODIMP E2DTextRenderer::DrawInlineObject( +STDMETHODIMP E2DTextRender::DrawInlineObject( __maybenull void* clientDrawingContext, FLOAT originX, FLOAT originY, @@ -312,12 +312,12 @@ STDMETHODIMP E2DTextRenderer::DrawInlineObject( return E_NOTIMPL; } -STDMETHODIMP_(unsigned long) E2DTextRenderer::AddRef() +STDMETHODIMP_(unsigned long) E2DTextRender::AddRef() { return InterlockedIncrement(&cRefCount_); } -STDMETHODIMP_(unsigned long) E2DTextRenderer::Release() +STDMETHODIMP_(unsigned long) E2DTextRender::Release() { unsigned long newCount = InterlockedDecrement(&cRefCount_); @@ -330,7 +330,7 @@ STDMETHODIMP_(unsigned long) E2DTextRenderer::Release() return newCount; } -STDMETHODIMP E2DTextRenderer::IsPixelSnappingDisabled( +STDMETHODIMP E2DTextRender::IsPixelSnappingDisabled( __maybenull void* clientDrawingContext, __out BOOL* isDisabled ) @@ -339,7 +339,7 @@ STDMETHODIMP E2DTextRenderer::IsPixelSnappingDisabled( return S_OK; } -STDMETHODIMP E2DTextRenderer::GetCurrentTransform( +STDMETHODIMP E2DTextRender::GetCurrentTransform( __maybenull void* clientDrawingContext, __out DWRITE_MATRIX* transform ) @@ -348,7 +348,7 @@ STDMETHODIMP E2DTextRenderer::GetCurrentTransform( return S_OK; } -STDMETHODIMP E2DTextRenderer::GetPixelsPerDip( +STDMETHODIMP E2DTextRender::GetPixelsPerDip( __maybenull void* clientDrawingContext, __out FLOAT* pixelsPerDip ) @@ -361,7 +361,7 @@ STDMETHODIMP E2DTextRenderer::GetPixelsPerDip( return S_OK; } -STDMETHODIMP E2DTextRenderer::QueryInterface( +STDMETHODIMP E2DTextRender::QueryInterface( IID const& riid, void** ppvObject ) diff --git a/core/managers/CollisionManager.cpp b/core/managers/CollisionManager.cpp deleted file mode 100644 index 0fb01209..00000000 --- a/core/managers/CollisionManager.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include "..\e2dmanager.h" -#include "..\e2dobject.h" -#include "..\e2dtool.h" -#include "..\e2dmodule.h" - - -e2d::CollisionManager * e2d::CollisionManager::GetInstance() -{ - static CollisionManager instance; - return &instance; -} - -e2d::CollisionManager::CollisionManager() - : collision_enabled_(false) -{ -} - -e2d::CollisionManager::~CollisionManager() -{ -} - -void e2d::CollisionManager::AddCollider(Collider * collider) -{ - colliders_.push_back(collider); -} - -void e2d::CollisionManager::RemoveCollider(Collider * collider) -{ - auto iter = std::find(colliders_.begin(), colliders_.end(), collider); - if (iter != colliders_.end()) - { - colliders_.erase(iter); - } -} - -void e2d::CollisionManager::UpdateCollider(Collider* active) -{ - if (!collision_enabled_ || - Game::Get()->IsTransitioning()) - return; - - auto currScene = Game::Get()->GetCurrentScene(); - if (active->GetNode()->GetParentScene() != currScene) - return; - - std::vector currColliders; - currColliders.reserve(colliders_.size()); - std::copy_if( - colliders_.begin(), - colliders_.end(), - std::back_inserter(currColliders), - [this, active, currScene](Collider* passive) -> bool - { - return active != passive && - passive->GetNode()->IsVisible() && - passive->GetNode()->GetParentScene() == currScene && - this->IsCollidable(active->GetNode(), passive->GetNode()); - } - ); - - for (const auto& passive : currColliders) - { - // 判断两碰撞体交集情况 - Collider::Relation relation = active->GetRelationWith(passive); - // 忽略 UNKNOWN 和 DISJOIN 情况 - if (relation != Collider::Relation::Unknown && - relation != Collider::Relation::Disjoin) - { - auto activeNode = active->GetNode(); - auto passiveNode = passive->GetNode(); - // 触发两次碰撞事件 - Collision activeCollision(passiveNode, relation); - if (dynamic_cast(activeNode)) - dynamic_cast(activeNode)->Handle(activeCollision); - - Collision passiveCollision(activeNode, passive->GetRelationWith(active)); - if (dynamic_cast(passiveNode)) - dynamic_cast(passiveNode)->Handle(passiveCollision); - } - } -} - -void e2d::CollisionManager::SetCollisionEnabled(bool enabled) -{ - collision_enabled_ = enabled; -} - -void e2d::CollisionManager::AddName(const String & name1, const String & name2) -{ - if (!name1.IsEmpty() && !name2.IsEmpty()) - { - collision_list_.insert(std::make_pair(name1.GetHash(), name2.GetHash())); - } -} - -void e2d::CollisionManager::AddName(const std::vector >& names) -{ - for (const auto& name : names) - { - if (!name.first.IsEmpty() && !name.second.IsEmpty()) - { - collision_list_.insert(std::make_pair(name.first.GetHash(), name.second.GetHash())); - } - } -} - -bool e2d::CollisionManager::IsCollidable(Node * node1, Node * node2) -{ - return CollisionManager::IsCollidable(node1->GetName(), node2->GetName()); -} - -bool e2d::CollisionManager::IsCollidable(const String & name1, const String & name2) -{ - size_t hashName1 = name1.GetHash(), - hashName2 = name2.GetHash(); - auto pair1 = std::make_pair(hashName1, hashName2), - pair2 = std::make_pair(hashName2, hashName1); - for (const auto& pair : collision_list_) - { - if (pair == pair1 || pair == pair2) - { - return true; - } - } - return false; -} diff --git a/core/modules/Audio.cpp b/core/modules/Audio.cpp index af9271a4..630d30d2 100644 --- a/core/modules/Audio.cpp +++ b/core/modules/Audio.cpp @@ -1,12 +1,6 @@ #include "..\e2dmodule.h" -e2d::Audio * e2d::Audio::Get() -{ - static Audio audio; - return &audio; -} - e2d::Audio::Audio() : x_audio2_(nullptr) , mastering_voice_(nullptr) @@ -35,12 +29,17 @@ e2d::Audio::~Audio() ::CoUninitialize(); } -IXAudio2 * e2d::Audio::GetXAudio2() const +HRESULT e2d::Audio::CreateVoice(IXAudio2SourceVoice ** voice, WAVEFORMATEX * wfx, VoiceCallback * callback) { - return x_audio2_; + return x_audio2_->CreateSourceVoice(voice, wfx, 0, XAUDIO2_DEFAULT_FREQ_RATIO, callback);; } -IXAudio2MasteringVoice * e2d::Audio::GetMasteringVoice() const +void e2d::Audio::Open() { - return mastering_voice_; + x_audio2_->StartEngine(); +} + +void e2d::Audio::Close() +{ + x_audio2_->StopEngine(); } diff --git a/core/modules/Device.cpp b/core/modules/Device.cpp new file mode 100644 index 00000000..3c93abab --- /dev/null +++ b/core/modules/Device.cpp @@ -0,0 +1,48 @@ +#include "..\e2dmodule.h" + +static e2d::Graphics * graphics_device = nullptr; +static e2d::Input * input_device = nullptr; +static e2d::Audio * audio_device = nullptr; + +e2d::Graphics * e2d::Device::GetGraphics() +{ + return graphics_device; +} + +e2d::Input * e2d::Device::GetInput() +{ + return input_device; +} + +e2d::Audio * e2d::Device::GetAudio() +{ + return audio_device; +} + +void e2d::Device::Init(HWND hwnd) +{ + graphics_device = new (std::nothrow) Graphics(hwnd); + input_device = new (std::nothrow) Input(hwnd); + audio_device = new (std::nothrow) Audio(); +} + +void e2d::Device::Destroy() +{ + if (audio_device) + { + delete audio_device; + audio_device = nullptr; + } + + if (input_device) + { + delete input_device; + input_device = nullptr; + } + + if (graphics_device) + { + delete graphics_device; + graphics_device = nullptr; + } +} diff --git a/core/modules/GC.cpp b/core/modules/GC.cpp deleted file mode 100644 index e0071658..00000000 --- a/core/modules/GC.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "..\e2dmodule.h" -#include "..\e2dtool.h" - - -e2d::GC e2d::GC::instance_; - -e2d::GC::GC() -{ -} - -e2d::GC::~GC() -{ - Image::ClearCache(); - - Player::DestroyInstance(); - Audio::DestroyInstance(); - Graphics::DestroyInstance(); - Input::DestroyInstance(); - Window::DestroyInstance(); - Game::DestroyInstance(); -} diff --git a/core/modules/Game.cpp b/core/modules/Game.cpp index 2b4ae3f1..e601cb48 100644 --- a/core/modules/Game.cpp +++ b/core/modules/Game.cpp @@ -1,7 +1,7 @@ #include "..\e2dmodule.h" #include "..\e2dobject.h" +#include "..\e2dtool.h" #include "..\e2dtransition.h" -#include "..\e2dmanager.h" #include #include #pragma comment (lib ,"imm32.lib") @@ -10,7 +10,7 @@ #define REGISTER_CLASS L"Easy2DApp" -e2d::Game * e2d::Game::instance_ = nullptr; +static e2d::Game * instance = nullptr; e2d::Game::Game() : hwnd_(nullptr) @@ -18,7 +18,18 @@ e2d::Game::Game() , curr_scene_(nullptr) , next_scene_(nullptr) , transition_(nullptr) + , title_(L"Easy2D Game") + , width_(640) + , height_(480) + , icon_(0) + , debug_mode_(false) { + if (instance) + { + throw RuntimeException("同时只能存在一个游戏实例"); + } + instance = this; + ::CoInitialize(nullptr); } @@ -28,48 +39,42 @@ e2d::Game::~Game() SafeRelease(curr_scene_); SafeRelease(next_scene_); + Image::ClearCache(); + Device::Destroy(); + if (hwnd_) { ::DestroyWindow(hwnd_); } + instance = nullptr; + ::CoUninitialize(); } -e2d::Game * e2d::Game::New(const Option & option) +void e2d::Game::Run(const Options& options) { - static Game game; - game.title_ = option.title; - game.width_ = option.width; - game.height_ = option.height; - game.icon_ = option.icon; - game.debug_mode_ = option.debug_mode; + title_ = options.title; + width_ = options.width; + height_ = options.height; + icon_ = options.icon; + debug_mode_ = options.debug_mode; - game.Init(); + // 初始化 + Init(); - instance_ = &game; - return instance_; -} + // 开始 + Start(); -e2d::Game * e2d::Game::Get() -{ - return instance_; -} - -void e2d::Game::Run() -{ - quit_ = false; - - auto input = Input::GetInstance(); - auto graphics = Graphics::Get(); - - const int min_interval = 5; - Time last = Time::Now(); - MSG msg = { 0 }; - + // 刷新场景 ::ShowWindow(hwnd_, SW_SHOWNORMAL); ::UpdateWindow(hwnd_); UpdateScene(); + + // 运行 + const int min_interval = 5; + Time last = Time::Now(); + MSG msg = { 0 }; while (!quit_) { @@ -79,7 +84,7 @@ void e2d::Game::Run() if (dur.Milliseconds() > min_interval) { last = now; - input->Update(); + Device::GetInput()->Flush(); UpdateScene(); DrawScene(); @@ -140,7 +145,7 @@ void e2d::Game::EnterScene(Scene * scene, Transition * transition) transition_ = transition; transition_->Retain(); - transition_->Init(curr_scene_, next_scene_); + transition_->Init(curr_scene_, next_scene_, this); } } @@ -188,7 +193,7 @@ void e2d::Game::UpdateScene() void e2d::Game::DrawScene() { - auto graphics = Graphics::Get(); + auto graphics = Device::GetGraphics(); graphics->BeginDraw(); if (transition_) @@ -200,27 +205,31 @@ void e2d::Game::DrawScene() curr_scene_->Draw(); } - // TODO @Nomango if debug_mode_ - /* - { - graphics->GetRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); - graphics->GetSolidBrush()->SetOpacity(1.f); - root_->DrawBorder(); - } - - { - graphics->GetRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); - root_->DrawCollider(); - } - */ - if (debug_mode_) { + if (curr_scene_ && curr_scene_->GetRoot()) + { + graphics->GetRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); + graphics->GetSolidBrush()->SetOpacity(1.f); + curr_scene_->GetRoot()->DrawBorder(); + } + if (next_scene_ && next_scene_->GetRoot()) + { + graphics->GetRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); + graphics->GetSolidBrush()->SetOpacity(1.f); + next_scene_->GetRoot()->DrawBorder(); + } + graphics->DrawDebugInfo(); } graphics->EndDraw(); } +e2d::Game * e2d::Game::GetInstance() +{ + return instance; +} + void e2d::Game::Init() { WNDCLASSEX wcex = { 0 }; @@ -270,23 +279,54 @@ void e2d::Game::Init() this ); - if (hwnd_) + if (hwnd_ == nullptr) { - // 禁用输入法 - ::ImmAssociateContext(hwnd_, nullptr); - // 禁用控制台关闭按钮 - HWND console_hwnd = ::GetConsoleWindow(); - if (console_hwnd) + ::UnregisterClass(REGISTER_CLASS, HINST_THISCOMPONENT); + throw RuntimeException("Create window failed"); + return; + } + + // 初始化设备 + Device::Init(hwnd_); + + // 禁用输入法 + ::ImmAssociateContext(hwnd_, nullptr); + + // 若开启了调试模式,打开控制台 + HWND console = ::GetConsoleWindow(); + // 关闭控制台 + if (debug_mode_) + { + if (console) { - HMENU hmenu = ::GetSystemMenu(console_hwnd, FALSE); - ::RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND); + ::ShowWindow(console, SW_SHOWNORMAL); + } + else + { + // 显示一个新控制台 + if (::AllocConsole()) + { + console = ::GetConsoleWindow(); + // 重定向输入输出 + FILE * stdoutStream, *stdinStream, *stderrStream; + freopen_s(&stdoutStream, "conout$", "w+t", stdout); + freopen_s(&stdinStream, "conin$", "r+t", stdin); + freopen_s(&stderrStream, "conout$", "w+t", stderr); + // 禁用控制台关闭按钮 + HMENU hmenu = ::GetSystemMenu(console, FALSE); + ::RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND); + } } } else { - ::UnregisterClass(REGISTER_CLASS, HINST_THISCOMPONENT); - throw RuntimeException("Create window failed"); + if (console) + { + ::ShowWindow(console, SW_HIDE); + } } + + quit_ = false; } e2d::Rect e2d::Game::Locate(int width, int height) @@ -294,8 +334,9 @@ e2d::Rect e2d::Game::Locate(int width, int height) int max_width = ::GetSystemMetrics(SM_CXSCREEN); int max_height = ::GetSystemMetrics(SM_CYSCREEN); - float dpi_x, dpi_y; - Graphics::GetFactory()->GetDesktopDpi(&dpi_x, &dpi_y); + HDC hdc = ::GetDC(0); + int dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); + int dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); RECT rect = { 0, 0, LONG(ceil(width * dpi_x / 96.f)), LONG(ceil(height * dpi_y / 96.f)) }; // 计算合适的窗口大小 @@ -354,39 +395,48 @@ void e2d::Game::SetSize(int width, int height) width_ = width; height_ = height; - Rect rect = Locate(width, height); - ::MoveWindow( - hwnd_, - int(rect.origin.x), - int(rect.origin.y), - int(rect.size.width), - int(rect.size.height), - TRUE - ); + if (hwnd_) + { + Rect rect = Locate(width, height); + ::MoveWindow( + hwnd_, + int(rect.origin.x), + int(rect.origin.y), + int(rect.size.width), + int(rect.size.height), + TRUE + ); + } } void e2d::Game::SetTitle(const String& title) { title_ = title; - ::SetWindowText(hwnd_, (LPCWSTR)title); + if (hwnd_) + { + ::SetWindowText(hwnd_, (LPCWSTR)title); + } } void e2d::Game::SetIcon(int resource_id) { icon_ = resource_id; - - HICON icon = (HICON)::LoadImage( - HINST_THISCOMPONENT, - MAKEINTRESOURCE(resource_id), - IMAGE_ICON, - 0, - 0, - LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE - ); - ::SendMessage(hwnd_, WM_SETICON, ICON_BIG, (LPARAM)icon); - ::SendMessage(hwnd_, WM_SETICON, ICON_SMALL, (LPARAM)icon); + if (hwnd_) + { + HICON icon = (HICON)::LoadImage( + HINST_THISCOMPONENT, + MAKEINTRESOURCE(resource_id), + IMAGE_ICON, + 0, + 0, + LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE + ); + + ::SendMessage(hwnd_, WM_SETICON, ICON_BIG, (LPARAM)icon); + ::SendMessage(hwnd_, WM_SETICON, ICON_SMALL, (LPARAM)icon); + } } @@ -470,8 +520,9 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param) if (w_param == SIZE_RESTORED) { - float dpi_x, dpi_y; - Graphics::GetFactory()->GetDesktopDpi(&dpi_x, &dpi_y); + HDC hdc = ::GetDC(0); + int dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); + int dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); game->width_ = static_cast(width * 96.f / dpi_x); game->height_ = static_cast(height * 96.f / dpi_y); } @@ -479,10 +530,10 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param) // 如果程序接收到一个 WM_SIZE 消息,这个方法将调整渲染 // 目标的大小。它可能会调用失败,但是这里可以忽略有可能的 // 错误,因为这个错误将在下一次调用 EndDraw 时产生 - auto render_target = Graphics::Get()->GetRenderTarget(); + auto render_target = Device::GetGraphics()->GetRenderTarget(); if (render_target) { - render_target->Resize(D2D1::SizeU(width, height)); + render_target->Resize(D2D1::SizeU(game->width_, game->height_)); } } break; diff --git a/core/modules/Graphics.cpp b/core/modules/Graphics.cpp index 153a1488..8711f763 100644 --- a/core/modules/Graphics.cpp +++ b/core/modules/Graphics.cpp @@ -1,45 +1,14 @@ #include "..\e2dmodule.h" -#include "..\e2dmanager.h" #include "..\e2dobject.h" -e2d::Graphics* e2d::Graphics::instance_ = nullptr; -ID2D1Factory* e2d::Graphics::factory_ = nullptr; -IWICImagingFactory* e2d::Graphics::imaging_factory_ = nullptr; -IDWriteFactory* e2d::Graphics::write_factory_ = nullptr; -ID2D1StrokeStyle* e2d::Graphics::miter_stroke_style_ = nullptr; -ID2D1StrokeStyle* e2d::Graphics::bevel_stroke_style_ = nullptr; -ID2D1StrokeStyle* e2d::Graphics::round_stroke_style_ = nullptr; - -e2d::Graphics * e2d::Graphics::GetInstance() -{ - if (!instance_) - { - instance_ = new (std::nothrow) Graphics; - } - return instance_; -} - -void e2d::Graphics::DestroyInstance() -{ - if (instance_) - { - delete instance_; - instance_ = nullptr; - - SafeRelease(miter_stroke_style_); - SafeRelease(bevel_stroke_style_); - SafeRelease(round_stroke_style_); - SafeRelease(factory_); - SafeRelease(imaging_factory_); - SafeRelease(write_factory_); - } -} - -e2d::Graphics::Graphics() - : show_fps_(false) - , last_render_time_(Time::Now()) - , render_times_(0) +e2d::Graphics::Graphics(HWND hwnd) + : factory_(nullptr) + , imaging_factory_(nullptr) + , write_factory_(nullptr) + , miter_stroke_style_(nullptr) + , bevel_stroke_style_(nullptr) + , round_stroke_style_(nullptr) , fps_text_format_(nullptr) , fps_text_layout_(nullptr) , render_target_(nullptr) @@ -47,7 +16,69 @@ e2d::Graphics::Graphics() , text_renderer_(nullptr) , clear_color_(D2D1::ColorF(D2D1::ColorF::Black)) { - ::CoInitialize(nullptr); + ThrowIfFailed( + D2D1CreateFactory( + D2D1_FACTORY_TYPE_SINGLE_THREADED, + &factory_ + ) + ); + + ThrowIfFailed( + CoCreateInstance( + CLSID_WICImagingFactory, + nullptr, + CLSCTX_INPROC_SERVER, + IID_IWICImagingFactory, + reinterpret_cast(&imaging_factory_) + ) + ); + + ThrowIfFailed( + DWriteCreateFactory( + DWRITE_FACTORY_TYPE_SHARED, + __uuidof(IDWriteFactory), + reinterpret_cast(&write_factory_) + ) + ); + + RECT rc; + ::GetClientRect(hwnd, &rc); + + D2D1_SIZE_U size = D2D1::SizeU( + rc.right - rc.left, + rc.bottom - rc.top + ); + + // 创建设备相关资源。这些资源应在 Direct2D 设备消失时重建 + // 创建一个 Direct2D 渲染目标 + ThrowIfFailed( + factory_->CreateHwndRenderTarget( + D2D1::RenderTargetProperties(), + D2D1::HwndRenderTargetProperties( + hwnd, + size, + D2D1_PRESENT_OPTIONS_NONE), + &render_target_ + ) + ); + + // 创建画刷 + ThrowIfFailed( + render_target_->CreateSolidColorBrush( + D2D1::ColorF(D2D1::ColorF::White), + &solid_brush_ + ) + ); + + // 创建自定义的文字渲染器 + ThrowIfFailed( + E2DTextRender::Create( + &text_renderer_, + factory_, + render_target_, + solid_brush_ + ) + ); } e2d::Graphics::~Graphics() @@ -58,15 +89,18 @@ e2d::Graphics::~Graphics() SafeRelease(solid_brush_); SafeRelease(render_target_); - ::CoUninitialize(); + SafeRelease(miter_stroke_style_); + SafeRelease(bevel_stroke_style_); + SafeRelease(round_stroke_style_); + SafeRelease(factory_); + SafeRelease(imaging_factory_); + SafeRelease(write_factory_); } void e2d::Graphics::BeginDraw() { - auto render_target = GetRenderTarget(); - render_target->BeginDraw(); - // 使用背景色清空屏幕 - render_target->Clear(clear_color_); + render_target_->BeginDraw(); + render_target_->Clear(clear_color_); } void e2d::Graphics::EndDraw() @@ -91,41 +125,45 @@ void e2d::Graphics::EndDraw() void e2d::Graphics::DrawDebugInfo() { + static int render_times_ = 0; + static Time last_render_time_ = Time::Now(); int duration = (Time::Now() - last_render_time_).Milliseconds(); + if (!fps_text_format_) + { + ThrowIfFailed( + write_factory_->CreateTextFormat( + L"", + nullptr, + DWRITE_FONT_WEIGHT_NORMAL, + DWRITE_FONT_STYLE_NORMAL, + DWRITE_FONT_STRETCH_NORMAL, + 20, + L"", + &fps_text_format_ + ) + ); + + ThrowIfFailed( + fps_text_format_->SetWordWrapping( + DWRITE_WORD_WRAPPING_NO_WRAP + ) + ); + } + ++render_times_; if (duration >= 100) { - String fpsText = String::Format(L"FPS: %.1f", (1000.f / duration * render_times_)); + String fps_text = String::Format(L"FPS: %.1f", (1000.f / duration * render_times_)); last_render_time_ = Time::Now(); render_times_ = 0; - if (!fps_text_format_) - { - ThrowIfFailed( - GetWriteFactory()->CreateTextFormat( - L"", - nullptr, - DWRITE_FONT_WEIGHT_NORMAL, - DWRITE_FONT_STYLE_NORMAL, - DWRITE_FONT_STRETCH_NORMAL, - 20, - L"", - &fps_text_format_ - ) - ); - - ThrowIfFailed( - fps_text_format_->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP) - ); - } - SafeRelease(fps_text_layout_); ThrowIfFailed( - GetWriteFactory()->CreateTextLayout( - (const wchar_t *)fpsText, - (UINT32)fpsText.GetLength(), + write_factory_->CreateTextLayout( + (const wchar_t *)fps_text, + (UINT32)fps_text.GetLength(), fps_text_format_, 0, 0, @@ -136,9 +174,9 @@ void e2d::Graphics::DrawDebugInfo() if (fps_text_layout_) { - GetRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); - GetSolidBrush()->SetOpacity(1.0f); - GetTextRenderer()->SetTextStyle( + render_target_->SetTransform(D2D1::Matrix3x2F::Identity()); + solid_brush_->SetOpacity(1.0f); + text_renderer_->SetTextStyle( D2D1::ColorF(D2D1::ColorF::White), TRUE, D2D1::ColorF(D2D1::ColorF::Black, 0.4f), @@ -146,133 +184,42 @@ void e2d::Graphics::DrawDebugInfo() D2D1_LINE_JOIN_ROUND ); - ThrowIfFailed( - fps_text_layout_->Draw(nullptr, text_renderer_, 10, 0) + fps_text_layout_->Draw( + nullptr, + text_renderer_, + 10, + 0 ); } } -e2d::E2DTextRenderer * e2d::Graphics::GetTextRenderer() +ID2D1HwndRenderTarget * e2d::Graphics::GetRenderTarget() const { - if (!text_renderer_) - { - // 创建自定义的文字渲染器 - ThrowIfFailed( - E2DTextRenderer::Create( - &text_renderer_, - GetFactory(), - GetRenderTarget(), - GetSolidBrush() - ) - ); - } - return text_renderer_; -} - -ID2D1HwndRenderTarget * e2d::Graphics::GetRenderTarget() -{ - if (!render_target_) - { - HWND hwnd = Game::Get()->GetHWnd(); - - RECT rc; - GetClientRect(hwnd, &rc); - - D2D1_SIZE_U size = D2D1::SizeU( - rc.right - rc.left, - rc.bottom - rc.top - ); - - // 创建设备相关资源。这些资源应在 Direct2D 设备消失时重建 - // 创建一个 Direct2D 渲染目标 - ThrowIfFailed( - GetFactory()->CreateHwndRenderTarget( - D2D1::RenderTargetProperties(), - D2D1::HwndRenderTargetProperties( - hwnd, - size, - D2D1_PRESENT_OPTIONS_NONE), - &render_target_ - ) - ); - } return render_target_; } -ID2D1SolidColorBrush * e2d::Graphics::GetSolidBrush() +ID2D1SolidColorBrush * e2d::Graphics::GetSolidBrush() const { - if (!solid_brush_) - { - ThrowIfFailed( - GetRenderTarget()->CreateSolidColorBrush( - D2D1::ColorF(D2D1::ColorF::White), - &solid_brush_ - ) - ); - } return solid_brush_; } -void e2d::Graphics::ShowFps(bool show) +e2d::E2DTextRender * e2d::Graphics::GetTextRender() const { - show_fps_ = show; + return text_renderer_; } -ID2D1Factory * e2d::Graphics::GetFactory() +ID2D1Factory * e2d::Graphics::GetFactory() const { - if (!factory_) - { - ::CoInitialize(nullptr); - - ThrowIfFailed( - D2D1CreateFactory( - D2D1_FACTORY_TYPE_SINGLE_THREADED, - &factory_ - ) - ); - - ::CoUninitialize(); - } return factory_; } -IWICImagingFactory * e2d::Graphics::GetImagingFactory() +IWICImagingFactory * e2d::Graphics::GetImagingFactory() const { - if (!imaging_factory_) - { - ::CoInitialize(nullptr); - - ThrowIfFailed( - CoCreateInstance( - CLSID_WICImagingFactory, - nullptr, - CLSCTX_INPROC_SERVER, - IID_IWICImagingFactory, - reinterpret_cast(&imaging_factory_) - ) - ); - - ::CoUninitialize(); - } return imaging_factory_; } -IDWriteFactory * e2d::Graphics::GetWriteFactory() +IDWriteFactory * e2d::Graphics::GetWriteFactory() const { - if (!write_factory_) - { - ::CoInitialize(nullptr); - - ThrowIfFailed( - DWriteCreateFactory( - DWRITE_FACTORY_TYPE_SHARED, - __uuidof(IDWriteFactory), - reinterpret_cast(&write_factory_) - ) - ); - - ::CoUninitialize(); - } return write_factory_; } @@ -281,7 +228,7 @@ ID2D1StrokeStyle * e2d::Graphics::GetMiterStrokeStyle() if (!miter_stroke_style_) { ThrowIfFailed( - GetFactory()->CreateStrokeStyle( + factory_->CreateStrokeStyle( D2D1::StrokeStyleProperties( D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_FLAT, @@ -304,7 +251,7 @@ ID2D1StrokeStyle * e2d::Graphics::GetBevelStrokeStyle() if (!bevel_stroke_style_) { ThrowIfFailed( - GetFactory()->CreateStrokeStyle( + factory_->CreateStrokeStyle( D2D1::StrokeStyleProperties( D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_FLAT, @@ -327,7 +274,7 @@ ID2D1StrokeStyle * e2d::Graphics::GetRoundStrokeStyle() if (!round_stroke_style_) { ThrowIfFailed( - GetFactory()->CreateStrokeStyle( + factory_->CreateStrokeStyle( D2D1::StrokeStyleProperties( D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_FLAT, diff --git a/core/modules/Input.cpp b/core/modules/Input.cpp index 3c3e91c2..d821025e 100644 --- a/core/modules/Input.cpp +++ b/core/modules/Input.cpp @@ -1,34 +1,12 @@ #include "..\e2dmodule.h" #include "..\e2dtool.h" -#include "..\e2dmanager.h" -#pragma comment(lib, "dinput8.lib") -e2d::Input * e2d::Input::instance_ = nullptr; - -e2d::Input * e2d::Input::GetInstance() +e2d::Input::Input(HWND hwnd) + : direct_input_(nullptr) + , keyboard_device_(nullptr) + , mouse_device_(nullptr) { - if (!instance_) - instance_ = new (std::nothrow) Input; - return instance_; -} - -void e2d::Input::DestroyInstance() -{ - if (instance_) - { - delete instance_; - instance_ = nullptr; - } -} - -e2d::Input::Input() - : direct_input_(false) - , keyboard_device_(false) - , mouse_device_(false) -{ - ::CoInitialize(nullptr); - ZeroMemory(key_buffer_, sizeof(key_buffer_)); ZeroMemory(&mouse_state_, sizeof(mouse_state_)); @@ -43,8 +21,6 @@ e2d::Input::Input() ) ); - HWND hwnd = Window::GetInstance()->GetHWnd(); - // 初始化键盘设备 ThrowIfFailed( direct_input_->CreateDevice( @@ -84,11 +60,9 @@ e2d::Input::~Input() SafeRelease(mouse_device_); SafeRelease(keyboard_device_); SafeRelease(direct_input_); - - ::CoUninitialize(); } -void e2d::Input::Update() +void e2d::Input::Flush() { if (keyboard_device_) { @@ -101,7 +75,10 @@ void e2d::Input::Update() } else { - keyboard_device_->GetDeviceState(sizeof(key_buffer_), (void**)&key_buffer_); + keyboard_device_->GetDeviceState( + sizeof(key_buffer_), + (void**)&key_buffer_ + ); } } @@ -116,7 +93,10 @@ void e2d::Input::Update() } else { - mouse_device_->GetDeviceState(sizeof(mouse_state_), (void**)&mouse_state_); + mouse_device_->GetDeviceState( + sizeof(mouse_state_), + (void**)&mouse_state_ + ); } } } @@ -147,13 +127,14 @@ float e2d::Input::GetMouseY() e2d::Point e2d::Input::GetMousePos() { - auto window = Window::GetInstance(); - float dpi = window->GetDpi(); + HDC hdc = ::GetDC(0); + int dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); + int dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); POINT mousePos; ::GetCursorPos(&mousePos); - ::ScreenToClient(window->GetHWnd(), &mousePos); - return Point(mousePos.x * 96.f / dpi, mousePos.y * 96.f / dpi); + ::ScreenToClient(Game::GetInstance()->GetHWnd(), &mousePos); + return Point(mousePos.x * 96.f / dpi_x, mousePos.y * 96.f / dpi_y); } float e2d::Input::GetMouseDeltaX() diff --git a/core/modules/Window.cpp b/core/modules/Window.cpp deleted file mode 100644 index 9ea320c5..00000000 --- a/core/modules/Window.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "..\e2dmodule.h" - - -e2d::Size e2d::Window::GetScreenSize() -{ - int screen_width = ::GetSystemMetrics(SM_CXSCREEN); - int screen_height = ::GetSystemMetrics(SM_CYSCREEN); - Size screen_size( - static_cast(screen_width), - static_cast(screen_height) - ); - return std::move(screen_size); -} - -void e2d::Window::SetCursor(Cursor cursor) -{ - LPCWSTR cursor_name = nullptr; - switch (cursor) - { - case Cursor::Normal: - cursor_name = IDC_ARROW; - break; - - case Cursor::Hand: - cursor_name = IDC_HAND; - break; - - case Cursor::No: - cursor_name = IDC_NO; - break; - - case Cursor::Wait: - cursor_name = IDC_WAIT; - break; - - case Cursor::ArrowWait: - cursor_name = IDC_APPSTARTING; - break; - - default: - break; - } - - HCURSOR hcursor = ::LoadCursor(nullptr, cursor_name); - if (hcursor) - { - ::SetCursor(hcursor); - } -} - -void e2d::Window::ShowConsole(bool enabled) -{ - // 查找已存在的控制台句柄 - HWND hwnd = ::GetConsoleWindow(); - // 关闭控制台 - if (enabled) - { - if (hwnd) - { - ::ShowWindow(hwnd, SW_SHOWNORMAL); - } - else - { - // 显示一个新控制台 - if (::AllocConsole()) - { - hwnd = ::GetConsoleWindow(); - // 重定向输入输出 - FILE * stdoutStream, * stdinStream, * stderrStream; - freopen_s(&stdoutStream, "conout$", "w+t", stdout); - freopen_s(&stdinStream, "conin$", "r+t", stdin); - freopen_s(&stderrStream, "conout$", "w+t", stderr); - // 禁用控制台关闭按钮 - HMENU hmenu = ::GetSystemMenu(hwnd, FALSE); - ::RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND); - } - } - } - else - { - if (hwnd) - { - ::ShowWindow(hwnd, SW_HIDE); - } - } -} - -bool e2d::Window::Popup(const String & text, const String & title, PopupStyle style, bool has_cancel) -{ - UINT type = 0; - switch (style) - { - case PopupStyle::Info: - type = MB_ICONINFORMATION; - break; - case PopupStyle::Warning: - type = MB_ICONWARNING; - break; - case PopupStyle::Error: - type = MB_ICONERROR; - break; - default: - break; - } - - if (has_cancel) - { - type |= MB_OKCANCEL; - } - - int ret = ::MessageBoxW(nullptr, (LPCWSTR)text, (LPCWSTR)title, type); - return ret == IDOK; -} diff --git a/core/objects/Canvas.cpp b/core/objects/Canvas.cpp index 1b997da5..93d28080 100644 --- a/core/objects/Canvas.cpp +++ b/core/objects/Canvas.cpp @@ -9,7 +9,7 @@ e2d::Canvas::Canvas(float width, float height) , stroke_width_(1.0f) , stroke_(Stroke::Miter) { - render_target_ = Graphics::Get()->GetRenderTarget(); + render_target_ = Device::GetGraphics()->GetRenderTarget(); render_target_->AddRef(); ThrowIfFailed( @@ -59,13 +59,13 @@ void e2d::Canvas::SetStrokeStyle(Stroke strokeStyle) switch (strokeStyle) { case e2d::Stroke::Miter: - stroke_style_ = Graphics::GetMiterStrokeStyle(); + stroke_style_ = Device::GetGraphics()->GetMiterStrokeStyle(); break; case e2d::Stroke::Bevel: - stroke_style_ = Graphics::GetBevelStrokeStyle(); + stroke_style_ = Device::GetGraphics()->GetBevelStrokeStyle(); break; case e2d::Stroke::Round: - stroke_style_ = Graphics::GetRoundStrokeStyle(); + stroke_style_ = Device::GetGraphics()->GetRoundStrokeStyle(); break; } } diff --git a/core/objects/Collider.cpp b/core/objects/Collider.cpp deleted file mode 100644 index d543a6f5..00000000 --- a/core/objects/Collider.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#include "..\e2dutil.h" -#include "..\e2dimpl.h" -#include "..\e2dmodule.h" -#include "..\e2dmanager.h" -#include "..\e2dobject.h" - -e2d::Collider::Collider(Node * parent) - : visible_(true) - , border_color_(Color::Blue, 0.6f) - , parent_node_(parent) - , geometry_(nullptr) - , enabled_(true) - , shape_(Collider::Shape::None) - , notify_(true) -{ -} - -e2d::Collider::~Collider() -{ - SafeRelease(geometry_); - - CollisionManager::GetInstance()->RemoveCollider(this); -} - -const e2d::Color& e2d::Collider::GetBorderColor() const -{ - return border_color_; -} - -e2d::Collider::Shape e2d::Collider::GetShape() const -{ - return shape_; -} - -e2d::Node * e2d::Collider::GetNode() const -{ - return parent_node_; -} - -ID2D1Geometry * e2d::Collider::GetGeometry() const -{ - return geometry_; -} - -void e2d::Collider::SetShape(Shape shape) -{ - if (shape_ == shape) - return; - - shape_ = shape; - if (shape == Shape::None) - { - SafeRelease(geometry_); - CollisionManager::GetInstance()->RemoveCollider(this); - } - else - { - this->Recreate(); - CollisionManager::GetInstance()->AddCollider(this); - } -} - -void e2d::Collider::SetCollisionNotify(bool notify) -{ - notify_ = notify; -} - -void e2d::Collider::SetEnabled(bool enabled) -{ - enabled_ = enabled; -} - -void e2d::Collider::SetVisible(bool visible) -{ - visible_ = visible; -} - -void e2d::Collider::SetBorderColor(const Color& color) -{ - border_color_ = color; -} - -void e2d::Collider::Draw() -{ - if (geometry_ && enabled_ && visible_) - { - auto graphics = Graphics::GetInstance(); - // 获取纯色画刷 - ID2D1SolidColorBrush * brush = graphics->GetSolidBrush(); - // 设置画刷颜色和透明度 - brush->SetColor((D2D1_COLOR_F)border_color_); - brush->SetOpacity(1.f); - // 绘制几何碰撞体 - graphics->GetRenderTarget()->DrawGeometry(geometry_, brush, 1.5f); - } -} - -e2d::Collider::Relation e2d::Collider::GetRelationWith(Collider * collider) const -{ - if (geometry_ && collider->geometry_) - { - if (enabled_ && collider->enabled_) - { - D2D1_GEOMETRY_RELATION relation; - geometry_->CompareWithGeometry( - collider->geometry_, - D2D1::Matrix3x2F::Identity(), - &relation - ); - - return Relation(relation); - } - } - return Relation::Unknown; -} - -bool e2d::Collider::IsEnabled() const -{ - return enabled_; -} - -bool e2d::Collider::IsVisible() const -{ - return visible_; -} - -bool e2d::Collider::IsCollisionNotify() const -{ - return notify_; -} - -void e2d::Collider::Recreate() -{ - if (!enabled_ || shape_ == Shape::None) - return; - - SafeRelease(geometry_); - auto factory = Graphics::GetFactory(); - - switch (shape_) - { - case Shape::Rect: - { - ID2D1RectangleGeometry* rectangle = nullptr; - factory->CreateRectangleGeometry( - D2D1::RectF(0, 0, parent_node_->GetRealWidth(), parent_node_->GetRealHeight()), - &rectangle - ); - geometry_ = rectangle; - } - break; - - case Shape::Circle: - { - float minSide = std::min(parent_node_->GetRealWidth(), parent_node_->GetRealHeight()); - - ID2D1EllipseGeometry* circle = nullptr; - factory->CreateEllipseGeometry( - D2D1::Ellipse( - D2D1::Point2F( - parent_node_->GetRealWidth() / 2, - parent_node_->GetRealHeight() / 2 - ), - minSide / 2, - minSide / 2 - ), - &circle - ); - geometry_ = circle; - } - break; - - case Shape::Ellipse: - { - float halfWidth = parent_node_->GetWidth() / 2, - halfHeight = parent_node_->GetHeight() / 2; - - ID2D1EllipseGeometry* ellipse = nullptr; - factory->CreateEllipseGeometry( - D2D1::Ellipse( - D2D1::Point2F( - halfWidth, - halfHeight), - halfWidth, - halfHeight), - &ellipse - ); - geometry_ = ellipse; - } - break; - } - - ID2D1TransformedGeometry * transformed; - factory->CreateTransformedGeometry( - geometry_, - parent_node_->final_matrix_, - &transformed - ); - SafeRelease(geometry_); - geometry_ = transformed; -} diff --git a/core/objects/Image.cpp b/core/objects/Image.cpp index e746ed95..55415b99 100644 --- a/core/objects/Image.cpp +++ b/core/objects/Image.cpp @@ -47,7 +47,7 @@ e2d::Image::~Image() bool e2d::Image::Open(const Resource& res) { - if (!Image::Preload(res)) + if (!Image::Load(res)) { WARN("Load Image from file failed!"); return false; @@ -64,7 +64,7 @@ bool e2d::Image::Open(const String & file_name) if (file_name.IsEmpty()) return false; - if (!Image::Preload(file_name)) + if (!Image::Load(file_name)) { WARN("Load Image from file failed!"); return false; @@ -157,15 +157,20 @@ const e2d::Rect & e2d::Image::GetCropRect() const return crop_rect_; } -bool e2d::Image::Preload(const Resource& res) +ID2D1Bitmap * e2d::Image::GetBitmap() const +{ + return bitmap_; +} + +bool e2d::Image::Load(const Resource& res) { if (bitmap_cache_.find(res.id) != bitmap_cache_.end()) { return true; } - IWICImagingFactory *imaging_factory = Graphics::GetImagingFactory(); - ID2D1HwndRenderTarget* render_target = Graphics::GetInstance()->GetRenderTarget(); + IWICImagingFactory *imaging_factory = Device::GetGraphics()->GetImagingFactory(); + ID2D1HwndRenderTarget* render_target = Device::GetGraphics()->GetRenderTarget(); IWICBitmapDecoder *decoder = nullptr; IWICBitmapFrameDecode *source = nullptr; IWICStream *stream = nullptr; @@ -283,7 +288,7 @@ bool e2d::Image::Preload(const Resource& res) return SUCCEEDED(hr); } -bool e2d::Image::Preload(const String & file_name) +bool e2d::Image::Load(const String & file_name) { size_t hash = file_name.GetHash(); if (bitmap_cache_.find(hash) != bitmap_cache_.end()) @@ -297,8 +302,8 @@ bool e2d::Image::Preload(const String & file_name) // 默认搜索路径,所以需要通过 File::GetPath 获取完整路径 String image_file_path = image_file.GetPath(); - IWICImagingFactory *imaging_factory = Graphics::GetImagingFactory(); - ID2D1HwndRenderTarget* render_target = Graphics::GetInstance()->GetRenderTarget(); + IWICImagingFactory *imaging_factory = Device::GetGraphics()->GetImagingFactory(); + ID2D1HwndRenderTarget* render_target = Device::GetGraphics()->GetRenderTarget(); IWICBitmapDecoder *decoder = nullptr; IWICBitmapFrameDecode *source = nullptr; IWICStream *stream = nullptr; @@ -395,8 +400,3 @@ void e2d::Image::SetBitmap(ID2D1Bitmap * bitmap) crop_rect_.size.height = bitmap_->GetSize().height; } } - -ID2D1Bitmap * e2d::Image::GetBitmap() -{ - return bitmap_; -} diff --git a/core/objects/Node.cpp b/core/objects/Node.cpp index eba54fa3..fba997b1 100644 --- a/core/objects/Node.cpp +++ b/core/objects/Node.cpp @@ -1,7 +1,7 @@ #include "..\e2dobject.h" #include "..\e2devent.h" -#include "..\e2dmanager.h" #include "..\e2daction.h" +#include "..\e2dmodule.h" e2d::Node::Node() @@ -12,7 +12,6 @@ e2d::Node::Node() , clip_enabled_(false) , dirty_sort_(false) , dirty_transform_(false) - , collider_(this) , border_(nullptr) , order_(0) , transform_() @@ -52,18 +51,12 @@ void e2d::Node::Visit() if (!visible_) return; + Update(); UpdateActions(); UpdateTasks(); - - auto updatable_node = dynamic_cast(this); - if (updatable_node) - { - updatable_node->Update(); - } - UpdateTransform(); - auto render_target = Graphics::Get()->GetRenderTarget(); + auto render_target = Device::GetGraphics()->GetRenderTarget(); if (clip_enabled_) { render_target->SetTransform(final_matrix_); @@ -75,12 +68,8 @@ void e2d::Node::Visit() if (children_.empty()) { - auto drawable_node = dynamic_cast(this); - if (drawable_node) - { - render_target->SetTransform(final_matrix_); - drawable_node->Draw(); - } + render_target->SetTransform(final_matrix_); + Draw(); } else { @@ -111,12 +100,8 @@ void e2d::Node::Visit() } } - auto drawable_node = dynamic_cast(this); - if (drawable_node) - { - render_target->SetTransform(final_matrix_); - drawable_node->Draw(); - } + render_target->SetTransform(final_matrix_); + Draw(); // 访问剩余节点 for (; i < children_.size(); ++i) @@ -135,7 +120,7 @@ void e2d::Node::DrawBorder() { if (border_) { - auto graphics = Graphics::Get(); + auto graphics = Device::GetGraphics(); auto brush = graphics->GetSolidBrush(); brush->SetColor(D2D1_COLOR_F(border_color_)); graphics->GetRenderTarget()->DrawGeometry( @@ -152,19 +137,6 @@ void e2d::Node::DrawBorder() } } -void e2d::Node::DrawCollider() -{ - if (visible_) - { - collider_.Draw(); - - for (const auto& child : children_) - { - child->DrawCollider(); - } - } -} - void e2d::Node::UpdateTransform() { if (!dirty_transform_) @@ -195,7 +167,7 @@ void e2d::Node::UpdateTransform() // 重新构造轮廓 SafeRelease(border_); - ID2D1Factory * factory = Graphics::GetFactory(); + ID2D1Factory * factory = Device::GetGraphics()->GetFactory(); ID2D1RectangleGeometry * rectangle = nullptr; ID2D1TransformedGeometry * transformed = nullptr; ThrowIfFailed( @@ -220,16 +192,6 @@ void e2d::Node::UpdateTransform() { child->dirty_transform_ = true; } - - // 更新碰撞体 - collider_.Recreate(); - - if (collider_.IsEnabled() && - collider_.IsCollisionNotify() && - collider_.GetShape() != Collider::Shape::None) - { - CollisionManager::GetInstance()->UpdateCollider(&collider_); - } } bool e2d::Node::Dispatch(const MouseEvent & e, bool handled) @@ -322,17 +284,7 @@ size_t e2d::Node::GetHashName() const return hash_name_; } -float e2d::Node::GetPosX() const -{ - return transform_.position.x; -} - -float e2d::Node::GetPosY() const -{ - return transform_.position.y; -} - -const e2d::Point& e2d::Node::GetPos() const +const e2d::Point& e2d::Node::GetPosition() const { return transform_.position; } @@ -412,11 +364,6 @@ float e2d::Node::GetOpacity() const return real_opacity_; } -e2d::Collider* e2d::Node::GetCollider() -{ - return &collider_; -} - int e2d::Node::GetOrder() const { return order_; diff --git a/core/objects/Sprite.cpp b/core/objects/Sprite.cpp index 90cfc66b..c21dbc07 100644 --- a/core/objects/Sprite.cpp +++ b/core/objects/Sprite.cpp @@ -111,10 +111,8 @@ void e2d::Sprite::Draw() const { if (image_ && image_->GetBitmap()) { - // 获取图片裁剪位置 auto crop_pos = image_->GetCropPos(); - // 渲染图片 - Graphics::Get()->GetRenderTarget()->DrawBitmap( + Device::GetGraphics()->GetRenderTarget()->DrawBitmap( image_->GetBitmap(), D2D1::RectF(0, 0, transform_.size.width, transform_.size.height), display_opacity_, diff --git a/core/objects/Text.cpp b/core/objects/Text.cpp index dfc09bea..bde86168 100644 --- a/core/objects/Text.cpp +++ b/core/objects/Text.cpp @@ -292,13 +292,13 @@ void e2d::Text::Draw() const { if (text_layout_) { - auto graphics = Graphics::GetInstance(); + auto graphics = Device::GetGraphics(); // 创建文本区域 D2D1_RECT_F textLayoutRect = D2D1::RectF(0, 0, transform_.size.width, transform_.size.height); // 设置画刷颜色和透明度 graphics->GetSolidBrush()->SetOpacity(display_opacity_); // 获取文本渲染器 - auto textRenderer = graphics->GetTextRenderer(); + auto textRenderer = graphics->GetTextRender(); textRenderer->SetTextStyle( (D2D1_COLOR_F)style_.color, style_.outline, @@ -323,7 +323,7 @@ void e2d::Text::CreateFormat() SafeRelease(text_format_); ThrowIfFailed( - Graphics::GetWriteFactory()->CreateTextFormat( + Device::GetGraphics()->GetWriteFactory()->CreateTextFormat( (const wchar_t *)font_.family, nullptr, DWRITE_FONT_WEIGHT(font_.weight), @@ -381,7 +381,7 @@ void e2d::Text::CreateLayout() } UINT32 length = (UINT32)text_.GetLength(); - auto writeFactory = Graphics::GetWriteFactory(); + auto writeFactory = Device::GetGraphics()->GetWriteFactory(); // 对文本自动换行情况下进行处理 if (style_.wrap) diff --git a/core/tools/File.cpp b/core/tools/File.cpp index 4931ffc6..3c425099 100644 --- a/core/tools/File.cpp +++ b/core/tools/File.cpp @@ -206,12 +206,7 @@ e2d::File e2d::File::ShowOpenDialog(const String & title, const String & filter) file_open->SetFileTypes(1, spec); } - Game::GetInstance()->Pause(); - { - HWND hwnd = Window::GetInstance()->GetHWnd(); - hr = file_open->Show(hwnd); - } - Game::GetInstance()->Resume(); + hr = file_open->Show(nullptr); if (SUCCEEDED(hr)) { @@ -281,12 +276,7 @@ e2d::File e2d::File::ShowSaveDialog(const String & title, const String& def_file file_save->SetFileTypes(1, spec); } - Game::GetInstance()->Pause(); - { - HWND hwnd = Window::GetInstance()->GetHWnd(); - hr = file_save->Show(hwnd); - } - Game::GetInstance()->Resume(); + hr = file_save->Show(nullptr); if (SUCCEEDED(hr)) { diff --git a/core/tools/Music.cpp b/core/tools/Music.cpp index 48d4fa68..9c4e2a8f 100644 --- a/core/tools/Music.cpp +++ b/core/tools/Music.cpp @@ -3,11 +3,11 @@ #ifndef SAFE_DELETE -#define SAFE_DELETE(p) { if (p) { delete (p); (p)=nullptr; } } +#define SAFE_DELETE(p) { if (p) { delete (p); (p)=nullptr; } } #endif #ifndef SAFE_DELETE_ARRAY -#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p)=nullptr; } } +#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p)=nullptr; } } #endif inline bool TraceError(wchar_t* prompt) @@ -128,10 +128,7 @@ bool e2d::Music::Open(const e2d::String & file_path) return false; } - // 创建音源 - auto xAudio2 = Audio::GetInstance()->GetXAudio2(); - HRESULT hr = xAudio2->CreateSourceVoice(&voice_, wfx_, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &callback_); - + HRESULT hr = Device::GetAudio()->CreateVoice(&voice_, wfx_, &callback_); if (FAILED(hr)) { TraceError(L"Create source voice error", hr); @@ -206,10 +203,7 @@ bool e2d::Music::Open(const Resource& res) return false; } - // 创建音源 - auto xAudio2 = Audio::GetInstance()->GetXAudio2(); - HRESULT hr = xAudio2->CreateSourceVoice(&voice_, wfx_, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &callback_); - + HRESULT hr = Device::GetAudio()->CreateVoice(&voice_, wfx_, &callback_); if (FAILED(hr)) { TraceError(L"Create source voice error", hr); diff --git a/core/tools/Path.cpp b/core/tools/Path.cpp index 64e831f4..f6c38785 100644 --- a/core/tools/Path.cpp +++ b/core/tools/Path.cpp @@ -9,7 +9,7 @@ const e2d::String& e2d::Path::GetDataPath() { // 设置数据的保存路径 String local_app_data_path = Path::GetLocalAppDataPath(); - String title = Window::GetInstance()->GetTitle(); + String title = Game::GetInstance()->GetTitle(); String folder_name = String::Parse(title.GetHash()); if (!local_app_data_path.IsEmpty()) @@ -34,7 +34,7 @@ const e2d::String& e2d::Path::GetTemporaryPath() { // 设置临时文件保存路径 wchar_t path[_MAX_PATH]; - String title = Window::GetInstance()->GetTitle(); + String title = Game::GetInstance()->GetTitle(); String folder_name = String::Parse(title.GetHash()); if (0 != ::GetTempPath(_MAX_PATH, path)) diff --git a/core/tools/Player.cpp b/core/tools/Player.cpp deleted file mode 100644 index 45588e4e..00000000 --- a/core/tools/Player.cpp +++ /dev/null @@ -1,230 +0,0 @@ -#include "..\e2dtool.h" - - -e2d::Player * e2d::Player::instance_ = nullptr; - -e2d::Player * e2d::Player::GetInstance() -{ - if (!instance_) - { - instance_ = new (std::nothrow) Player; - } - return instance_; -} - -void e2d::Player::DestroyInstance() -{ - if (instance_) - { - delete instance_; - instance_ = nullptr; - } -} - -e2d::Player::Player() - : volume_(1.f) -{ -} - -e2d::Player::~Player() -{ - if (!musics_.empty()) - { - for (const auto& pair : musics_) - { - pair.second->Release(); - } - } -} - -bool e2d::Player::Preload(const String & file_path) -{ - if (file_path.IsEmpty()) - return false; - - Music * music = new (std::nothrow) Music(); - - if (music) - { - music->Retain(); - - if (music->Open(file_path)) - { - music->SetVolume(volume_); - musics_.insert(std::make_pair(file_path.GetHash(), music)); - return true; - } - else - { - music->Release(); - } - } - return false; -} - -bool e2d::Player::Play(const String & file_path, int loop_count) -{ - if (file_path.IsEmpty()) - return false; - - if (Player::Preload(file_path)) - { - auto music = musics_[file_path.GetHash()]; - if (music->Play(loop_count)) - { - return true; - } - } - return false; -} - -void e2d::Player::Pause(const String & file_path) -{ - if (file_path.IsEmpty()) - return; - - size_t hash = file_path.GetHash(); - if (musics_.end() != musics_.find(hash)) - musics_[hash]->Pause(); -} - -void e2d::Player::Resume(const String & file_path) -{ - if (file_path.IsEmpty()) - return; - - size_t hash = file_path.GetHash(); - if (musics_.end() != musics_.find(hash)) - musics_[hash]->Resume(); -} - -void e2d::Player::Stop(const String & file_path) -{ - if (file_path.IsEmpty()) - return; - - size_t hash = file_path.GetHash(); - if (musics_.end() != musics_.find(hash)) - musics_[hash]->Stop(); -} - -bool e2d::Player::IsPlaying(const String & file_path) -{ - if (file_path.IsEmpty()) - return false; - - size_t hash = file_path.GetHash(); - if (musics_.end() != musics_.find(hash)) - return musics_[hash]->IsPlaying(); - return false; -} - -bool e2d::Player::Preload(const Resource& res) -{ - if (musics_.end() != musics_.find(res.id)) - return true; - - Music * music = new (std::nothrow) Music(); - - if (music) - { - music->Retain(); - - if (music->Open(res)) - { - music->SetVolume(volume_); - musics_.insert(std::make_pair(res.id, music)); - return true; - } - else - { - music->Release(); - } - } - return false; -} - -bool e2d::Player::Play(const Resource& res, int loop_count) -{ - if (Player::Preload(res)) - { - auto music = musics_[res.id]; - if (music->Play(loop_count)) - { - return true; - } - } - return false; -} - -void e2d::Player::Pause(const Resource& res) -{ - if (musics_.end() != musics_.find(res.id)) - musics_[res.id]->Pause(); -} - -void e2d::Player::Resume(const Resource& res) -{ - if (musics_.end() != musics_.find(res.id)) - musics_[res.id]->Resume(); -} - -void e2d::Player::Stop(const Resource& res) -{ - if (musics_.end() != musics_.find(res.id)) - musics_[res.id]->Stop(); -} - -bool e2d::Player::IsPlaying(const Resource& res) -{ - if (musics_.end() != musics_.find(res.id)) - return musics_[res.id]->IsPlaying(); - return false; -} - -float e2d::Player::GetVolume() -{ - return volume_; -} - -void e2d::Player::SetVolume(float volume) -{ - volume_ = std::min(std::max(volume, -224.f), 224.f); - for (const auto& pair : musics_) - { - pair.second->SetVolume(volume_); - } -} - -void e2d::Player::PauseAll() -{ - for (const auto& pair : musics_) - { - pair.second->Pause(); - } -} - -void e2d::Player::ResumeAll() -{ - for (const auto& pair : musics_) - { - pair.second->Resume(); - } -} - -void e2d::Player::StopAll() -{ - for (const auto& pair : musics_) - { - pair.second->Stop(); - } -} - -void e2d::Player::ClearCache() -{ - for (const auto& pair : musics_) - { - delete pair.second; - } - musics_.clear(); -} diff --git a/core/transitions/BoxTransition.cpp b/core/transitions/BoxTransition.cpp index 483d38fd..690759d0 100644 --- a/core/transitions/BoxTransition.cpp +++ b/core/transitions/BoxTransition.cpp @@ -6,9 +6,9 @@ e2d::BoxTransition::BoxTransition(float duration) { } -void e2d::BoxTransition::Init(Scene * prev, Scene * next) +void e2d::BoxTransition::Init(Scene * prev, Scene * next, Game * game) { - Transition::Init(prev, next); + Transition::Init(prev, next, game); in_layer_param_.opacity = 0; } diff --git a/core/transitions/EmergeTransition.cpp b/core/transitions/EmergeTransition.cpp index 75531862..63bd31a5 100644 --- a/core/transitions/EmergeTransition.cpp +++ b/core/transitions/EmergeTransition.cpp @@ -6,9 +6,9 @@ e2d::EmergeTransition::EmergeTransition(float duration) { } -void e2d::EmergeTransition::Init(Scene * prev, Scene * next) +void e2d::EmergeTransition::Init(Scene * prev, Scene * next, Game * game) { - Transition::Init(prev, next); + Transition::Init(prev, next, game); out_layer_param_.opacity = 1; in_layer_param_.opacity = 0; diff --git a/core/transitions/FadeTransition.cpp b/core/transitions/FadeTransition.cpp index eba42866..f81cc8eb 100644 --- a/core/transitions/FadeTransition.cpp +++ b/core/transitions/FadeTransition.cpp @@ -6,9 +6,9 @@ e2d::FadeTransition::FadeTransition(float duration) { } -void e2d::FadeTransition::Init(Scene * prev, Scene * next) +void e2d::FadeTransition::Init(Scene * prev, Scene * next, Game * game) { - Transition::Init(prev, next); + Transition::Init(prev, next, game); out_layer_param_.opacity = 1; in_layer_param_.opacity = 0; diff --git a/core/transitions/MoveTransition.cpp b/core/transitions/MoveTransition.cpp index 9f91925a..6f747852 100644 --- a/core/transitions/MoveTransition.cpp +++ b/core/transitions/MoveTransition.cpp @@ -7,9 +7,9 @@ e2d::MoveTransition::MoveTransition(float duration, Direction direction) { } -void e2d::MoveTransition::Init(Scene * prev, Scene * next) +void e2d::MoveTransition::Init(Scene * prev, Scene * next, Game * game) { - Transition::Init(prev, next); + Transition::Init(prev, next, game); switch (direction_) { diff --git a/core/transitions/RotationTransition.cpp b/core/transitions/RotationTransition.cpp index d343a320..f27fcd1f 100644 --- a/core/transitions/RotationTransition.cpp +++ b/core/transitions/RotationTransition.cpp @@ -7,9 +7,9 @@ e2d::RotationTransition::RotationTransition(float duration, float rotation) { } -void e2d::RotationTransition::Init(Scene * prev, Scene * next) +void e2d::RotationTransition::Init(Scene * prev, Scene * next, Game * game) { - Transition::Init(prev, next); + Transition::Init(prev, next, game); if (out_scene_) { diff --git a/core/transitions/Transition.cpp b/core/transitions/Transition.cpp index a449fa6d..e90b7314 100644 --- a/core/transitions/Transition.cpp +++ b/core/transitions/Transition.cpp @@ -30,7 +30,7 @@ bool e2d::Transition::IsDone() return done_; } -void e2d::Transition::Init(Scene * prev, Scene * next) +void e2d::Transition::Init(Scene * prev, Scene * next, Game * game) { started_ = Time::Now(); out_scene_ = prev; @@ -42,7 +42,7 @@ void e2d::Transition::Init(Scene * prev, Scene * next) if (in_scene_) in_scene_->Retain(); - auto graphics = Graphics::GetInstance(); + auto graphics = Device::GetGraphics(); if (in_scene_) { ThrowIfFailed( @@ -57,7 +57,7 @@ void e2d::Transition::Init(Scene * prev, Scene * next) ); } - window_size_ = Window::GetInstance()->GetSize(); + window_size_ = game->GetSize(); out_layer_param_ = in_layer_param_ = D2D1::LayerParameters( D2D1::RectF( 0.f, @@ -94,7 +94,7 @@ void e2d::Transition::Update() void e2d::Transition::Draw() { - auto render_target = Graphics::GetInstance()->GetRenderTarget(); + auto render_target = Device::GetGraphics()->GetRenderTarget(); if (out_scene_) { diff --git a/project/vs2012/Easy2D.vcxproj b/project/vs2012/Easy2D.vcxproj index 3671cbdd..d933ca27 100644 --- a/project/vs2012/Easy2D.vcxproj +++ b/project/vs2012/Easy2D.vcxproj @@ -42,20 +42,16 @@ - - + - - - + - @@ -66,7 +62,6 @@ - @@ -97,7 +92,6 @@ - diff --git a/project/vs2012/Easy2D.vcxproj.filters b/project/vs2012/Easy2D.vcxproj.filters index b6ff1f86..00020b43 100644 --- a/project/vs2012/Easy2D.vcxproj.filters +++ b/project/vs2012/Easy2D.vcxproj.filters @@ -19,9 +19,6 @@ {6c9657de-02d5-4d3b-9e1d-bc921eb5aea3} - - {9031e36b-fa85-4b4e-8e80-657c7e68f283} - {563b19f2-4c5e-4362-983a-94d2ae724550} @@ -102,18 +99,9 @@ modules - - modules - modules - - modules - - - modules - utils @@ -156,18 +144,12 @@ impl - - events - events events - - managers - tools @@ -180,9 +162,6 @@ tools - - tools - tools @@ -207,9 +186,6 @@ objects - - objects - objects @@ -234,12 +210,17 @@ utils + + modules + + + modules + - diff --git a/project/vs2013/Easy2D.vcxproj b/project/vs2013/Easy2D.vcxproj index f22a3218..2e36bc9d 100644 --- a/project/vs2013/Easy2D.vcxproj +++ b/project/vs2013/Easy2D.vcxproj @@ -186,20 +186,16 @@ - - + - - - + - @@ -210,7 +206,6 @@ - @@ -241,7 +236,6 @@ - diff --git a/project/vs2013/Easy2D.vcxproj.filters b/project/vs2013/Easy2D.vcxproj.filters index b6ff1f86..00020b43 100644 --- a/project/vs2013/Easy2D.vcxproj.filters +++ b/project/vs2013/Easy2D.vcxproj.filters @@ -19,9 +19,6 @@ {6c9657de-02d5-4d3b-9e1d-bc921eb5aea3} - - {9031e36b-fa85-4b4e-8e80-657c7e68f283} - {563b19f2-4c5e-4362-983a-94d2ae724550} @@ -102,18 +99,9 @@ modules - - modules - modules - - modules - - - modules - utils @@ -156,18 +144,12 @@ impl - - events - events events - - managers - tools @@ -180,9 +162,6 @@ tools - - tools - tools @@ -207,9 +186,6 @@ objects - - objects - objects @@ -234,12 +210,17 @@ utils + + modules + + + modules + - diff --git a/project/vs2017/Easy2D.vcxproj b/project/vs2017/Easy2D.vcxproj index 1e4a0ed4..cb3b0103 100644 --- a/project/vs2017/Easy2D.vcxproj +++ b/project/vs2017/Easy2D.vcxproj @@ -219,20 +219,16 @@ - - + - - - @@ -243,7 +239,6 @@ - @@ -274,7 +269,6 @@ - diff --git a/project/vs2017/Easy2D.vcxproj.filters b/project/vs2017/Easy2D.vcxproj.filters index 00c7e0cc..00020b43 100644 --- a/project/vs2017/Easy2D.vcxproj.filters +++ b/project/vs2017/Easy2D.vcxproj.filters @@ -19,9 +19,6 @@ {6c9657de-02d5-4d3b-9e1d-bc921eb5aea3} - - {9031e36b-fa85-4b4e-8e80-657c7e68f283} - {563b19f2-4c5e-4362-983a-94d2ae724550} @@ -102,15 +99,9 @@ modules - - modules - modules - - modules - utils @@ -153,18 +144,12 @@ impl - - events - events events - - managers - tools @@ -177,9 +162,6 @@ tools - - tools - tools @@ -204,9 +186,6 @@ objects - - objects - objects @@ -234,12 +213,14 @@ modules + + modules + -