diff --git a/Demo/main.cpp b/Demo/main.cpp
index 037567c7..e88e2fdf 100644
--- a/Demo/main.cpp
+++ b/Demo/main.cpp
@@ -11,22 +11,21 @@ int WINAPI WinMain(
if (!EApp::init(L"Easy2D Demo", 640, 480))
return -1;
- float w = EApp::getWidth();
- float h = EApp::getHeight();
auto scene = new EScene();
+ scene->retain();
auto text = new EText(L"中文测试中文测试中文测试中文测试中文测试中文测试中文测试", L"楷体");
text->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2);
//text->setWordWrapping(true);
//text->setWordWrappingWidth(130);
text->setRotation(40);
- //text->runAction(new EActionLoop(new EActionTwo(new EActionFadeOut(1), new EActionFadeIn(1))));
+ text->runAction(new EActionLoop(new EActionTwo(new EActionFadeOut(1), new EActionFadeIn(1))));
scene->add(text);
auto listener = new EListenerKeyboardPress([=]() {
if (EKeyboardMsg::getKeyValue() == EKeyboardMsg::KEY::SPACE)
{
- EApp::backScene(new ETransitionFade(0.5f, 0.5f));
+ EApp::backScene(new ETransitionMove(0.5f, ETransitionMove::DOWN));
}
});
listener->bindWith(scene);
@@ -48,28 +47,30 @@ int WINAPI WinMain(
auto btnStartSelected = new ESprite(L"atlas.png", 702, 234, 116, 70);
btnStartSelected->setPosY(5);
auto button = new EButton(btnStart, btnStartSelected, [=] {
- if (EApp::isPaused())
+ /*if (EApp::isPaused())
{
EApp::resume();
}
else
{
EApp::pause();
- }
- //EApp::enterScene(scene, new ETransitionScaleEmerge(1, ETransitionScaleEmerge::BACK));
+ }*/
+ EApp::enterScene(scene, new ETransitionMove(1, ETransitionMove::RIGHT));
});
button->setPivot(0.5f, 0.5f);
button->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2 + 100);
scene2->add(button);
- scene2->runAction(new EActionSequence(5,
+ EMusicUtils::playMusic(L"music.wav", -1);
+
+ /*scene2->runAction(new EActionSequence(5,
new EActionCallback([]() { EMusicUtils::playMusic(L"music.wav", -1); }),
new EActionDelay(3),
new EActionCallback([]() { EMusicUtils::pauseMusic(L"music.wav"); }),
new EActionDelay(10),
- new EActionCallback([]() { EMusicUtils::resumeMusic(L"music.wav"); })));
+ new EActionCallback([]() { EMusicUtils::resumeMusic(L"music.wav"); })));*/
- EApp::enterScene(scene2, new ETransitionFade(0, 1));
+ EApp::enterScene(scene2, new ETransitionMove(1, ETransitionMove::UP));
return EApp::run();
}
diff --git a/Easy2D/Base/EApp.cpp b/Easy2D/Base/EApp.cpp
index 2914ef90..a7540dcf 100644
--- a/Easy2D/Base/EApp.cpp
+++ b/Easy2D/Base/EApp.cpp
@@ -25,11 +25,11 @@ e2d::EApp::EApp()
: m_bEnd(false)
, m_bPaused(false)
, m_bManualPaused(false)
- , m_bTransitional(false)
, m_bTopMost(false)
, m_bShowConsole(false)
, m_nAnimationInterval(17LL)
, m_ClearColor(EColor::BLACK)
+ , m_pTransition(nullptr)
, m_pCurrentScene(nullptr)
, m_pNextScene(nullptr)
{
@@ -337,14 +337,17 @@ void e2d::EApp::_update()
}
// 正在切换场景时,执行场景切换动画
- if (m_bTransitional)
+ if (m_pTransition)
{
- EActionManager::ActionProc();
- // 若场景切换未结束,不执行后面的部分
- if (m_bTransitional)
+ m_pTransition->_update();
+ if (m_pTransition->isEnding())
{
- return;
+ m_pTransition->release();
+ m_pTransition = nullptr;
+ // 进入下一场景
+ _enterNextScene();
}
+ return;
}
// 下一场景指针不为空时,切换场景
@@ -376,7 +379,7 @@ void e2d::EApp::_render()
m_pCurrentScene->_render();
}
// 切换场景时,同时绘制两场景
- if (m_bTransitional && m_pNextScene)
+ if (m_pTransition && m_pNextScene)
{
m_pNextScene->_render();
}
@@ -447,8 +450,9 @@ e2d::ESize e2d::EApp::getSize()
return ESize(GetRenderTarget()->GetSize().width, GetRenderTarget()->GetSize().height);
}
-void e2d::EApp::enterScene(EScene * scene, bool saveCurrentScene /* = true */, ETransition * transition /* = nullptr */)
+void e2d::EApp::enterScene(EScene * scene, ETransition * transition /* = nullptr */, bool saveCurrentScene /* = true */)
{
+ ASSERT(scene != nullptr, "Next scene NULL pointer exception!");
scene->retain();
// 保存下一场景的指针
getInstance()->m_pNextScene = scene;
@@ -460,17 +464,13 @@ void e2d::EApp::enterScene(EScene * scene, bool saveCurrentScene /* = true */, E
// 设置切换场景动画
if (transition)
{
- getInstance()->m_bTransitional = true;
+ getInstance()->m_pTransition = transition;
+ transition->retain();
transition->_setTarget(
getInstance()->m_pCurrentScene,
- getInstance()->m_pNextScene,
- getInstance()->m_bTransitional
+ getInstance()->m_pNextScene
);
}
- else
- {
- getInstance()->m_bTransitional = false;
- }
}
void e2d::EApp::backScene(ETransition * transition /* = nullptr */)
@@ -492,19 +492,13 @@ void e2d::EApp::backScene(ETransition * transition /* = nullptr */)
// 设置切换场景动画
if (transition)
{
- getInstance()->m_bTransitional = true;
+ getInstance()->m_pTransition = transition;
+ transition->retain();
transition->_setTarget(
getInstance()->m_pCurrentScene,
- getInstance()->m_pNextScene,
- getInstance()->m_bTransitional
+ getInstance()->m_pNextScene
);
}
- else
- {
- // 把这个变量赋为 false,场景将在下一帧画面
- // 进行切换
- getInstance()->m_bTransitional = false;
- }
}
void e2d::EApp::clearScene()
@@ -650,7 +644,7 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
case WM_MOUSEWHEEL:
{
// 执行场景切换时屏蔽按键和鼠标消息
- if (!s_pInstance->m_bTransitional && !s_pInstance->m_pNextScene)
+ if (!s_pInstance->m_pTransition && !s_pInstance->m_pNextScene)
{
EMsgManager::MouseProc(message, wParam, lParam);
}
@@ -663,7 +657,7 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
case WM_KEYUP:
{
// 执行场景切换时屏蔽按键和鼠标消息
- if (!s_pInstance->m_bTransitional && !s_pInstance->m_pNextScene)
+ if (!s_pInstance->m_pTransition && !s_pInstance->m_pNextScene)
{
EMsgManager::KeyboardProc(message, wParam, lParam);
}
diff --git a/Easy2D/Easy2D.vcxproj b/Easy2D/Easy2D.vcxproj
index 0c917008..d7c5eab3 100644
--- a/Easy2D/Easy2D.vcxproj
+++ b/Easy2D/Easy2D.vcxproj
@@ -245,11 +245,10 @@
+
-
-
diff --git a/Easy2D/Easy2D.vcxproj.filters b/Easy2D/Easy2D.vcxproj.filters
index 3a8e48df..fc324afd 100644
--- a/Easy2D/Easy2D.vcxproj.filters
+++ b/Easy2D/Easy2D.vcxproj.filters
@@ -135,12 +135,6 @@
Transition
-
- Transition
-
-
- Transition
-
Tool
@@ -219,6 +213,9 @@
Win
+
+ Transition
+
diff --git a/Easy2D/Transition/ETransition.cpp b/Easy2D/Transition/ETransition.cpp
new file mode 100644
index 00000000..c11441c6
--- /dev/null
+++ b/Easy2D/Transition/ETransition.cpp
@@ -0,0 +1,52 @@
+#include "..\etransitions.h"
+#include "..\Win\winbase.h"
+
+e2d::ETransition::ETransition(float duration)
+ : m_bEnd(false)
+ , m_fTotalDuration(duration * 1000)
+ , m_fDuration(0)
+ , m_fRateOfProgress(0)
+ , m_pPrevScene(nullptr)
+ , m_pNextScene(nullptr)
+{
+}
+
+bool e2d::ETransition::isEnding()
+{
+ return m_bEnd;
+}
+
+bool e2d::ETransition::_isDelayEnough()
+{
+ // 判断时间间隔是否足够
+ if (m_fTotalDuration == 0)
+ {
+ m_fRateOfProgress = 1;
+ return true;
+ }
+
+ if (GetInterval(m_tLast) > 15)
+ {
+ // 重新记录时间
+ m_tLast += milliseconds(15);
+ m_fDuration += 15;
+ // 计算动画进度
+ m_fRateOfProgress = m_fDuration / m_fTotalDuration;
+ return true;
+ }
+ return false;
+}
+
+void e2d::ETransition::_stop()
+{
+ m_bEnd = true;
+ _reset();
+}
+
+void e2d::ETransition::_setTarget(EScene * prev, EScene * next)
+{
+ m_tLast = std::chrono::steady_clock::now();
+ m_pPrevScene = prev;
+ m_pNextScene = next;
+ _init();
+}
diff --git a/Easy2D/Transition/ETransitionEmerge.cpp b/Easy2D/Transition/ETransitionEmerge.cpp
index 246963dd..52b77cb2 100644
--- a/Easy2D/Transition/ETransitionEmerge.cpp
+++ b/Easy2D/Transition/ETransitionEmerge.cpp
@@ -1,39 +1,33 @@
#include "..\etransitions.h"
-#include "..\eactions.h"
-#include "..\emanagers.h"
+#include "..\enodes.h"
-e2d::ETransitionEmerge::ETransitionEmerge(float emergeDuration)
- : m_fEmergeDuration(emergeDuration)
+e2d::ETransitionEmerge::ETransitionEmerge(float duration)
+ : ETransition(duration)
{
}
-void e2d::ETransitionEmerge::_setTarget(EScene * prev, EScene * next, bool & transitional)
+void e2d::ETransitionEmerge::_update()
{
- // 初始化场景属性
- next->getRoot()->setOpacity(0);
-
- // 第一个场景淡出
- auto action1 = new EActionFadeOut(m_fEmergeDuration);
- if (prev)
+ if (_isDelayEnough())
{
- action1->setTarget(prev->getRoot());
- }
+ if (m_pPrevScene) m_pPrevScene->getRoot()->setOpacity(1 - m_fRateOfProgress);
+ m_pNextScene->getRoot()->setOpacity(m_fRateOfProgress);
- // 第二个场景淡入
- auto action2 = new EActionFadeIn(m_fEmergeDuration);
- action2->setTarget(next->getRoot());
-
- // 标志动画结束
- auto action3 = new EActionCallback([&, prev, next] {
- transitional = false;
- // 还原场景状态
- if (prev)
+ if (m_fDuration >= m_fTotalDuration)
{
- prev->getRoot()->setOpacity(1);
+ this->_stop();
}
- next->getRoot()->setOpacity(1);
- });
-
- // 添加顺序动作
- EActionManager::addAction(new EActionSequence(2, new EActionTwoAtSameTime(action1, action2), action3));
+ }
+}
+
+void e2d::ETransitionEmerge::_init()
+{
+ if (m_pPrevScene) m_pPrevScene->getRoot()->setOpacity(1);
+ m_pNextScene->getRoot()->setOpacity(0);
+}
+
+void e2d::ETransitionEmerge::_reset()
+{
+ if (m_pPrevScene) m_pPrevScene->getRoot()->setOpacity(1);
+ m_pNextScene->getRoot()->setOpacity(1);
}
diff --git a/Easy2D/Transition/ETransitionFade.cpp b/Easy2D/Transition/ETransitionFade.cpp
index 961361a9..bbca7ddb 100644
--- a/Easy2D/Transition/ETransitionFade.cpp
+++ b/Easy2D/Transition/ETransitionFade.cpp
@@ -1,40 +1,57 @@
#include "..\etransitions.h"
-#include "..\eactions.h"
-#include "..\emanagers.h"
+#include "..\enodes.h"
e2d::ETransitionFade::ETransitionFade(float fadeOutDuration, float fadeInDuration)
- : m_fFadeOutDuration(fadeOutDuration)
- , m_fFadeInDuration(fadeInDuration)
+ : ETransition(0)
+ , m_fFadeOutDuration(fadeOutDuration * 1000)
+ , m_fFadeInDuration(fadeInDuration * 1000)
+ , m_bFadeOutTransioning(true)
{
+ m_fTotalDuration = m_fFadeOutDuration;
}
-void e2d::ETransitionFade::_setTarget(EScene * prev, EScene * next, bool & transitional)
+void e2d::ETransitionFade::_update()
{
- // 初始化场景属性
- next->getRoot()->setOpacity(0);
-
- // 第一个场景淡出
- auto action1 = new EActionFadeOut(m_fFadeOutDuration);
- if (prev)
+ if (_isDelayEnough())
{
- action1->setTarget(prev->getRoot());
- }
-
- // 第二个场景淡入
- auto action2 = new EActionFadeIn(m_fFadeInDuration);
- action2->setTarget(next->getRoot());
-
- // 标志动画结束
- auto action3 = new EActionCallback([&, prev, next] {
- transitional = false;
- // 还原场景状态
- if (prev)
+ if (m_bFadeOutTransioning)
{
- prev->getRoot()->setOpacity(1);
+ m_pPrevScene->getRoot()->setOpacity(1 - m_fRateOfProgress);
+ if (m_fDuration >= m_fTotalDuration)
+ {
+ m_bFadeOutTransioning = false;
+ m_fTotalDuration = m_fFadeInDuration;
+ m_fDuration = 0;
+ }
}
- next->getRoot()->setOpacity(1);
- });
+ else
+ {
+ m_pNextScene->getRoot()->setOpacity(m_fRateOfProgress);
+ if (m_fDuration >= m_fTotalDuration)
+ {
+ this->_stop();
+ }
+ }
+ }
+}
- // 添加顺序动作
- EActionManager::addAction(new EActionSequence(3, action1, action2, action3));
-}
\ No newline at end of file
+void e2d::ETransitionFade::_init()
+{
+ if (m_pPrevScene)
+ {
+ m_bFadeOutTransioning = true;
+ m_pPrevScene->getRoot()->setOpacity(1);
+ }
+ else
+ {
+ m_bFadeOutTransioning = false;
+ m_fTotalDuration = m_fFadeInDuration;
+ }
+ m_pNextScene->getRoot()->setOpacity(0);
+}
+
+void e2d::ETransitionFade::_reset()
+{
+ if (m_pPrevScene) m_pPrevScene->getRoot()->setOpacity(1);
+ m_pNextScene->getRoot()->setOpacity(1);
+}
diff --git a/Easy2D/Transition/ETransitionMove.cpp b/Easy2D/Transition/ETransitionMove.cpp
index 602b71b9..f890d361 100644
--- a/Easy2D/Transition/ETransitionMove.cpp
+++ b/Easy2D/Transition/ETransitionMove.cpp
@@ -1,64 +1,56 @@
#include "..\etransitions.h"
-#include "..\eactions.h"
-#include "..\emanagers.h"
+#include "..\enodes.h"
-e2d::ETransitionMove::ETransitionMove(float moveDuration, MOVE_DIRECT direct)
- : m_fMoveDuration(moveDuration)
+e2d::ETransitionMove::ETransitionMove(float duration, MOVE_DIRECT direct)
+ : ETransition(duration)
, m_Direct(direct)
{
}
-void e2d::ETransitionMove::_setTarget(EScene * prev, EScene * next, bool & transitional)
+void e2d::ETransitionMove::_update()
+{
+ if (_isDelayEnough())
+ {
+ if (m_pPrevScene) m_pPrevScene->getRoot()->setPos(m_Vec * m_fRateOfProgress);
+ m_pNextScene->getRoot()->setPos(m_NextPos + m_Vec * m_fRateOfProgress);
+
+ if (m_fDuration >= m_fTotalDuration)
+ {
+ this->_stop();
+ }
+ }
+}
+
+void e2d::ETransitionMove::_init()
{
- // 初始化动作属性
- float distPosX;
- float distPosY;
if (m_Direct == MOVE_DIRECT::UP)
{
- distPosX = 0;
- distPosY = -EApp::getHeight();
+ m_Vec = EVec(0, -EApp::getHeight());
+ m_NextPos = EPoint(0, EApp::getHeight());
}
else if (m_Direct == MOVE_DIRECT::DOWN)
{
- distPosX = 0;
- distPosY = EApp::getHeight();
+ m_Vec = EVec(0, EApp::getHeight());
+ m_NextPos = EPoint(0, -EApp::getHeight());
}
else if (m_Direct == MOVE_DIRECT::LEFT)
{
- distPosX = -EApp::getWidth();
- distPosY = 0;
+ m_Vec = EVec(-EApp::getWidth(), 0);
+ m_NextPos = EPoint(EApp::getWidth(), 0);
}
else if (m_Direct == MOVE_DIRECT::RIGHT)
{
- distPosX = EApp::getWidth();
- distPosY = 0;
+ m_Vec = EVec(EApp::getWidth(), 0);
+ m_NextPos = EPoint(-EApp::getWidth(), 0);
}
- // 初始化场景属性
- next->getRoot()->movePos(-distPosX, -distPosY);
-
- // 第一个场景移出
- auto action1 = new EActionMoveBy(m_fMoveDuration, EVec(distPosX, distPosY));
- if (prev)
- {
- action1->setTarget(prev->getRoot());
- }
-
- // 第二个场景移入
- auto action2 = new EActionMoveBy(m_fMoveDuration, EVec(distPosX, distPosY));
- action2->setTarget(next->getRoot());
-
- // 标志动画结束
- auto action3 = new EActionCallback([&, prev, next] {
- transitional = false;
- // 还原场景状态
- if (prev)
- {
- prev->getRoot()->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2);
- }
- next->getRoot()->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2);
- });
-
- // 添加顺序动作
- EActionManager::addAction(new EActionSequence(2, new EActionTwoAtSameTime(action1, action2), action3));
+ if (m_pPrevScene) m_pPrevScene->getRoot()->setPos(0, 0);
+ m_pNextScene->getRoot()->setPos(m_NextPos);
}
+
+void e2d::ETransitionMove::_reset()
+{
+ if (m_pPrevScene) m_pPrevScene->getRoot()->setPos(0, 0);
+ m_pNextScene->getRoot()->setPos(0, 0);
+}
+
diff --git a/Easy2D/Transition/ETransitionScale.cpp b/Easy2D/Transition/ETransitionScale.cpp
deleted file mode 100644
index 6dfb2515..00000000
--- a/Easy2D/Transition/ETransitionScale.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "..\etransitions.h"
-#include "..\eactions.h"
-#include "..\emanagers.h"
-
-e2d::ETransitionScale::ETransitionScale(float scaleOutDuration, float scaleInDuration)
- : m_fScaleOutDuration(scaleOutDuration)
- , m_fScaleInDuration(scaleInDuration)
-{
-}
-
-void e2d::ETransitionScale::_setTarget(EScene * prev, EScene * next, bool & transitional)
-{
- // 初始化场景属性
- next->getRoot()->setScale(0);
-
- // 第一个场景缩放至消失
- auto action1 = new EActionScaleTo(m_fScaleOutDuration, 0);
- if (prev)
- {
- action1->setTarget(prev->getRoot());
- }
-
- // 第二个场景淡入
- auto action2 = new EActionScaleTo(m_fScaleInDuration, 1);
- action2->setTarget(next->getRoot());
-
- // 标志动画结束
- auto action3 = new EActionCallback([&, prev, next] {
- transitional = false;
- // 还原场景状态
- if (prev)
- {
- prev->getRoot()->setScale(1);
- }
- next->getRoot()->setScale(1);
- });
-
- // 添加顺序动作
- EActionManager::addAction(new EActionSequence(3, action1, action2, action3));
-}
diff --git a/Easy2D/Transition/ETransitionScaleEmerge.cpp b/Easy2D/Transition/ETransitionScaleEmerge.cpp
deleted file mode 100644
index f76aed3c..00000000
--- a/Easy2D/Transition/ETransitionScaleEmerge.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#include "..\etransitions.h"
-#include "..\eactions.h"
-#include "..\emanagers.h"
-
-e2d::ETransitionScaleEmerge::ETransitionScaleEmerge(float duration, SCALE_EMERGE_MODE mode)
- : m_fDuration(duration)
- , m_Mode(mode)
-{
-}
-
-void e2d::ETransitionScaleEmerge::_setTarget(EScene * prev, EScene * next, bool & transitional)
-{
- float prevScaleBy;
- float nextScaleBy;
- if (m_Mode == SCALE_EMERGE_MODE::ENTER)
- {
- prevScaleBy = 0.2f;
- nextScaleBy = -0.2f;
- }
- else
- {
- prevScaleBy = -0.2f;
- nextScaleBy = 0.2f;
- }
-
- // 初始化场景属性
- next->getRoot()->setScale(next->getRoot()->getScaleX() - nextScaleBy, next->getRoot()->getScaleY() - nextScaleBy);
- next->getRoot()->setOpacity(0);
-
- // 第一个场景淡出
- auto prevActionFadeOut = new EActionFadeOut(m_fDuration);
- auto prevActionScaleBy = new EActionScaleBy(m_fDuration, prevScaleBy);
- auto action1 = new EActionTwoAtSameTime(
- prevActionFadeOut,
- prevActionScaleBy);
- if (prev)
- {
- prevActionFadeOut->setTarget(prev->getRoot());
- prevActionScaleBy->setTarget(prev->getRoot());
- }
-
- // 第二个场景淡入
- auto nextActionFadeOut = new EActionFadeIn(m_fDuration);
- auto nextActionScaleBy = new EActionScaleBy(m_fDuration, nextScaleBy);
- auto action2 = new EActionTwoAtSameTime(
- nextActionFadeOut,
- nextActionScaleBy);
-
- nextActionFadeOut->setTarget(next->getRoot());
- nextActionScaleBy->setTarget(next->getRoot());
-
- // 标志动画结束
- auto action3 = new EActionCallback([&, prev, next] {
- transitional = false;
- // 还原场景状态
- if (prev)
- {
- prev->getRoot()->setScale(1);
- prev->getRoot()->setOpacity(1);
- }
- next->getRoot()->setScale(1);
- next->getRoot()->setOpacity(1);
- });
-
- // 添加顺序动作
- EActionManager::addAction(new EActionSequence(2, new EActionTwoAtSameTime(action1, action2), action3));
-}
diff --git a/Easy2D/ebase.h b/Easy2D/ebase.h
index b9a852e9..9097db9b 100644
--- a/Easy2D/ebase.h
+++ b/Easy2D/ebase.h
@@ -52,8 +52,8 @@ public:
// 切换场景
static void enterScene(
EScene * scene, /* 下一个场景的指针 */
- bool saveCurrentScene = true, /* 是否保存当前场景 */
- ETransition * transition = nullptr /* 场景切换动画 */
+ ETransition * transition = nullptr, /* 场景切换动画 */
+ bool saveCurrentScene = true /* 是否保存当前场景 */
);
// 返回上一场景
@@ -175,7 +175,6 @@ private:
bool m_bEnd;
bool m_bPaused;
bool m_bManualPaused;
- bool m_bTransitional;
bool m_bTopMost;
bool m_bShowConsole;
EString m_sTitle;
@@ -184,6 +183,7 @@ private:
LONGLONG m_nAnimationInterval;
EScene * m_pCurrentScene;
EScene * m_pNextScene;
+ ETransition * m_pTransition;
};
diff --git a/Easy2D/enodes.h b/Easy2D/enodes.h
index b592f841..b031dcd5 100644
--- a/Easy2D/enodes.h
+++ b/Easy2D/enodes.h
@@ -11,6 +11,7 @@ class EButton;
class EButtonToggle;
class EGeometry;
class EMenu;
+class ETransition;
class ENode :
public EObject
@@ -19,6 +20,7 @@ class ENode :
friend EButton;
friend EButtonToggle;
friend EGeometry;
+ friend ETransition;
public:
ENode();
diff --git a/Easy2D/etransitions.h b/Easy2D/etransitions.h
index c05ae7b3..a36e3f8e 100644
--- a/Easy2D/etransitions.h
+++ b/Easy2D/etransitions.h
@@ -1,5 +1,6 @@
#pragma once
#include "ebase.h"
+#include
namespace e2d
{
@@ -9,13 +10,38 @@ class ETransition :
{
friend EApp;
+public:
+ ETransition(float duration);
+
+ // 场景切换动画是否结束
+ bool isEnding();
+
protected:
- // 保存当前场景和下一场景的指针,和控制场景切换的变量
- virtual void _setTarget(
+ // 更新动画
+ virtual void _update() = 0;
+
+ virtual void _init() = 0;
+
+ virtual void _reset() = 0;
+
+ virtual bool _isDelayEnough();
+
+ virtual void _stop();
+
+ // 保存当前场景和下一场景的指针
+ void _setTarget(
EScene * prev,
- EScene * next,
- bool &transitional
- ) = 0;
+ EScene * next
+ );
+
+protected:
+ bool m_bEnd;
+ float m_fTotalDuration;
+ float m_fDuration;
+ float m_fRateOfProgress;
+ EScene * m_pPrevScene;
+ EScene * m_pNextScene;
+ std::chrono::steady_clock::time_point m_tLast;
};
@@ -30,16 +56,17 @@ public:
);
protected:
- // 保存当前场景和下一场景的指针,和控制场景切换的变量
- virtual void _setTarget(
- EScene * prev,
- EScene * next,
- bool &transitional
- ) override;
+ // 更新动画
+ virtual void _update() override;
+
+ virtual void _init() override;
+
+ virtual void _reset() override;
protected:
float m_fFadeOutDuration;
float m_fFadeInDuration;
+ bool m_bFadeOutTransioning;
};
@@ -49,19 +76,16 @@ class ETransitionEmerge :
public:
// 创建浮现式的场景切换动画
ETransitionEmerge(
- float emergeDuration /* 浮现动画持续时长 */
+ float duration /* 浮现动画持续时长 */
);
protected:
- // 保存当前场景和下一场景的指针,和控制场景切换的变量
- virtual void _setTarget(
- EScene * prev,
- EScene * next,
- bool &transitional
- ) override;
+ // 更新动画
+ virtual void _update() override;
-protected:
- float m_fEmergeDuration;
+ virtual void _init() override;
+
+ virtual void _reset() override;
};
@@ -79,75 +103,22 @@ public:
// 创建移动式的场景切换动画
ETransitionMove(
- float moveDuration, /* 场景移动动画持续时长 */
- MOVE_DIRECT direct /* 场景移动方向 */
+ float moveDuration, /* 场景移动动画持续时长 */
+ MOVE_DIRECT direct = LEFT /* 场景移动方向 */
);
protected:
- // 保存当前场景和下一场景的指针,和控制场景切换的变量
- virtual void _setTarget(
- EScene * prev,
- EScene * next,
- bool &transitional
- ) override;
+ // 更新动画
+ virtual void _update() override;
+
+ virtual void _init() override;
+
+ virtual void _reset() override;
protected:
- float m_fMoveDuration;
MOVE_DIRECT m_Direct;
-};
-
-
-class ETransitionScale :
- public ETransition
-{
-public:
- // 创建缩放式的场景切换动画
- ETransitionScale(
- float scaleOutDuration, /* 第一个场景缩放动画持续时长 */
- float scaleInDuration /* 第二个场景缩放动画持续时长 */
- );
-
-protected:
- // 保存当前场景和下一场景的指针,和控制场景切换的变量
- virtual void _setTarget(
- EScene * prev,
- EScene * next,
- bool &transitional
- ) override;
-
-protected:
- float m_fScaleOutDuration;
- float m_fScaleInDuration;
-};
-
-
-class ETransitionScaleEmerge :
- public ETransition
-{
-public:
- enum SCALE_EMERGE_MODE
- {
- ENTER,
- BACK
- };
-
- // 创建缩放浮现式的场景切换动画
- ETransitionScaleEmerge(
- float duration, /* 场景动画持续时长 */
- SCALE_EMERGE_MODE mode /* 场景移动方向 */
- );
-
-protected:
- // 保存当前场景和下一场景的指针,和控制场景切换的变量
- virtual void _setTarget(
- EScene * prev,
- EScene * next,
- bool &transitional
- ) override;
-
-protected:
- float m_fDuration;
- SCALE_EMERGE_MODE m_Mode;
+ EVec m_Vec;
+ EPoint m_NextPos;
};
}
\ No newline at end of file
diff --git a/Easy2D/etypedef.h b/Easy2D/etypedef.h
index c32af2bc..1728a854 100644
--- a/Easy2D/etypedef.h
+++ b/Easy2D/etypedef.h
@@ -33,6 +33,16 @@ struct EPoint
{
return EPoint(x - p.x, y - p.y);
}
+
+ EPoint operator * (float const & value)
+ {
+ return EPoint(x * value, y * value);
+ }
+
+ EPoint operator / (float const & value)
+ {
+ return EPoint(x / value, y / value);
+ }
};
struct ESize
@@ -61,6 +71,16 @@ struct ESize
{
return ESize(width - size.width, height - size.height);
}
+
+ ESize operator * (float const & value)
+ {
+ return ESize(width * value, height * value);
+ }
+
+ ESize operator / (float const & value)
+ {
+ return ESize(width / value, height / value);
+ }
};