From 50d9575631ed6bc5a8e0d531784b32e49a6fa86d Mon Sep 17 00:00:00 2001
From: Nomango <569629550@qq.com>
Date: Fri, 13 Oct 2017 11:42:36 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EEMsgManager?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 2 +
Demo/Demo.vcxproj | 156 +++++++++++
Demo/Demo.vcxproj.filters | 22 ++
Demo/main.cpp | 24 ++
Easy2D.sln | 26 +-
Easy2D/Action/Action.cpp | 85 ------
Easy2D/Action/ActionCallback.cpp | 31 ---
Easy2D/Action/ActionDelay.cpp | 39 ---
Easy2D/Action/ActionFrames.cpp | 83 ------
Easy2D/Action/ActionMoveBy.cpp | 51 ----
Easy2D/Action/ActionMoveTo.cpp | 27 --
Easy2D/Action/ActionNeverStop.cpp | 39 ---
Easy2D/Action/ActionOpacityBy.cpp | 50 ----
Easy2D/Action/ActionOpacityTo.cpp | 27 --
Easy2D/Action/ActionScaleBy.cpp | 52 ----
Easy2D/Action/ActionScaleTo.cpp | 29 --
Easy2D/Action/ActionSequence.cpp | 105 --------
Easy2D/Action/ActionTwo.cpp | 70 -----
Easy2D/Action/Animation.cpp | 45 ----
Easy2D/Base/EApp.cpp | 152 ++++++-----
Easy2D/Base/EScene.cpp | 9 +-
Easy2D/Easy2D.vcxproj | 191 +------------
Easy2D/Easy2D.vcxproj.filters | 73 ++---
Easy2D/EasyX/easyx.h | 321 ----------------------
Easy2D/EasyX/x64/EasyXa.lib | Bin 261406 -> 0 bytes
Easy2D/EasyX/x64/EasyXw.lib | Bin 263840 -> 0 bytes
Easy2D/EasyX/x86/EasyXa.lib | Bin 184974 -> 0 bytes
Easy2D/EasyX/x86/EasyXw.lib | Bin 187270 -> 0 bytes
Easy2D/Msg/KeyMsg.cpp | 314 ----------------------
Easy2D/Msg/MouseMsg.cpp | 223 ---------------
Easy2D/Node/BatchNode.cpp | 190 -------------
Easy2D/Node/BatchSprite.cpp | 260 ------------------
Easy2D/Node/Button/Button.cpp | 80 ------
Easy2D/Node/Button/ImageButton.cpp | 172 ------------
Easy2D/Node/Button/TextButton.cpp | 172 ------------
Easy2D/Node/ENode.cpp | 15 +-
Easy2D/Node/Image.cpp | 251 -----------------
Easy2D/Node/Layer.cpp | 27 --
Easy2D/Node/MouseNode.cpp | 174 ------------
Easy2D/Node/RectNode.cpp | 139 ----------
Easy2D/Node/Shape/Circle.cpp | 43 ---
Easy2D/Node/Shape/Rectangle.cpp | 58 ----
Easy2D/Node/Shape/Shape.cpp | 64 -----
Easy2D/Node/Sprite.cpp | 147 ----------
Easy2D/Node/Text.cpp | 91 -------
Easy2D/Style/Color.cpp | 56 ----
Easy2D/Style/FillStyle.cpp | 1 -
Easy2D/Style/FontStyle.cpp | 103 -------
Easy2D/Style/LineStyle.cpp | 1 -
Easy2D/Tool/ActionManager.cpp | 200 --------------
Easy2D/Tool/EMouseListener.cpp | 1 +
Easy2D/Tool/EMsgManager.cpp | 86 ++++++
Easy2D/Tool/FileUtils.cpp | 168 ------------
Easy2D/Tool/Math.cpp | 9 -
Easy2D/Tool/MusicUtils.cpp | 417 -----------------------------
Easy2D/Tool/Timer.cpp | 223 ---------------
Easy2D/Win/winbase.cpp | 12 +-
Easy2D/Win/winbase.h | 1 +
Easy2D/easy2d.h | 35 +--
Easy2D/ebase.h | 7 +-
Easy2D/emacros.h | 22 ++
Easy2D/enodes.h | 2 +-
Easy2D/etools.h | 62 ++++-
63 files changed, 553 insertions(+), 4982 deletions(-)
create mode 100644 Demo/Demo.vcxproj
create mode 100644 Demo/Demo.vcxproj.filters
create mode 100644 Demo/main.cpp
delete mode 100644 Easy2D/Action/Action.cpp
delete mode 100644 Easy2D/Action/ActionCallback.cpp
delete mode 100644 Easy2D/Action/ActionDelay.cpp
delete mode 100644 Easy2D/Action/ActionFrames.cpp
delete mode 100644 Easy2D/Action/ActionMoveBy.cpp
delete mode 100644 Easy2D/Action/ActionMoveTo.cpp
delete mode 100644 Easy2D/Action/ActionNeverStop.cpp
delete mode 100644 Easy2D/Action/ActionOpacityBy.cpp
delete mode 100644 Easy2D/Action/ActionOpacityTo.cpp
delete mode 100644 Easy2D/Action/ActionScaleBy.cpp
delete mode 100644 Easy2D/Action/ActionScaleTo.cpp
delete mode 100644 Easy2D/Action/ActionSequence.cpp
delete mode 100644 Easy2D/Action/ActionTwo.cpp
delete mode 100644 Easy2D/Action/Animation.cpp
delete mode 100644 Easy2D/EasyX/easyx.h
delete mode 100644 Easy2D/EasyX/x64/EasyXa.lib
delete mode 100644 Easy2D/EasyX/x64/EasyXw.lib
delete mode 100644 Easy2D/EasyX/x86/EasyXa.lib
delete mode 100644 Easy2D/EasyX/x86/EasyXw.lib
delete mode 100644 Easy2D/Msg/KeyMsg.cpp
delete mode 100644 Easy2D/Msg/MouseMsg.cpp
delete mode 100644 Easy2D/Node/BatchNode.cpp
delete mode 100644 Easy2D/Node/BatchSprite.cpp
delete mode 100644 Easy2D/Node/Button/Button.cpp
delete mode 100644 Easy2D/Node/Button/ImageButton.cpp
delete mode 100644 Easy2D/Node/Button/TextButton.cpp
delete mode 100644 Easy2D/Node/Image.cpp
delete mode 100644 Easy2D/Node/Layer.cpp
delete mode 100644 Easy2D/Node/MouseNode.cpp
delete mode 100644 Easy2D/Node/RectNode.cpp
delete mode 100644 Easy2D/Node/Shape/Circle.cpp
delete mode 100644 Easy2D/Node/Shape/Rectangle.cpp
delete mode 100644 Easy2D/Node/Shape/Shape.cpp
delete mode 100644 Easy2D/Node/Sprite.cpp
delete mode 100644 Easy2D/Node/Text.cpp
delete mode 100644 Easy2D/Style/Color.cpp
delete mode 100644 Easy2D/Style/FillStyle.cpp
delete mode 100644 Easy2D/Style/FontStyle.cpp
delete mode 100644 Easy2D/Style/LineStyle.cpp
delete mode 100644 Easy2D/Tool/ActionManager.cpp
create mode 100644 Easy2D/Tool/EMouseListener.cpp
create mode 100644 Easy2D/Tool/EMsgManager.cpp
delete mode 100644 Easy2D/Tool/FileUtils.cpp
delete mode 100644 Easy2D/Tool/Math.cpp
delete mode 100644 Easy2D/Tool/MusicUtils.cpp
delete mode 100644 Easy2D/Tool/Timer.cpp
diff --git a/.gitignore b/.gitignore
index c0da8165..86bb91a8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,8 @@ Easy2D/Win32/
Easy2D/x64/
/Win32/
/x64/
+Debug/
+Release/
backup/
*.lnk
.vs
\ No newline at end of file
diff --git a/Demo/Demo.vcxproj b/Demo/Demo.vcxproj
new file mode 100644
index 00000000..98bd4630
--- /dev/null
+++ b/Demo/Demo.vcxproj
@@ -0,0 +1,156 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 15.0
+ {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}
+ Win32Proj
+ Demo
+ 10.0.15063.0
+
+
+
+ Application
+ true
+ v141
+ Unicode
+
+
+ Application
+ false
+ v141
+ true
+ Unicode
+
+
+ Application
+ true
+ v141
+ Unicode
+
+
+ Application
+ false
+ v141
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(MSBuildProjectDirectory)\..\Win32;$(LibraryPath)
+
+
+ true
+
+
+ false
+
+
+ false
+
+
+
+
+
+ Level3
+ Disabled
+ WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ true
+
+
+ Windows
+ true
+
+
+
+
+
+
+ Level3
+ Disabled
+ _DEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ true
+
+
+ Windows
+ true
+
+
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ true
+
+
+ Windows
+ true
+ true
+ true
+
+
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ NDEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ true
+
+
+ Windows
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Demo/Demo.vcxproj.filters b/Demo/Demo.vcxproj.filters
new file mode 100644
index 00000000..203a71c4
--- /dev/null
+++ b/Demo/Demo.vcxproj.filters
@@ -0,0 +1,22 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ 源文件
+
+
+
\ No newline at end of file
diff --git a/Demo/main.cpp b/Demo/main.cpp
new file mode 100644
index 00000000..22db1191
--- /dev/null
+++ b/Demo/main.cpp
@@ -0,0 +1,24 @@
+#include "..\Easy2D\easy2d.h"
+#pragma comment(lib, "d2d1.lib")
+
+
+int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
+{
+ EApp app;
+
+ if (app.init(L"Easy2D Demo", 640, 480))
+ {
+ auto scene = new EScene();
+
+ auto node = new ENode();
+ node->setPos(50, 80);
+ node->setSize(30, 180);
+ scene->add(node);
+
+ app.enterScene(scene);
+
+ app.run();
+ }
+
+ return 0;
+}
diff --git a/Easy2D.sln b/Easy2D.sln
index 6b3b67bc..2c6780c3 100644
--- a/Easy2D.sln
+++ b/Easy2D.sln
@@ -1,38 +1,38 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
-VisualStudioVersion = 15.0.26730.12
+VisualStudioVersion = 15.0.26730.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Easy2D", "Easy2D\Easy2D.vcxproj", "{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo", "Demo\Demo.vcxproj", "{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
- DebugW|x64 = DebugW|x64
- DebugW|x86 = DebugW|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
- ReleaseW|x64 = ReleaseW|x64
- ReleaseW|x86 = ReleaseW|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.ActiveCfg = Debug|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.Build.0 = Debug|x64
+ {FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.Deploy.0 = Debug|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.ActiveCfg = Debug|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.Build.0 = Debug|Win32
- {FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.DebugW|x64.ActiveCfg = DebugW|x64
- {FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.DebugW|x64.Build.0 = DebugW|x64
- {FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.DebugW|x86.ActiveCfg = DebugW|Win32
- {FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.DebugW|x86.Build.0 = DebugW|Win32
+ {FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.Deploy.0 = Debug|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x64.ActiveCfg = Release|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x64.Build.0 = Release|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x86.ActiveCfg = Release|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x86.Build.0 = Release|Win32
- {FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.ReleaseW|x64.ActiveCfg = ReleaseW|x64
- {FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.ReleaseW|x64.Build.0 = ReleaseW|x64
- {FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.ReleaseW|x86.ActiveCfg = ReleaseW|Win32
- {FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.ReleaseW|x86.Build.0 = ReleaseW|Win32
+ {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Debug|x64.ActiveCfg = Debug|x64
+ {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Debug|x64.Build.0 = Debug|x64
+ {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Debug|x86.ActiveCfg = Debug|Win32
+ {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Debug|x86.Build.0 = Debug|Win32
+ {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x64.ActiveCfg = Release|x64
+ {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x64.Build.0 = Release|x64
+ {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x86.ActiveCfg = Release|Win32
+ {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Easy2D/Action/Action.cpp b/Easy2D/Action/Action.cpp
deleted file mode 100644
index 1d99e527..00000000
--- a/Easy2D/Action/Action.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-#include "..\easy2d.h"
-#include
-
-Action::Action() :
- m_bRunning(true),
- m_bWaiting(false),
- m_bEnding(false),
- m_bInit(false),
- m_pTargetSprite(nullptr),
- m_pParentScene(nullptr)
-{
- // Ĭ϶ 15ms һ
- setInterval(15);
-}
-
-Action::~Action()
-{
-}
-
-bool Action::isRunning()
-{
- return m_bRunning && !m_bWaiting;
-}
-
-bool Action::isEnding()
-{
- return m_bEnding;
-}
-
-void Action::start()
-{
- m_bRunning = true;
-}
-
-void Action::resume()
-{
- m_bRunning = true;
-}
-
-void Action::pause()
-{
- m_bRunning = false;
-}
-
-void Action::stop()
-{
- m_bEnding = true;
-}
-void Action::wait()
-{
- m_bWaiting = true;
-}
-
-void Action::notify()
-{
- m_bWaiting = false;
-}
-
-void Action::setInterval(LONGLONG milliSeconds)
-{
- // öʱ
- m_nAnimationInterval = milliSeconds;
-}
-
-Action * Action::reverse() const
-{
- assert(0);
- return nullptr;
-}
-
-Sprite * Action::getTarget()
-{
- return m_pTargetSprite;
-}
-
-void Action::_init()
-{
- m_bInit = true;
-}
-
-void Action::_reset()
-{
- m_bInit = false;
- m_bEnding = false;
-}
diff --git a/Easy2D/Action/ActionCallback.cpp b/Easy2D/Action/ActionCallback.cpp
deleted file mode 100644
index c1cf46e1..00000000
--- a/Easy2D/Action/ActionCallback.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "..\easy2d.h"
-
-ActionCallback::ActionCallback(const std::function& callback) :
- m_Callback(callback)
-{
-}
-
-ActionCallback::~ActionCallback()
-{
-}
-
-ActionCallback * ActionCallback::copy() const
-{
- return new ActionCallback(m_Callback);
-}
-
-void ActionCallback::_init()
-{
- Action::_init();
-}
-
-void ActionCallback::_exec(std::chrono::steady_clock::time_point nNow)
-{
- m_Callback();
- this->stop();
-}
-
-void ActionCallback::_reset()
-{
- Action::_reset();
-}
diff --git a/Easy2D/Action/ActionDelay.cpp b/Easy2D/Action/ActionDelay.cpp
deleted file mode 100644
index 4e5c8b6a..00000000
--- a/Easy2D/Action/ActionDelay.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "..\easy2d.h"
-#include "..\Win\winbase.h"
-
-ActionDelay::ActionDelay(float duration)
-{
- setInterval(LONGLONG(duration * 1000));
-}
-
-ActionDelay::~ActionDelay()
-{
-}
-
-ActionDelay * ActionDelay::copy() const
-{
- return new ActionDelay(m_nAnimationInterval / 1000.0f);
-}
-
-void ActionDelay::_init()
-{
- Action::_init();
- // ¼ǰʱ
- m_nLast = steady_clock::now();
-}
-
-void ActionDelay::_exec(steady_clock::time_point nNow)
-{
- // жʱǷ㹻
- if (duration_cast(nNow - m_nLast).count() > m_nAnimationInterval)
- {
- this->stop();
- }
-}
-
-void ActionDelay::_reset()
-{
- Action::_reset();
- // ¼ǰʱ
- m_nLast = steady_clock::now();
-}
diff --git a/Easy2D/Action/ActionFrames.cpp b/Easy2D/Action/ActionFrames.cpp
deleted file mode 100644
index 582bf48b..00000000
--- a/Easy2D/Action/ActionFrames.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#include "..\easy2d.h"
-#include "..\Win\winbase.h"
-
-ActionFrames::ActionFrames() :
- m_nFrameIndex(0)
-{
- // ֡Ĭ .5s ˢһ
- setInterval(500);
-}
-
-ActionFrames::ActionFrames(LONGLONG frameDelay) :
- m_nFrameIndex(0)
-{
- setInterval(frameDelay);
-}
-
-ActionFrames::~ActionFrames()
-{
- for (auto frame : m_vFrames)
- {
- frame->autoRelease();
- frame->release();
- }
-}
-
-void ActionFrames::_init()
-{
- Action::_init();
- // ¼ǰʱ
- m_nLast = steady_clock::now();
-}
-
-void ActionFrames::_exec(steady_clock::time_point nNow)
-{
- // жʱǷ㹻
- while (duration_cast(nNow - m_nLast).count() > m_nAnimationInterval)
- {
- // ¼¼ʱ
- m_nLast += milliseconds(m_nAnimationInterval);
- m_pTargetSprite->setImage(m_vFrames[m_nFrameIndex]);
- m_nFrameIndex++;
- // ж϶Ƿ
- if (m_nFrameIndex == m_vFrames.size())
- {
- this->stop();
- break;
- }
- }
-}
-
-void ActionFrames::_reset()
-{
- Action::_reset();
- m_nFrameIndex = 0;
- // ¼ǰʱ
- m_nLast = steady_clock::now();
-}
-
-void ActionFrames::addFrame(Image * frame)
-{
- if (frame)
- {
- m_vFrames.push_back(frame);
- frame->retain();
- }
-}
-
-ActionFrames * ActionFrames::copy() const
-{
- auto a = new ActionFrames(this->m_nAnimationInterval);
- for (auto f : m_vFrames)
- {
- a->addFrame(f);
- }
- return a;
-}
-
-ActionFrames * ActionFrames::reverse() const
-{
- auto a = this->copy();
- a->m_vFrames.reserve(m_vFrames.size());
- return a;
-}
diff --git a/Easy2D/Action/ActionMoveBy.cpp b/Easy2D/Action/ActionMoveBy.cpp
deleted file mode 100644
index ebc83a66..00000000
--- a/Easy2D/Action/ActionMoveBy.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "..\easy2d.h"
-#include "..\Win\winbase.h"
-
-ActionMoveBy::ActionMoveBy(float duration, CVector vec) :
- Animation(duration)
-{
- m_MoveVector = vec;
-}
-
-ActionMoveBy::~ActionMoveBy()
-{
-}
-
-void ActionMoveBy::_init()
-{
- Animation::_init();
- m_BeginPos = m_pTargetSprite->getPos();
-}
-
-void ActionMoveBy::_exec(steady_clock::time_point nNow)
-{
- while (Animation::_isDelayEnough(nNow))
- {
- // ƶλ
- float scale = float(m_nDuration) / m_nTotalDuration;
- // ƶ Sprite
- m_pTargetSprite->setPos(int(m_BeginPos.x + m_MoveVector.x * scale),
- int(m_BeginPos.y + m_MoveVector.y * scale));
- // ж϶Ƿ
- if (_isEnd())
- {
- this->stop();
- break;
- }
- }
-}
-
-void ActionMoveBy::_reset()
-{
- Animation::_reset();
-}
-
-ActionMoveBy * ActionMoveBy::copy() const
-{
- return new ActionMoveBy(m_nAnimationInterval / 1000.0f, m_MoveVector);
-}
-
-ActionMoveBy * ActionMoveBy::reverse() const
-{
- return new ActionMoveBy(m_nTotalDuration / 1000.0f, CVector(-m_MoveVector.x, -m_MoveVector.y));
-}
\ No newline at end of file
diff --git a/Easy2D/Action/ActionMoveTo.cpp b/Easy2D/Action/ActionMoveTo.cpp
deleted file mode 100644
index c4249317..00000000
--- a/Easy2D/Action/ActionMoveTo.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "..\easy2d.h"
-
-ActionMoveTo::ActionMoveTo(float duration, CPoint pos) :
- ActionMoveBy(duration, CVector())
-{
- m_EndPos = pos;
-}
-
-ActionMoveTo::~ActionMoveTo()
-{
-}
-
-ActionMoveTo * ActionMoveTo::copy() const
-{
- return new ActionMoveTo(m_nAnimationInterval / 1000.0f, m_EndPos);
-}
-
-void ActionMoveTo::_init()
-{
- ActionMoveBy::_init();
- m_MoveVector = m_EndPos - m_BeginPos;
-}
-
-void ActionMoveTo::_reset()
-{
- ActionMoveBy::_reset();
-}
diff --git a/Easy2D/Action/ActionNeverStop.cpp b/Easy2D/Action/ActionNeverStop.cpp
deleted file mode 100644
index ac11b65c..00000000
--- a/Easy2D/Action/ActionNeverStop.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "..\easy2d.h"
-
-ActionNeverStop::ActionNeverStop(Action * action) :
- m_Action(action)
-{
- m_Action->retain();
-}
-
-ActionNeverStop::~ActionNeverStop()
-{
- SafeRelease(m_Action);
-}
-
-ActionNeverStop * ActionNeverStop::copy() const
-{
- return new ActionNeverStop(m_Action->copy());
-}
-
-void ActionNeverStop::_init()
-{
- Action::_init();
- m_Action->m_pTargetSprite = m_pTargetSprite;
- m_Action->_init();
-}
-
-void ActionNeverStop::_exec(std::chrono::steady_clock::time_point nNow)
-{
- m_Action->_exec(nNow);
-
- if (m_Action->isEnding())
- {
- m_Action->_reset();
- }
-}
-
-void ActionNeverStop::_reset()
-{
- Action::_reset();
-}
diff --git a/Easy2D/Action/ActionOpacityBy.cpp b/Easy2D/Action/ActionOpacityBy.cpp
deleted file mode 100644
index 2d9ea7c0..00000000
--- a/Easy2D/Action/ActionOpacityBy.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "..\easy2d.h"
-#include "..\Win\winbase.h"
-
-ActionOpacityBy::ActionOpacityBy(float duration, float opacity) :
- Animation(duration)
-{
- m_nVariation = opacity;
-}
-
-ActionOpacityBy::~ActionOpacityBy()
-{
-}
-
-void ActionOpacityBy::_init()
-{
- Animation::_init();
- m_nBeginVal = m_pTargetSprite->getOpacity();
-}
-
-void ActionOpacityBy::_exec(steady_clock::time_point nNow)
-{
- while (Animation::_isDelayEnough(nNow))
- {
- // ƶλ
- float scale = float(m_nDuration) / m_nTotalDuration;
- // ƶ Sprite
- m_pTargetSprite->setOpacity(m_nBeginVal + m_nVariation * scale);
- // ж϶Ƿ
- if (_isEnd())
- {
- this->stop();
- break;
- }
- }
-}
-
-void ActionOpacityBy::_reset()
-{
- Animation::_reset();
-}
-
-ActionOpacityBy * ActionOpacityBy::copy() const
-{
- return new ActionOpacityBy(m_nAnimationInterval / 1000.0f, m_nVariation);
-}
-
-ActionOpacityBy * ActionOpacityBy::reverse() const
-{
- return new ActionOpacityBy(m_nTotalDuration / 1000.0f, -m_nVariation);
-}
\ No newline at end of file
diff --git a/Easy2D/Action/ActionOpacityTo.cpp b/Easy2D/Action/ActionOpacityTo.cpp
deleted file mode 100644
index 5bd7c001..00000000
--- a/Easy2D/Action/ActionOpacityTo.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "..\easy2d.h"
-
-ActionOpacityTo::ActionOpacityTo(float duration, float opacity) :
- ActionOpacityBy(duration, 0)
-{
- m_nEndVal = opacity;
-}
-
-ActionOpacityTo::~ActionOpacityTo()
-{
-}
-
-ActionOpacityTo * ActionOpacityTo::copy() const
-{
- return new ActionOpacityTo(m_nAnimationInterval / 1000.0f, m_nEndVal);
-}
-
-void ActionOpacityTo::_init()
-{
- ActionOpacityBy::_init();
- m_nVariation = m_nEndVal - m_nBeginVal;
-}
-
-void ActionOpacityTo::_reset()
-{
- ActionOpacityBy::_reset();
-}
diff --git a/Easy2D/Action/ActionScaleBy.cpp b/Easy2D/Action/ActionScaleBy.cpp
deleted file mode 100644
index b86f0f5c..00000000
--- a/Easy2D/Action/ActionScaleBy.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#include "..\easy2d.h"
-#include "..\Win\winbase.h"
-
-ActionScaleBy::ActionScaleBy(float duration, float scaleX, float scaleY) :
- Animation(duration)
-{
- m_nVariationX = scaleX;
- m_nVariationY = scaleY;
-}
-
-ActionScaleBy::~ActionScaleBy()
-{
-}
-
-void ActionScaleBy::_init()
-{
- Animation::_init();
- m_nBeginScaleX = m_pTargetSprite->getScaleX();
- m_nBeginScaleY = m_pTargetSprite->getScaleY();
-}
-
-void ActionScaleBy::_exec(steady_clock::time_point nNow)
-{
- while (Animation::_isDelayEnough(nNow))
- {
- // ƶλ
- float scale = float(m_nDuration) / m_nTotalDuration;
- // ƶ Sprite
- m_pTargetSprite->setScale(m_nBeginScaleX + m_nVariationX * scale, m_nBeginScaleX + m_nVariationX * scale);
- // ж϶Ƿ
- if (_isEnd())
- {
- this->stop();
- break;
- }
- }
-}
-
-void ActionScaleBy::_reset()
-{
- Animation::_reset();
-}
-
-ActionScaleBy * ActionScaleBy::copy() const
-{
- return new ActionScaleBy(m_nAnimationInterval / 1000.0f, m_nVariationX, m_nVariationY);
-}
-
-ActionScaleBy * ActionScaleBy::reverse() const
-{
- return new ActionScaleBy(m_nTotalDuration / 1000.0f, -m_nVariationX, -m_nVariationY);
-}
\ No newline at end of file
diff --git a/Easy2D/Action/ActionScaleTo.cpp b/Easy2D/Action/ActionScaleTo.cpp
deleted file mode 100644
index 76b8fdcc..00000000
--- a/Easy2D/Action/ActionScaleTo.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "..\easy2d.h"
-
-ActionScaleTo::ActionScaleTo(float duration, float scaleX, float scaleY) :
- ActionScaleBy(duration, 0, 0)
-{
- m_nEndScaleX = scaleX;
- m_nEndScaleY = scaleY;
-}
-
-ActionScaleTo::~ActionScaleTo()
-{
-}
-
-ActionScaleTo * ActionScaleTo::copy() const
-{
- return new ActionScaleTo(m_nAnimationInterval / 1000.0f, m_nEndScaleX, m_nEndScaleY);
-}
-
-void ActionScaleTo::_init()
-{
- ActionScaleBy::_init();
- m_nVariationX = m_nEndScaleX - m_nBeginScaleX;
- m_nVariationY = m_nEndScaleY - m_nBeginScaleY;
-}
-
-void ActionScaleTo::_reset()
-{
- ActionScaleBy::_reset();
-}
diff --git a/Easy2D/Action/ActionSequence.cpp b/Easy2D/Action/ActionSequence.cpp
deleted file mode 100644
index 911dfde9..00000000
--- a/Easy2D/Action/ActionSequence.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#include "..\easy2d.h"
-#include
-
-ActionSequence::ActionSequence() :
- m_nActionIndex(0)
-{
-}
-
-ActionSequence::ActionSequence(int number, Action * action1, ...) :
- m_nActionIndex(0)
-{
- va_list params;
- va_start(params, number);
-
- while (number > 0)
- {
- this->addAction(va_arg(params, Action*));
- number--;
- }
-
- va_end(params);
-}
-
-ActionSequence::~ActionSequence()
-{
- for (auto action : m_vActions)
- {
- SafeRelease(action);
- }
-}
-
-void ActionSequence::_init()
-{
- Action::_init();
- // жĿ
- for (auto action : m_vActions)
- {
- action->m_pTargetSprite = m_pTargetSprite;
- }
- // ʼһ
- m_vActions[0]->_init();
-}
-
-void ActionSequence::_exec(std::chrono::steady_clock::time_point nNow)
-{
- m_vActions[m_nActionIndex]->_exec(nNow);
-
- if (m_vActions[m_nActionIndex]->isEnding())
- {
- m_nActionIndex++;
- if (m_nActionIndex == m_vActions.size())
- {
- this->stop();
- }
- else
- {
- m_vActions[m_nActionIndex]->_init();
- }
- }
-}
-
-void ActionSequence::_reset()
-{
- Action::_reset();
- for (auto action : m_vActions)
- {
- action->_reset();
- }
- m_nActionIndex = 0;
-}
-
-void ActionSequence::addAction(Action * action)
-{
- m_vActions.push_back(action);
- action->retain();
-}
-
-ActionSequence * ActionSequence::copy() const
-{
- auto a = new ActionSequence();
- for (auto action : m_vActions)
- {
- a->addAction(action->copy());
- }
- return a;
-}
-
-ActionSequence * ActionSequence::reverse(bool actionReverse) const
-{
- auto a = new ActionSequence();
- for (auto action : a->m_vActions)
- {
- if (actionReverse)
- {
- a->addAction(action->reverse());
- }
- else
- {
- a->addAction(action->copy());
- }
- }
- // ˳
- a->m_vActions.reserve(m_vActions.size());
- return a;
-}
\ No newline at end of file
diff --git a/Easy2D/Action/ActionTwo.cpp b/Easy2D/Action/ActionTwo.cpp
deleted file mode 100644
index 669ebcd4..00000000
--- a/Easy2D/Action/ActionTwo.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#include "..\easy2d.h"
-
-ActionTwo::ActionTwo(Action * actionFirst, Action * actionSecond) :
- m_FirstAction(actionFirst),
- m_SecondAction(actionSecond)
-{
- m_FirstAction->retain();
- m_SecondAction->retain();
-}
-
-ActionTwo::~ActionTwo()
-{
- SafeRelease(m_FirstAction);
- SafeRelease(m_SecondAction);
-}
-
-ActionTwo * ActionTwo::copy() const
-{
- return new ActionTwo(m_FirstAction->copy(), m_SecondAction->copy());
-}
-
-ActionTwo * ActionTwo::reverse(bool actionReverse) const
-{
- if (actionReverse)
- {
- return new ActionTwo(m_SecondAction->reverse(), m_FirstAction->reverse());
- }
- else
- {
- return new ActionTwo(m_SecondAction->copy(), m_FirstAction->copy());
- }
-}
-
-void ActionTwo::_init()
-{
- Action::_init();
- m_FirstAction->m_pTargetSprite = m_pTargetSprite;
- m_SecondAction->m_pTargetSprite = m_pTargetSprite;
-
- m_FirstAction->_init();
-}
-
-void ActionTwo::_exec(std::chrono::steady_clock::time_point nNow)
-{
- if (!m_FirstAction->isEnding())
- {
- m_FirstAction->_exec(nNow);
- if (m_FirstAction->isEnding())
- {
- // true ʾһѾ
- m_SecondAction->_init();
- }
- }
- else if (!m_SecondAction->isEnding())
- {
- m_SecondAction->_exec(nNow);
- }
- else
- {
- this->stop();
- }
-}
-
-void ActionTwo::_reset()
-{
- Action::_reset();
-
- m_FirstAction->_reset();
- m_SecondAction->_reset();
-}
diff --git a/Easy2D/Action/Animation.cpp b/Easy2D/Action/Animation.cpp
deleted file mode 100644
index 0ad44d20..00000000
--- a/Easy2D/Action/Animation.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#include "..\easy2d.h"
-#include "..\Win\winbase.h"
-
-Animation::Animation(float duration)
-{
- m_nDuration = 0;
- m_nTotalDuration = UINT(duration * 1000);
-}
-
-Animation::~Animation()
-{
-}
-
-bool Animation::_isEnd() const
-{
- return m_nDuration >= m_nTotalDuration;
-}
-
-void Animation::_init()
-{
- Action::_init();
- // ¼ǰʱ
- m_nLast = steady_clock::now();
-}
-
-bool Animation::_isDelayEnough(steady_clock::time_point nNow)
-{
- // жʱǷ㹻
- if (duration_cast(nNow - m_nLast).count() > m_nAnimationInterval)
- {
- // ¼¼ʱ
- m_nLast += milliseconds(m_nAnimationInterval);
- m_nDuration += m_nAnimationInterval;
- return true;
- }
- return false;
-}
-
-void Animation::_reset()
-{
- Action::_reset();
- m_nDuration = 0;
- // ¼ǰʱ
- m_nLast = steady_clock::now();
-}
diff --git a/Easy2D/Base/EApp.cpp b/Easy2D/Base/EApp.cpp
index b19cb5e7..622ae220 100644
--- a/Easy2D/Base/EApp.cpp
+++ b/Easy2D/Base/EApp.cpp
@@ -1,5 +1,6 @@
#include "..\ebase.h"
#include "..\Win\winbase.h"
+#include "..\etools.h"
#include
#include
#include
@@ -18,7 +19,7 @@ std::stack s_SceneStack;
e2d::EApp::EApp()
: m_bRunning(false)
- , m_ClearColor(EColor::White)
+ , m_ClearColor(EColor::Black)
, m_bSaveScene(true)
, m_pCurrentScene(nullptr)
, m_pNextScene(nullptr)
@@ -46,72 +47,74 @@ bool e2d::EApp::init(e2d::EString title, e2d::ESize size, bool bShowConsole /* =
bool e2d::EApp::init(e2d::EString title, UINT32 width, UINT32 height, bool bShowConsole /* = false */)
{
- m_sTitle = title;
-
HRESULT hr;
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
- // رտ̨.
- if (bShowConsole)
+ // رտ̨
+ if (!bShowConsole)
{
- HWND hwnd = FindWindow(L"ConsoleWindowClass", NULL);
+ HWND consoleHWnd = FindWindow(L"ConsoleWindowClass", NULL);
- if (hwnd)
+ if (consoleHWnd)
{
- ShowWindow(hwnd, SW_HIDE);
+ ShowWindow(consoleHWnd, SW_HIDE);
}
}
+
+ // ʼ device-indpendent Դ
+ // Direct2D factory.
+ hr = _createDeviceIndependentResources();
}
if (SUCCEEDED(hr))
{
- // ʼ device-indpendent Դ
- // Direct2D factory.
- hr = _createDeviceIndependentResources();
+ // עᴰ
+ WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
+ wcex.style = CS_HREDRAW | CS_VREDRAW;
+ wcex.lpfnWndProc = EApp::WndProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = sizeof(LONG_PTR);
+ wcex.hInstance = HINST_THISCOMPONENT;
+ wcex.hbrBackground = NULL;
+ wcex.lpszMenuName = NULL;
+ wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION);
+ wcex.lpszClassName = L"E2DApp";
- if (SUCCEEDED(hr))
+ RegisterClassEx(&wcex);
+
+
+ // Because the CreateWindow function takes its size in pixels,
+ // obtain the system DPI and use it to scale the window size.
+ FLOAT dpiX, dpiY;
+
+ // The factory returns the current system DPI. This is also the value it will use
+ // to create its own windows.
+ GetFactory()->GetDesktopDpi(&dpiX, &dpiY);
+
+ m_sTitle = title;
+
+ // Create the window.
+ GetHWnd() = CreateWindow(
+ L"E2DApp",
+ m_sTitle.c_str(),
+ WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ static_cast(ceil(width * dpiX / 96.f)),
+ static_cast(ceil(height * dpiY / 96.f)),
+ NULL,
+ NULL,
+ HINST_THISCOMPONENT,
+ this
+ );
+
+ hr = GetHWnd() ? S_OK : E_FAIL;
+ if (FAILED(hr))
{
- // עᴰ
- WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
- wcex.style = CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc = EApp::WndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = sizeof(LONG_PTR);
- wcex.hInstance = HINST_THISCOMPONENT;
- wcex.hbrBackground = NULL;
- wcex.lpszMenuName = NULL;
- wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION);
- wcex.lpszClassName = L"E2DApp";
-
- RegisterClassEx(&wcex);
-
-
- // Because the CreateWindow function takes its size in pixels,
- // obtain the system DPI and use it to scale the window size.
- FLOAT dpiX, dpiY;
-
- // The factory returns the current system DPI. This is also the value it will use
- // to create its own windows.
- GetFactory()->GetDesktopDpi(&dpiX, &dpiY);
-
-
- // Create the window.
- GetHWnd() = CreateWindow(
- L"E2DApp",
- m_sTitle.c_str(),
- WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- static_cast(ceil(width * dpiX / 96.f)),
- static_cast(ceil(height * dpiY / 96.f)),
- NULL,
- NULL,
- HINST_THISCOMPONENT,
- this
- );
- hr = GetHWnd() ? S_OK : E_FAIL;
+ UnregisterClass(L"E2DApp", HINST_THISCOMPONENT);
+ MessageBox(nullptr, L"Create Window Failed!", L"Error", MB_OK);
}
}
@@ -126,6 +129,9 @@ bool e2d::EApp::init(e2d::EString title, UINT32 width, UINT32 height, bool bShow
// Ϸ
void e2d::EApp::run()
{
+ ASSERT(m_pNextScene != nullptr);
+ // һ
+ _enterNextScene();
// ʾ
ShowWindow(GetHWnd(), SW_SHOWNORMAL);
UpdateWindow(GetHWnd());
@@ -181,7 +187,7 @@ void e2d::EApp::_mainLoop()
{
// ¼ǰʱ
nLast = nNow;
- //
+ // ִϷ
_onControl();
// ˢϷ
_onRender();
@@ -213,7 +219,7 @@ void e2d::EApp::_onControl()
//KeyMsg::__exec(); // ̰
//Timer::__exec(); // ʱִг
//ActionManager::__exec(); // ִг
- //EObjectManager::__flush(); // ˢڴ
+ EObjectManager::__flush(); // ˢڴ
}
// This method discards device-specific
@@ -233,7 +239,7 @@ bool e2d::EApp::_onRender()
GetRenderTarget()->Clear(D2D1::ColorF(m_ClearColor));
- m_pCurrentScene->_onDraw(); // Ƶǰ
+ m_pCurrentScene->_onRender(); // Ƶǰ
hr = GetRenderTarget()->EndDraw();
}
@@ -474,7 +480,7 @@ HRESULT e2d::EApp::_createDeviceIndependentResources()
if (FAILED(hr))
{
- MessageBox(nullptr, L"Create Device Independent Resources Fail!", L"Error", MB_OK);
+ MessageBox(nullptr, L"Create Device Independent Resources Failed!", L"Error", MB_OK);
}
return hr;
@@ -506,6 +512,11 @@ HRESULT e2d::EApp::_createDeviceResources()
);
}
+ if (FAILED(hr))
+ {
+ MessageBox(nullptr, L"Create Device Resources Failed!", L"Error", MB_OK);
+ }
+
return hr;
}
@@ -537,10 +548,10 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
if (message == WM_CREATE)
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
- EApp *pEApp = (EApp *)pcs->lpCreateParams;
+ e2d::EApp *pEApp = (e2d::EApp *)pcs->lpCreateParams;
::SetWindowLongPtrW(
- GetHWnd(),
+ hWnd,
GWLP_USERDATA,
PtrToUlong(pEApp)
);
@@ -549,9 +560,9 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
}
else
{
- EApp *pEApp = reinterpret_cast(static_cast(
+ e2d::EApp *pEApp = reinterpret_cast(static_cast(
::GetWindowLongPtrW(
- GetHWnd(),
+ hWnd,
GWLP_USERDATA
)));
@@ -572,6 +583,23 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
} while (msg.wParam != WA_ACTIVE);
}
}*/
+ case WM_LBUTTONUP:
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ case WM_MBUTTONUP:
+ case WM_MBUTTONDOWN:
+ case WM_MBUTTONDBLCLK:
+ case WM_RBUTTONUP:
+ case WM_RBUTTONDOWN:
+ case WM_RBUTTONDBLCLK:
+ case WM_MOUSEMOVE:
+ case WM_MOUSEWHEEL:
+ {
+ EMsgManager::setMouseMsg(message);
+ }
+ result = 0;
+ break;
+
case WM_SIZE:
{
UINT width = LOWORD(lParam);
@@ -584,7 +612,7 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
case WM_DISPLAYCHANGE:
{
- InvalidateRect(GetHWnd(), NULL, FALSE);
+ InvalidateRect(hWnd, NULL, FALSE);
}
result = 0;
wasHandled = true;
@@ -593,7 +621,7 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
case WM_PAINT:
{
pEApp->_onRender();
- ValidateRect(GetHWnd(), NULL);
+ ValidateRect(hWnd, NULL);
}
result = 0;
wasHandled = true;
@@ -611,7 +639,7 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
if (!wasHandled)
{
- result = DefWindowProc(GetHWnd(), message, wParam, lParam);
+ result = DefWindowProc(hWnd, message, wParam, lParam);
}
}
diff --git a/Easy2D/Base/EScene.cpp b/Easy2D/Base/EScene.cpp
index a33dc05d..2de8ed04 100644
--- a/Easy2D/Base/EScene.cpp
+++ b/Easy2D/Base/EScene.cpp
@@ -25,12 +25,12 @@ void e2d::EScene::_exec()
}
}
-void e2d::EScene::_onDraw()
+void e2d::EScene::_onRender()
{
// нڵ
for (auto child : m_vChildren)
{
- child->_onDraw();
+ child->_onRender();
}
}
@@ -46,7 +46,7 @@ void e2d::EScene::onExit()
{
}
-void e2d::EScene::add(ENode * child, int zOrder)
+void e2d::EScene::add(ENode * child, int zOrder /* = 0 */)
{
// ӵĽڵǿ
ASSERT(child != nullptr);
@@ -80,7 +80,7 @@ void e2d::EScene::add(ENode * child, int zOrder)
}
}
-bool e2d::EScene::del(ENode * child)
+bool e2d::EScene::del(ENode * child, bool autoRelease /* = true */)
{
if (child == nullptr) return false;
@@ -91,6 +91,7 @@ bool e2d::EScene::del(ENode * child)
// ҵͬڵ
if (*iter == child)
{
+ if (autoRelease) (*iter)->autoRelease();
// üһ
(*iter)->release();
// ȥýڵ
diff --git a/Easy2D/Easy2D.vcxproj b/Easy2D/Easy2D.vcxproj
index 4315f90b..410a9fdb 100644
--- a/Easy2D/Easy2D.vcxproj
+++ b/Easy2D/Easy2D.vcxproj
@@ -1,34 +1,18 @@
-
- DebugW
- Win32
-
-
- DebugW
- x64
-
Debug
Win32
-
- ReleaseW
- Win32
-
-
- ReleaseW
- x64
-
-
- Release
- Win32
-
Debug
x64
+
+ Release
+ Win32
+
Release
x64
@@ -43,25 +27,12 @@
- StaticLibrary
- true
- v141
- MultiByte
-
-
StaticLibrary
true
v141
Unicode
- StaticLibrary
- false
- v141
- false
- MultiByte
-
-
StaticLibrary
false
v141
@@ -69,25 +40,12 @@
Unicode
- StaticLibrary
- true
- v141
- MultiByte
-
-
StaticLibrary
true
v141
Unicode
- StaticLibrary
- false
- v141
- false
- MultiByte
-
-
StaticLibrary
false
v141
@@ -99,74 +57,38 @@
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
- true
- Easy2Dd
- $(SolutionDir)$(Platform)\
- $(Platform)\$(Configuration)\
-
-
true
Easy2Ddw
$(SolutionDir)$(Platform)\
$(Platform)\$(Configuration)\
- true
- Easy2Dd
- $(SolutionDir)$(Platform)\
- $(Platform)\$(Configuration)\
-
-
true
Easy2Ddw
$(SolutionDir)$(Platform)\
$(Platform)\$(Configuration)\
- false
- Easy2D
- $(SolutionDir)$(Platform)\
- $(Platform)\$(Configuration)\
-
-
false
Easy2Dw
$(SolutionDir)$(Platform)\
$(Platform)\$(Configuration)\
- false
- Easy2D
- $(SolutionDir)$(Platform)\
- $(Platform)\$(Configuration)\
-
-
false
Easy2Dw
$(SolutionDir)$(Platform)\
@@ -179,31 +101,7 @@
Disabled
WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
- None
- false
-
-
- Console
- true
-
-
- false
-
-
-
-
-
-
-
-
-
-
- NotUsing
- Level3
- Disabled
- WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- None
+ EditAndContinue
false
@@ -223,27 +121,6 @@
-
- NotUsing
- Level3
- Disabled
- _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- None
- false
-
-
- Console
- true
-
-
-
-
-
-
-
-
-
NotUsing
Level3
@@ -265,30 +142,6 @@
-
- NotUsing
- Level3
- MaxSpeed
- true
- true
- WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- None
-
-
- Console
- true
- true
- true
-
-
-
-
-
-
-
-
-
NotUsing
Level3
@@ -315,30 +168,6 @@
-
- NotUsing
- Level3
- MaxSpeed
- true
- true
- NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- None
-
-
- Console
- true
- true
- true
-
-
-
-
-
-
-
-
-
NotUsing
Level3
@@ -367,6 +196,8 @@
+
+
diff --git a/Easy2D/Easy2D.vcxproj.filters b/Easy2D/Easy2D.vcxproj.filters
index a6bbd9f1..cdc50456 100644
--- a/Easy2D/Easy2D.vcxproj.filters
+++ b/Easy2D/Easy2D.vcxproj.filters
@@ -1,72 +1,57 @@
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hh;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
- {261633d3-3814-40c7-bd6d-201ede6c6ade}
-
-
+
{2f0f3d30-bfc2-4aea-a170-258bbaacaa79}
-
+
+ {42d46a92-c043-4667-8c20-358319e5c313}
+
+
{51864c81-02ee-4043-bf09-9ce3cbe5b6da}
-
- {42d46a92-c043-4667-8c20-358319e5c313}
+
+ {261633d3-3814-40c7-bd6d-201ede6c6ade}
+
+
+ {bdc55351-669e-4ee5-ba0b-ee0e4b628fea}
- 源文件\Win
+ Win
- 源文件\Base
+ Base
- 源文件\Base
+ Base
- 源文件\Node
+ Node
- 源文件\Tool
+ Tool
- 源文件\Base
+ Base
+
+
+ Tool
+
+
+ Tool\Listener
-
- 头文件
-
-
- 头文件
-
-
- 头文件
-
- 源文件\Win
-
-
- 头文件
-
-
- 头文件
-
-
- 头文件
+ Win
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Easy2D/EasyX/easyx.h b/Easy2D/EasyX/easyx.h
deleted file mode 100644
index d5a35fac..00000000
--- a/Easy2D/EasyX/easyx.h
+++ /dev/null
@@ -1,321 +0,0 @@
-/******************************************************
- * EasyX Library for C++ (Ver:20170827(beta))
- * http://www.easyx.cn
- *
- * EasyX.h
- * VC ʵּĻͼ
- ******************************************************/
-
-#pragma once
-
-#ifndef WINVER
-#define WINVER 0x0400 // Specifies that the minimum required platform is Windows 95 and Windows NT 4.0.
-#endif
-
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0500 // Specifies that the minimum required platform is Windows 2000.
-#endif
-
-#ifndef _WIN32_WINDOWS
-#define _WIN32_WINDOWS 0x0410 // Specifies that the minimum required platform is Windows 98.
-#endif
-
-
-#ifndef __cplusplus
-#error EasyX is only for C++
-#endif
-
-
-#include
-#include
-
-// ͼڳʼ
-#define SHOWCONSOLE 1 // ͼδʱ̨ʾ
-#define NOCLOSE 2 // ûйرչ
-#define NOMINIMIZE 4 // ûС
-
-// ɫ
-#define BLACK 0
-#define BLUE 0xAA0000
-#define GREEN 0x00AA00
-#define CYAN 0xAAAA00
-#define RED 0x0000AA
-#define MAGENTA 0xAA00AA
-#define BROWN 0x0055AA
-#define LIGHTGRAY 0xAAAAAA
-#define DARKGRAY 0x555555
-#define LIGHTBLUE 0xFF5555
-#define LIGHTGREEN 0x55FF55
-#define LIGHTCYAN 0xFFFF55
-#define LIGHTRED 0x5555FF
-#define LIGHTMAGENTA 0xFF55FF
-#define YELLOW 0x55FFFF
-#define WHITE 0xFFFFFF
-
-// ɫת
-#define BGR(color) ( (((color) & 0xFF) << 16) | ((color) & 0xFF00FF00) | (((color) & 0xFF0000) >> 16) )
-
-
-class IMAGE;
-
-// ߵʽ
-class LINESTYLE
-{
-public:
- LINESTYLE();
- LINESTYLE(const LINESTYLE &style);
- LINESTYLE& operator = (const LINESTYLE &style); // ֵغ
- virtual ~LINESTYLE();
-
- DWORD style;
- DWORD thickness;
- DWORD *puserstyle;
- DWORD userstylecount;
-};
-
-class FILLSTYLE
-{
-public:
- FILLSTYLE();
- FILLSTYLE(const FILLSTYLE &style);
- FILLSTYLE& operator = (const FILLSTYLE &style); // ֵغ
- virtual ~FILLSTYLE();
-
- int style; // ʽ
- long hatch; // ͼʽ
- IMAGE* ppattern; // ͼ
-};
-
-// ͼ
-class IMAGE
-{
-public:
- int getwidth() const; // ȡĿ
- int getheight() const; // ȡĸ߶
-
-private:
- int width, height; // Ŀ
- HBITMAP m_hBmp;
- HDC m_hMemDC;
- int m_MemCurX; // ǰX
- int m_MemCurY; // ǰY
- float m_data[6];
- COLORREF m_LineColor; // ǰɫ
- COLORREF m_FillColor; // ǰɫ
- COLORREF m_TextColor; // ǰɫ
- COLORREF m_BkColor; // ǰɫ
- DWORD* m_pBuffer; // ͼڴ
-
- LINESTYLE m_LineStyle; // ʽ
- FILLSTYLE m_FillStyle; // ʽ
-
- virtual void SetDefault(); // ΪĬ״̬
-
-public:
- IMAGE(int _width = 0, int _height = 0); // ͼ
- IMAGE(const IMAGE &img); // 캯
- IMAGE& operator = (const IMAGE &img); // ֵغ
- virtual ~IMAGE();
- virtual void Resize(int _width, int _height); // ߴ
-};
-
-
-
-// ͼģʽغ
-
-HWND initgraph(int width, int height, int flag = NULL); // ʼͼλ
-void closegraph(); // رͼλ
-
-// ͼ
-
-void cleardevice(); //
-void setcliprgn(HRGN hrgn); // õǰͼ豸IJü
-void clearcliprgn(); // üĻ
-
-void getlinestyle(LINESTYLE* pstyle); // ȡǰʽ
-void setlinestyle(const LINESTYLE* pstyle); // õǰʽ
-void setlinestyle(int style, int thickness = 1, const DWORD *puserstyle = NULL, DWORD userstylecount = 0); // õǰʽ
-void getfillstyle(FILLSTYLE* pstyle); // ȡǰʽ
-void setfillstyle(const FILLSTYLE* pstyle); // õǰʽ
-void setfillstyle(int style, long hatch = NULL, IMAGE* ppattern = NULL); // õǰʽ
-void setfillstyle(BYTE* ppattern8x8); // õǰʽ
-
-void setorigin(int x, int y); // ԭ
-void getaspectratio(float *pxasp, float *pyasp); // ȡǰ
-void setaspectratio(float xasp, float yasp); // õǰ
-
-int getrop2(); // ȡǰĶԪդģʽ
-void setrop2(int mode); // ǰĶԪդģʽ
-int getpolyfillmode(); // ȡģʽ
-void setpolyfillmode(int mode); // öģʽ
-
-void graphdefaults(); // лͼΪĬֵ
-
-COLORREF getlinecolor(); // ȡǰɫ
-void setlinecolor(COLORREF color); // õǰɫ
-COLORREF gettextcolor(); // ȡǰɫ
-void settextcolor(COLORREF color); // õǰɫ
-COLORREF getfillcolor(); // ȡǰɫ
-void setfillcolor(COLORREF color); // õǰɫ
-COLORREF getbkcolor(); // ȡǰͼɫ
-void setbkcolor(COLORREF color); // õǰͼɫ
-int getbkmode(); // ȡģʽ
-void setbkmode(int mode); // ñģʽ
-
-// ɫģת
-COLORREF RGBtoGRAY(COLORREF rgb);
-void RGBtoHSL(COLORREF rgb, float *H, float *S, float *L);
-void RGBtoHSV(COLORREF rgb, float *H, float *S, float *V);
-COLORREF HSLtoRGB(float H, float S, float L);
-COLORREF HSVtoRGB(float H, float S, float V);
-
-
-// ͼ
-
-COLORREF getpixel(int x, int y); // ȡɫ
-void putpixel(int x, int y, COLORREF color); //
-
-void moveto(int x, int y); // ƶǰ()
-void moverel(int dx, int dy); // ƶǰ()
-
-void line(int x1, int y1, int x2, int y2); //
-void linerel(int dx, int dy); // ()
-void lineto(int x, int y); // ()
-
-void rectangle (int left, int top, int right, int bottom); //
-void fillrectangle (int left, int top, int right, int bottom); // (б߿)
-void solidrectangle(int left, int top, int right, int bottom); // (ޱ߿)
-void clearrectangle(int left, int top, int right, int bottom); // վ
-
-void circle (int x, int y, int radius); // Բ
-void fillcircle (int x, int y, int radius); // Բ(б߿)
-void solidcircle(int x, int y, int radius); // Բ(ޱ߿)
-void clearcircle(int x, int y, int radius); // Բ
-
-void ellipse (int left, int top, int right, int bottom); // Բ
-void fillellipse (int left, int top, int right, int bottom); // Բ(б߿)
-void solidellipse(int left, int top, int right, int bottom); // Բ(ޱ߿)
-void clearellipse(int left, int top, int right, int bottom); // Բ
-
-void roundrect (int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // ԲǾ
-void fillroundrect (int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // ԲǾ(б߿)
-void solidroundrect(int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // ԲǾ(ޱ߿)
-void clearroundrect(int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // ԲǾ
-
-void arc (int left, int top, int right, int bottom, double stangle, double endangle); // Բ(ʼǶȺֹǶΪ)
-void pie (int left, int top, int right, int bottom, double stangle, double endangle); // Բ(ʼǶȺֹǶΪ)
-void fillpie (int left, int top, int right, int bottom, double stangle, double endangle); // Բ(б߿)
-void solidpie(int left, int top, int right, int bottom, double stangle, double endangle); // Բ(ޱ߿)
-void clearpie(int left, int top, int right, int bottom, double stangle, double endangle); // Բ
-
-void polyline (const POINT *points, int num); //
-void polygon (const POINT *points, int num); //
-void fillpolygon (const POINT *points, int num); // Ķ(б߿)
-void solidpolygon(const POINT *points, int num); // Ķ(ޱ߿)
-void clearpolygon(const POINT *points, int num); // ն
-
-void floodfill(int x, int y, int border); //
-
-
-
-// غ
-
-void outtext(LPCTSTR str); // ڵǰλַ
-void outtext(TCHAR c); // ڵǰλַ
-void outtextxy(int x, int y, LPCTSTR str); // ָλַ
-void outtextxy(int x, int y, TCHAR c); // ָλַ
-int textwidth(LPCTSTR str); // ȡַռõؿ
-int textwidth(TCHAR c); // ȡַռõؿ
-int textheight(LPCTSTR str); // ȡַռõظ
-int textheight(TCHAR c); // ȡַռõظ
-int drawtext(LPCTSTR str, RECT* pRect, UINT uFormat); // ָָʽַ
-int drawtext(TCHAR c, RECT* pRect, UINT uFormat); // ָָʽַ
-
-// õǰʽ()
-// nHeight: ַƽ߶ȣ
-// nWidth: ַƽ(0 ʾӦ)
-// lpszFace: ƣ
-// nEscapement: ַдǶ(λ 0.1 )
-// nOrientation: ÿַдǶ(λ 0.1 )
-// nWeight: ַıʻϸ(0 ʾĬϴϸ)
-// bItalic: Ƿб壻
-// bUnderline: Ƿ»ߣ
-// bStrikeOut: Ƿɾߣ
-// fbCharSet: ַָ
-// fbOutPrecision: ֵָȣ
-// fbClipPrecision: ֵָļȣ
-// fbQuality: ֵָ
-// fbPitchAndFamily: ָԳ淽ʽϵС
-void settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace);
-void settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace, int nEscapement, int nOrientation, int nWeight, bool bItalic, bool bUnderline, bool bStrikeOut);
-void settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace, int nEscapement, int nOrientation, int nWeight, bool bItalic, bool bUnderline, bool bStrikeOut, BYTE fbCharSet, BYTE fbOutPrecision, BYTE fbClipPrecision, BYTE fbQuality, BYTE fbPitchAndFamily);
-void settextstyle(const LOGFONT *font); // õǰʽ
-void gettextstyle(LOGFONT *font); // ȡǰʽ
-
-
-
-// ͼ
-void loadimage(IMAGE *pDstImg, LPCTSTR pImgFile, int nWidth = 0, int nHeight = 0, bool bResize = false); // ͼƬļȡͼ(bmp/jpg/gif/emf/wmf)
-void loadimage(IMAGE *pDstImg, LPCTSTR pResType, LPCTSTR pResName, int nWidth = 0, int nHeight = 0, bool bResize = false); // Դļȡͼ(bmp/jpg/gif/emf/wmf)
-void saveimage(LPCTSTR pImgFile, IMAGE* pImg = NULL); // ͼ
-void getimage(IMAGE *pDstImg, int srcX, int srcY, int srcWidth, int srcHeight); // ӵǰͼ豸ȡͼ
-void putimage(int dstX, int dstY, const IMAGE *pSrcImg, DWORD dwRop = SRCCOPY); // ͼĻ
-void putimage(int dstX, int dstY, int dstWidth, int dstHeight, const IMAGE *pSrcImg, int srcX, int srcY, DWORD dwRop = SRCCOPY); // ͼĻ(ָ)
-void rotateimage(IMAGE *dstimg, IMAGE *srcimg, double radian, COLORREF bkcolor = BLACK, bool autosize = false, bool highquality = true);// תͼ
-void Resize(IMAGE* pImg, int width, int height); // ͼ豸ĴС
-DWORD* GetImageBuffer(IMAGE* pImg = NULL); // ȡͼ豸Դָ
-IMAGE* GetWorkingImage(); // ȡǰͼ豸
-void SetWorkingImage(IMAGE* pImg = NULL); // õǰͼ豸
-HDC GetImageHDC(IMAGE* pImg = NULL); // ȡͼ豸(HDC)
-
-
-//
-
-int getwidth(); // ȡͼ
-int getheight(); // ȡͼ߶
-int getx(); // ȡǰ x
-int gety(); // ȡǰ y
-
-void BeginBatchDraw(); // ʼ
-void FlushBatchDraw(); // ִδɵĻ
-void FlushBatchDraw(int left, int top, int right, int bottom); // ִָδɵĻ
-void EndBatchDraw(); // ƣִδɵĻ
-void EndBatchDraw(int left, int top, int right, int bottom); // ƣִָδɵĻ
-
-HWND GetHWnd(); // ȡͼھ(HWND)
-TCHAR* GetEasyXVer(); // ȡ EasyX ǰ汾
-
-// ȡû
-bool InputBox(LPTSTR pString, int nMaxCount, LPCTSTR pPrompt = NULL, LPCTSTR pTitle = NULL, LPCTSTR pDefault = NULL, int width = 0, int height = 0, bool bOnlyOK = true);
-
-
-
-// Ϣ
-// ֧Ϣ
-// WM_MOUSEMOVE ƶ
-// WM_MOUSEWHEEL ֲ
-// WM_LBUTTONDOWN
-// WM_LBUTTONUP
-// WM_LBUTTONDBLCLK ˫
-// WM_MBUTTONDOWN м
-// WM_MBUTTONUP м
-// WM_MBUTTONDBLCLK м˫
-// WM_RBUTTONDOWN Ҽ
-// WM_RBUTTONUP Ҽ
-// WM_RBUTTONDBLCLK Ҽ˫
-struct MOUSEMSG
-{
- UINT uMsg; // ǰϢ
- bool mkCtrl; // Ctrl Ƿ
- bool mkShift; // Shift Ƿ
- bool mkLButton; // Ƿ
- bool mkMButton; // мǷ
- bool mkRButton; // ҼǷ
- short x; // ǰ x
- short y; // ǰ y
- short wheel; // ֵֹ (120 ı)
-};
-
-bool MouseHit(); // ǷϢ
-MOUSEMSG GetMouseMsg(); // ȡһϢûУ͵ȴ
-void FlushMouseMsgBuffer(); // Ϣ
diff --git a/Easy2D/EasyX/x64/EasyXa.lib b/Easy2D/EasyX/x64/EasyXa.lib
deleted file mode 100644
index d1c996b242f81a7467746f6d92b522a548b635ea..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 261406
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