From 6319ed7f2ba0172e9af13de8b9cdd8550473d3a8 Mon Sep 17 00:00:00 2001 From: Nomango <569629550@qq.com> Date: Sun, 4 Feb 2018 21:24:27 +0800 Subject: [PATCH] perfect the pause function. --- core/Action/Action.cpp | 8 +- core/Action/ActionLoop.cpp | 2 +- core/Action/ActionSequence.cpp | 2 +- core/Action/ActionTwo.cpp | 4 +- core/Action/ActionTwoAtSameTime.cpp | 4 +- core/Action/Animation.cpp | 9 +- core/Base/Game.cpp | 50 ++++------ core/Base/Time.cpp | 124 ++++++----------------- core/Base/Window.cpp | 4 + core/Common/Scene.cpp | 18 +++- core/Node/Button.cpp | 33 +++--- core/Node/ButtonToggle.cpp | 95 +++++++++++++----- core/Node/Node.cpp | 25 +++-- core/Tool/Music.cpp | 2 + core/eactions.h | 26 +++-- core/ebase.h | 7 +- core/ecommon.h | 5 +- core/enodes.h | 149 +++++++++++++++++----------- 18 files changed, 308 insertions(+), 259 deletions(-) diff --git a/core/Action/Action.cpp b/core/Action/Action.cpp index a3a3d9a1..43e1b0e1 100644 --- a/core/Action/Action.cpp +++ b/core/Action/Action.cpp @@ -45,13 +45,9 @@ void e2d::EAction::stop() m_bEnding = true; } -void e2d::EAction::setTarget(ENode * node) +void e2d::EAction::_setTarget(ENode * node) { - if (!m_pTarget && node) - { - // 动作只能有一个目标 - m_pTarget = node; - } + m_pTarget = node; } e2d::EAction * e2d::EAction::reverse() const diff --git a/core/Action/ActionLoop.cpp b/core/Action/ActionLoop.cpp index c25ea8cd..00862ffb 100644 --- a/core/Action/ActionLoop.cpp +++ b/core/Action/ActionLoop.cpp @@ -22,7 +22,7 @@ e2d::EActionLoop * e2d::EActionLoop::clone() const void e2d::EActionLoop::_init() { EAction::_init(); - m_pAction->setTarget(m_pTarget); + m_pAction->_setTarget(m_pTarget); m_pAction->_init(); } diff --git a/core/Action/ActionSequence.cpp b/core/Action/ActionSequence.cpp index 015d1934..ae9fd260 100644 --- a/core/Action/ActionSequence.cpp +++ b/core/Action/ActionSequence.cpp @@ -35,7 +35,7 @@ void e2d::EActionSequence::_init() { for (auto action : m_vActions) { - action->setTarget(m_pTarget); + action->_setTarget(m_pTarget); } } // 初始化第一个动作 diff --git a/core/Action/ActionTwo.cpp b/core/Action/ActionTwo.cpp index e3a33082..b2d5f204 100644 --- a/core/Action/ActionTwo.cpp +++ b/core/Action/ActionTwo.cpp @@ -35,8 +35,8 @@ e2d::EActionTwo * e2d::EActionTwo::reverse(bool actionReverse) const void e2d::EActionTwo::_init() { EAction::_init(); - m_pFirstAction->setTarget(m_pTarget); - m_pSecondAction->setTarget(m_pTarget); + m_pFirstAction->_setTarget(m_pTarget); + m_pSecondAction->_setTarget(m_pTarget); m_pFirstAction->_init(); } diff --git a/core/Action/ActionTwoAtSameTime.cpp b/core/Action/ActionTwoAtSameTime.cpp index e52c47d7..ddfa08c5 100644 --- a/core/Action/ActionTwoAtSameTime.cpp +++ b/core/Action/ActionTwoAtSameTime.cpp @@ -35,8 +35,8 @@ e2d::EActionTwoAtSameTime * e2d::EActionTwoAtSameTime::reverse(bool actionRevers void e2d::EActionTwoAtSameTime::_init() { EAction::_init(); - m_pFirstAction->setTarget(m_pTarget); - m_pSecondAction->setTarget(m_pTarget); + m_pFirstAction->_setTarget(m_pTarget); + m_pSecondAction->_setTarget(m_pTarget); m_pFirstAction->_init(); m_pSecondAction->_init(); diff --git a/core/Action/Animation.cpp b/core/Action/Animation.cpp index e62b3c3f..05aa6d9a 100644 --- a/core/Action/Animation.cpp +++ b/core/Action/Animation.cpp @@ -2,12 +2,14 @@ e2d::EAnimation::EAnimation() : m_nFrameIndex(0) + , m_pTarget(nullptr) { } e2d::EAnimation::EAnimation(float invertal) : m_nFrameIndex(0) , m_fInterval(invertal) + , m_pTarget(nullptr) { } @@ -45,7 +47,7 @@ void e2d::EAnimation::_update() // 重新记录时间 m_fLast += m_fInterval; // 加载关键帧 - reinterpret_cast(m_pTarget)->loadFrom(m_vFrames[m_nFrameIndex]); + m_pTarget->loadFrom(m_vFrames[m_nFrameIndex]); m_nFrameIndex++; // 判断动作是否结束 if (m_nFrameIndex == m_vFrames.size()) @@ -62,6 +64,11 @@ void e2d::EAnimation::_reset() m_nFrameIndex = 0; } +void e2d::EAnimation::_setTarget(ENode * node) +{ + m_pTarget = static_cast(node); +} + void e2d::EAnimation::addKeyframe(EImage * frame) { if (frame) diff --git a/core/Base/Game.cpp b/core/Base/Game.cpp index 22787f46..786af78a 100644 --- a/core/Base/Game.cpp +++ b/core/Base/Game.cpp @@ -50,13 +50,6 @@ bool e2d::EGame::init(LPCTSTR sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR pIc break; } - // 初始化计时 - if (!ETime::__init()) - { - WARN_IF(true, "ETime::__init Failed!"); - break; - } - // 初始化 DirectInput if (!EInput::__init()) { @@ -99,22 +92,32 @@ int e2d::EGame::run() ::UpdateWindow(EWindow::getHWnd()); // 处理窗口消息 EWindow::__poll(); - // 刷新时间信息 - ETime::__updateNow(); - ETime::__updateLast(); + // 初始化计时 + ETime::__init(); while (!s_bEndGame) { // 处理窗口消息 EWindow::__poll(); - // 刷新时间信息 + // 刷新时间 ETime::__updateNow(); // 判断是否达到了刷新状态 - if (ETime::getDeltaTime() >= 17) + if (ETime::__isReady()) { - ETime::__updateLast(); // 刷新时间信息 - EGame::__update(); // 更新游戏内容 + while (ETime::__isReady()) + { + EInput::__updateDeviceState(); // 获取用户输入 + ESceneManager::__update(); // 更新场景内容 + ETime::__updateLast(); // 刷新时间信息 + } + + if (!s_bPaused) + { + ETimerManager::__update(); // 定时器管理器执行程序 + EActionManager::__update(); // 动作管理器执行程序 + } + ERenderer::__render(); // 渲染游戏画面 } else @@ -159,8 +162,6 @@ void e2d::EGame::uninit() { // 删除所有场景 ESceneManager::__uninit(); - // 重置窗口属性 - EWindow::__uninit(); // 关闭输入 EInput::__uninit(); // 关闭播放器 @@ -169,27 +170,18 @@ void e2d::EGame::uninit() ETime::__uninit(); // 清空图片缓存 EImage::clearCache(); - // 删除渲染相关资源 - ERenderer::__discardResources(); // 刷新内存池 EObjectManager::__flush(); + // 删除渲染相关资源 + ERenderer::__discardResources(); + // 销毁窗口 + EWindow::__uninit(); CoUninitialize(); s_bInitialized = false; } -void e2d::EGame::__update() -{ - if (s_bPaused) - return; - - EInput::__updateDeviceState(); // 获取用户输入 - ETimerManager::__update(); // 定时器管理器执行程序 - EActionManager::__update(); // 动作管理器执行程序 - ESceneManager::__update(); // 更新游戏内容 -} - e2d::EString e2d::EGame::getAppName() { return s_sAppName; diff --git a/core/Base/Time.cpp b/core/Base/Time.cpp index 267f5363..b046ce6f 100644 --- a/core/Base/Time.cpp +++ b/core/Base/Time.cpp @@ -1,9 +1,23 @@ #include "..\ebase.h" +#include +#include +using namespace std::chrono; + +// 游戏开始时间 +static steady_clock::time_point s_tStart; +// 当前时间 +static steady_clock::time_point s_tNow; +// 上一帧刷新时间 +static steady_clock::time_point s_tFixedUpdate; +// 上一次更新时间 +static steady_clock::time_point s_tLastUpdate; // 上一帧与当前帧的时间间隔 static int s_nInterval = 0; // 游戏开始时长 static float s_fTotalTime = 0; +// 每一帧间隔 +static milliseconds s_tExceptedInvertal; float e2d::ETime::getTotalTime() @@ -16,26 +30,10 @@ int e2d::ETime::getDeltaTime() return s_nInterval; } - - -#if _MSC_VER > 1600 - -#include -#include -using namespace std::chrono; - - -// 游戏开始时间 -static steady_clock::time_point s_tStart; -// 当前时间 -static steady_clock::time_point s_tNow; -// 上一帧刷新时间 -static steady_clock::time_point s_tLast; - - bool e2d::ETime::__init() { - s_tStart = s_tLast = s_tNow = steady_clock::now(); + s_tStart = s_tLastUpdate = s_tFixedUpdate = s_tNow = steady_clock::now(); + s_tExceptedInvertal = milliseconds(17); return true; } @@ -43,93 +41,35 @@ void e2d::ETime::__uninit() { } +bool e2d::ETime::__isReady() +{ + return s_tExceptedInvertal < duration_cast(s_tNow - s_tFixedUpdate); +} + void e2d::ETime::__updateNow() { + // 刷新时间 s_tNow = steady_clock::now(); - s_fTotalTime = static_cast(duration_cast(s_tNow - s_tStart).count()) / 1000.0f; - s_nInterval = static_cast(duration_cast(s_tNow - s_tLast).count()); } void e2d::ETime::__updateLast() { - s_tLast = s_tNow; + s_tFixedUpdate += s_tExceptedInvertal; + s_tLastUpdate = s_tNow; + + s_tNow = steady_clock::now(); + s_nInterval = static_cast(duration_cast(s_tNow - s_tLastUpdate).count()); + s_fTotalTime = static_cast(duration_cast(s_tNow - s_tStart).count()) / 1000.0f; } void e2d::ETime::__sleep() { // 计算挂起时长 - int nWaitMS = 16 - s_nInterval; - // 挂起线程,释放 CPU 占用 + int nWaitMS = 16 - static_cast(duration_cast(s_tNow - s_tFixedUpdate).count()); + if (nWaitMS > 1) { + // 挂起线程,释放 CPU 占用 std::this_thread::sleep_for(milliseconds(nWaitMS)); } -} - - -#else - - -#include -#pragma comment(lib, "winmm.lib") - -// 时钟频率 -static LARGE_INTEGER s_tFreq; -// 当前时间 -static LARGE_INTEGER s_tNow; -// 游戏开始时间 -static LARGE_INTEGER s_tStart; -// 上一帧画面绘制时间 -static LARGE_INTEGER s_tLast; - - - -bool e2d::ETime::__init() -{ - bool bRet = false; - if (::timeBeginPeriod(1)) - { - // 修改时间精度 - if (::QueryPerformanceFrequency(&s_tFreq)) // 获取时钟频率 - { - - if (::QueryPerformanceCounter(&s_tNow)) // 刷新当前时间 - { - s_tStart = s_tLast = s_tNow; - bRet = true; - } - } - } - return bRet; -} - -void e2d::ETime::__uninit() -{ - ::timeEndPeriod(1); // 重置时间精度 -} - -void e2d::ETime::__updateNow() -{ - ::QueryPerformanceCounter(&s_tNow); - s_fTotalTime = static_cast(s_tNow.QuadPart - s_tStart.QuadPart) / s_tFreq.QuadPart; - s_nInterval = static_cast((s_tNow.QuadPart - s_tLast.QuadPart) * 1000LL / s_tFreq.QuadPart); -} - -void e2d::ETime::__updateLast() -{ - s_tLast = s_tNow; -} - -void e2d::ETime::__sleep() -{ - // 计算挂起时长 - int nWaitMS = 16 - s_nInterval; - // 挂起线程,释放 CPU 占用 - if (nWaitMS > 1) - { - ::Sleep(nWaitMS); - } -} - - -#endif // _MSC_VER > 1600 +} \ No newline at end of file diff --git a/core/Base/Window.cpp b/core/Base/Window.cpp index 6a5cd01e..5a278669 100644 --- a/core/Base/Window.cpp +++ b/core/Base/Window.cpp @@ -102,10 +102,14 @@ bool e2d::EWindow::__init(LPCTSTR sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR void e2d::EWindow::__uninit() { + // 关闭控制台 if (::GetConsoleWindow()) { ::FreeConsole(); } + // 关闭窗口 + DestroyWindow(s_HWnd); + s_HWnd = nullptr; } void e2d::EWindow::__poll() diff --git a/core/Common/Scene.cpp b/core/Common/Scene.cpp index bcd7796d..05574c80 100644 --- a/core/Common/Scene.cpp +++ b/core/Common/Scene.cpp @@ -39,13 +39,21 @@ void e2d::EScene::_render() void e2d::EScene::_update() { - // 执行 onUpdate 函数 - if (m_bAutoUpdate) + if (!EGame::isPaused()) { - this->onUpdate(); + // 执行 onUpdate 函数 + if (m_bAutoUpdate) + { + this->onUpdate(); + } + // 更新根节点 + m_pRoot->_update(false); + } + else + { + // 更新根节点 + m_pRoot->_update(true); } - // 更新根节点 - m_pRoot->_update(); } void e2d::EScene::setAutoUpdate(bool bAutoUpdate) diff --git a/core/Node/Button.cpp b/core/Node/Button.cpp index 445f5223..4869894e 100644 --- a/core/Node/Button.cpp +++ b/core/Node/Button.cpp @@ -2,7 +2,7 @@ e2d::EButton::EButton() : m_Callback((const BtnClkCallback &)nullptr) - , m_eStatus(EButton::NORMAL) + , m_eBtnState(EButton::NORMAL) , m_bEnable(true) , m_bIsSelected(false) , m_pNormal(nullptr) @@ -14,7 +14,7 @@ e2d::EButton::EButton() e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback) : m_Callback((const BtnClkCallback &)nullptr) - , m_eStatus(EButton::NORMAL) + , m_eBtnState(EButton::NORMAL) , m_bEnable(true) , m_bIsSelected(false) , m_pNormal(nullptr) @@ -28,7 +28,7 @@ e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback) e2d::EButton::EButton(ENode * normal, ENode * selected, const BtnClkCallback & callback) : m_Callback((const BtnClkCallback &)nullptr) - , m_eStatus(EButton::NORMAL) + , m_eBtnState(EButton::NORMAL) , m_bEnable(true) , m_bIsSelected(false) , m_pNormal(nullptr) @@ -43,7 +43,7 @@ e2d::EButton::EButton(ENode * normal, ENode * selected, const BtnClkCallback & c e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const BtnClkCallback & callback) : m_Callback((const BtnClkCallback &)nullptr) - , m_eStatus(EButton::NORMAL) + , m_eBtnState(EButton::NORMAL) , m_bEnable(true) , m_bIsSelected(false) , m_pNormal(nullptr) @@ -59,7 +59,7 @@ e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, ENode * disabled, const BtnClkCallback & callback) : m_Callback((const BtnClkCallback &)nullptr) - , m_eStatus(EButton::NORMAL) + , m_eBtnState(EButton::NORMAL) , m_bEnable(true) , m_bIsSelected(false) , m_pNormal(nullptr) @@ -228,7 +228,7 @@ void e2d::EButton::onUpdate() { // 鼠标左键按下,且位于按钮内时,标记 m_bIsSelected 为 true m_bIsSelected = true; - _setStatus(EButton::SELECTED); + _setState(EButton::SELECTED); return; } } @@ -237,25 +237,30 @@ void e2d::EButton::onUpdate() { if (pSelected->isPointIn(EInput::getMousePos())) { - _setStatus(EButton::SELECTED); + _setState(EButton::SELECTED); return; } } else if (m_pNormal->isPointIn(EInput::getMousePos())) { - _setStatus(EButton::MOUSEOVER); + _setState(EButton::MOUSEOVER); return; } - _setStatus(EButton::NORMAL); + _setState(EButton::NORMAL); } } -void e2d::EButton::_setStatus(STATUS status) +void e2d::EButton::onPause() { - if (m_eStatus != status) + this->onUpdate(); +} + +void e2d::EButton::_setState(BTN_STATE state) +{ + if (m_eBtnState != state) { - m_eStatus = status; + m_eBtnState = state; _updateVisiable(); } } @@ -269,11 +274,11 @@ void e2d::EButton::_updateVisiable() if (m_bEnable) { - if (m_eStatus == EButton::SELECTED && m_pSelected) + if (m_eBtnState == EButton::SELECTED && m_pSelected) { m_pSelected->setVisiable(true); } - else if (m_eStatus == EButton::MOUSEOVER && m_pMouseover) + else if (m_eBtnState == EButton::MOUSEOVER && m_pMouseover) { m_pMouseover->setVisiable(true); } diff --git a/core/Node/ButtonToggle.cpp b/core/Node/ButtonToggle.cpp index e2846d77..0b611228 100644 --- a/core/Node/ButtonToggle.cpp +++ b/core/Node/ButtonToggle.cpp @@ -2,7 +2,7 @@ e2d::EButtonToggle::EButtonToggle() : EButton() - , m_bToggle(true) + , m_bState(true) , m_pNormalOn(nullptr) , m_pMouseoverOn(nullptr) , m_pSelectedOn(nullptr) @@ -16,7 +16,7 @@ e2d::EButtonToggle::EButtonToggle() e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, const BtnClkCallback & callback) : EButton() - , m_bToggle(true) + , m_bState(true) , m_pNormalOn(nullptr) , m_pMouseoverOn(nullptr) , m_pSelectedOn(nullptr) @@ -33,7 +33,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback) : EButton() - , m_bToggle(true) + , m_bState(true) , m_pNormalOn(nullptr) , m_pMouseoverOn(nullptr) , m_pSelectedOn(nullptr) @@ -52,7 +52,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback) : EButton() - , m_bToggle(true) + , m_bState(true) , m_pNormalOn(nullptr) , m_pMouseoverOn(nullptr) , m_pSelectedOn(nullptr) @@ -73,7 +73,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, ENode * toggleOnDisabled, ENode * toggleOffDisabled, const BtnClkCallback & callback) : EButton() - , m_bToggle(true) + , m_bState(true) , m_pNormalOn(nullptr) , m_pMouseoverOn(nullptr) , m_pSelectedOn(nullptr) @@ -97,7 +97,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma void e2d::EButtonToggle::toggle() { // 设置按钮状态 - setToggle(!m_bToggle); + setState(!m_bState); // 执行回调函数 if (m_Callback) { @@ -105,17 +105,17 @@ void e2d::EButtonToggle::toggle() } } -bool e2d::EButtonToggle::isToggleOn() const +bool e2d::EButtonToggle::getState() const { - return m_bToggle; + return m_bState; } -void e2d::EButtonToggle::setToggle(bool toggle) +void e2d::EButtonToggle::setState(bool bState) { - if (m_bToggle != toggle) + if (m_bState != bState) { - m_bToggle = toggle; - _updateToggle(); + m_bState = bState; + _updateState(); _updateVisiable(); } } @@ -133,10 +133,11 @@ void e2d::EButtonToggle::setNormal(ENode * normal) if (normal) { this->addChild(normal); + normal->setPivot(m_fPivotX, m_fPivotY); } m_pNormalOn = normal; - _updateToggle(); + _updateState(); _updateVisiable(); } } @@ -154,10 +155,11 @@ void e2d::EButtonToggle::setMouseOver(ENode * mouseover) if (mouseover) { this->addChild(mouseover); + mouseover->setPivot(m_fPivotX, m_fPivotY); } m_pMouseoverOn = mouseover; - _updateToggle(); + _updateState(); _updateVisiable(); } } @@ -175,10 +177,11 @@ void e2d::EButtonToggle::setSelected(ENode * selected) if (selected) { this->addChild(selected); + selected->setPivot(m_fPivotX, m_fPivotY); } m_pSelectedOn = selected; - _updateToggle(); + _updateState(); _updateVisiable(); } } @@ -196,10 +199,11 @@ void e2d::EButtonToggle::setDisabled(ENode * disabled) if (disabled) { this->addChild(disabled); + disabled->setPivot(m_fPivotX, m_fPivotY); } m_pDisabledOn = disabled; - _updateToggle(); + _updateState(); _updateVisiable(); } } @@ -217,10 +221,11 @@ void e2d::EButtonToggle::setNormalOff(ENode * normal) if (normal) { this->addChild(normal); + normal->setPivot(m_fPivotX, m_fPivotY); } m_pNormalOff = normal; - _updateToggle(); + _updateState(); _updateVisiable(); } } @@ -238,10 +243,11 @@ void e2d::EButtonToggle::setMouseOverOff(ENode * mouseover) if (mouseover) { this->addChild(mouseover); + mouseover->setPivot(m_fPivotX, m_fPivotY); } m_pMouseoverOff = mouseover; - _updateToggle(); + _updateState(); _updateVisiable(); } } @@ -259,10 +265,11 @@ void e2d::EButtonToggle::setSelectedOff(ENode * selected) if (selected) { this->addChild(selected); + selected->setPivot(m_fPivotX, m_fPivotY); } m_pSelectedOff = selected; - _updateToggle(); + _updateState(); _updateVisiable(); } } @@ -280,17 +287,57 @@ void e2d::EButtonToggle::setDisabledOff(ENode * disabled) if (disabled) { this->addChild(disabled); + disabled->setPivot(m_fPivotX, m_fPivotY); } m_pDisabledOff = disabled; - _updateToggle(); + _updateState(); _updateVisiable(); } } -void e2d::EButtonToggle::_updateToggle() +void e2d::EButtonToggle::setPivotX(float pivotX) { - if (m_bToggle) + ENode::setPivotX(pivotX); + if (m_pNormalOn) m_pNormalOn->setPivotX(pivotX); + if (m_pMouseoverOn) m_pMouseoverOn->setPivotX(pivotX); + if (m_pSelectedOn) m_pSelectedOn->setPivotX(pivotX); + if (m_pDisabledOn) m_pDisabledOn->setPivotX(pivotX); + if (m_pNormalOff) m_pNormalOff->setPivotX(pivotX); + if (m_pMouseoverOff) m_pMouseoverOff->setPivotX(pivotX); + if (m_pSelectedOff) m_pSelectedOff->setPivotX(pivotX); + if (m_pDisabledOff) m_pDisabledOff->setPivotX(pivotX); +} + +void e2d::EButtonToggle::setPivotY(float pivotY) +{ + ENode::setPivotY(pivotY); + if (m_pNormalOn) m_pNormalOn->setPivotY(pivotY); + if (m_pMouseoverOn) m_pMouseoverOn->setPivotY(pivotY); + if (m_pSelectedOn) m_pSelectedOn->setPivotY(pivotY); + if (m_pDisabledOn) m_pDisabledOn->setPivotY(pivotY); + if (m_pNormalOff) m_pNormalOff->setPivotY(pivotY); + if (m_pMouseoverOff) m_pMouseoverOff->setPivotY(pivotY); + if (m_pSelectedOff) m_pSelectedOff->setPivotY(pivotY); + if (m_pDisabledOff) m_pDisabledOff->setPivotY(pivotY); +} + +void e2d::EButtonToggle::setPivot(float pivotX, float pivotY) +{ + ENode::setPivot(pivotX, pivotY); + if (m_pNormalOn) m_pNormalOn->setPivot(pivotX, pivotY); + if (m_pMouseoverOn) m_pMouseoverOn->setPivot(pivotX, pivotY); + if (m_pSelectedOn) m_pSelectedOn->setPivot(pivotX, pivotY); + if (m_pDisabledOn) m_pDisabledOn->setPivot(pivotX, pivotY); + if (m_pNormalOff) m_pNormalOff->setPivot(pivotX, pivotY); + if (m_pMouseoverOff) m_pMouseoverOff->setPivot(pivotX, pivotY); + if (m_pSelectedOff) m_pSelectedOff->setPivot(pivotX, pivotY); + if (m_pDisabledOff) m_pDisabledOff->setPivot(pivotX, pivotY); +} + +void e2d::EButtonToggle::_updateState() +{ + if (m_bState) { m_pNormal = m_pNormalOn; m_pMouseover = m_pMouseoverOn; @@ -318,8 +365,8 @@ void e2d::EButtonToggle::_updateToggle() void e2d::EButtonToggle::_runCallback() { - m_bToggle = !m_bToggle; - _updateToggle(); + m_bState = !m_bState; + _updateState(); if (m_Callback) { diff --git a/core/Node/Node.cpp b/core/Node/Node.cpp index a7dc776e..1adc5372 100644 --- a/core/Node/Node.cpp +++ b/core/Node/Node.cpp @@ -45,7 +45,7 @@ e2d::ENode::~ENode() } } -void e2d::ENode::_update() +void e2d::ENode::_update(bool bPaused) { if (m_bTransformNeeded) { @@ -77,7 +77,7 @@ void e2d::ENode::_update() // 访问 Order 小于零的节点 if (child->getOrder() < 0) { - child->_update(); + child->_update(bPaused); } else { @@ -85,20 +85,29 @@ void e2d::ENode::_update() } } - // 执行 onUpdate 函数 - if (m_bAutoUpdate) + if (bPaused) + { + this->onPause(); + } + else if (m_bAutoUpdate) { this->onUpdate(); } // 访问剩余节点 for (; i < size; i++) - m_vChildren[i]->_update(); + m_vChildren[i]->_update(bPaused); } else { - // 执行 onUpdate 函数 - this->onUpdate(); + if (bPaused) + { + this->onPause(); + } + else if (m_bAutoUpdate) + { + this->onUpdate(); + } } } @@ -720,7 +729,7 @@ void e2d::ENode::runAction(EAction * action) { action = action->clone(); } - action->setTarget(this); + action->_setTarget(this); EActionManager::addAction(action); } diff --git a/core/Tool/Music.cpp b/core/Tool/Music.cpp index 947cbfa6..90e7f1cb 100644 --- a/core/Tool/Music.cpp +++ b/core/Tool/Music.cpp @@ -253,6 +253,8 @@ void EMusic::_close() { if (m_pSourceVoice) { + m_pSourceVoice->Stop(); + m_pSourceVoice->FlushSourceBuffers(); m_pSourceVoice->DestroyVoice(); m_pSourceVoice = nullptr; } diff --git a/core/eactions.h b/core/eactions.h index 6d3e52ef..5622bc9c 100644 --- a/core/eactions.h +++ b/core/eactions.h @@ -4,6 +4,7 @@ namespace e2d { +class ENode; class EActionManager; class EActionTwo; class EActionLoop; @@ -14,6 +15,7 @@ class ETransitionFade; class EAction : public EObject { + friend ENode; friend EActionManager; friend EActionTwo; friend EActionLoop; @@ -49,11 +51,6 @@ public: // 获取执行该动作的目标 virtual ENode * getTarget(); - // 设置动作执行目标 - virtual void setTarget( - ENode * node - ); - protected: // 初始化动作 virtual void _init(); @@ -70,6 +67,11 @@ protected: // 重置动画时间 virtual void _resetTime(); + // 设置动作执行目标 + virtual void _setTarget( + ENode * node + ); + protected: bool m_bRunning; bool m_bEnding; @@ -579,9 +581,9 @@ public: EImage * frame /* 添加关键帧 */ ); - // 设置每一帧的时间间隔(秒) + // 设置每一帧的时间间隔 void setInterval( - float interval + float interval /* 帧间隔(秒) */ ); // 获取该动画的拷贝对象 @@ -600,9 +602,15 @@ protected: // 重置动作 virtual void _reset() override; + // 设置动作执行目标 + virtual void _setTarget( + ENode * node + ) override; + protected: - float m_fInterval; - UINT m_nFrameIndex; + float m_fInterval; + UINT m_nFrameIndex; + ESprite* m_pTarget; std::vector m_vFrames; }; diff --git a/core/ebase.h b/core/ebase.h index 602a83d9..7e011252 100644 --- a/core/ebase.h +++ b/core/ebase.h @@ -41,10 +41,6 @@ public: // 获取 AppName static EString getAppName(); - -private: - // 更新游戏内容 - static void __update(); }; @@ -129,6 +125,9 @@ private: // 重置计时操作 static void __uninit(); + // 是否达到更新时间 + static bool __isReady(); + // 更新当前时间 static void __updateNow(); diff --git a/core/ecommon.h b/core/ecommon.h index f6f53bb1..a08ea4ef 100644 --- a/core/ecommon.h +++ b/core/ecommon.h @@ -634,8 +634,11 @@ public: // 重写这个函数,它将在每一帧画面刷新时执行 virtual void onUpdate() {} + // 重写这个函数,它将在游戏暂停时执行 + virtual void onPause() {} + // 开启或禁用 onUpdate 函数 - virtual void setAutoUpdate( + void setAutoUpdate( bool bAutoUpdate ); diff --git a/core/enodes.h b/core/enodes.h index f7d831a6..3707e44d 100644 --- a/core/enodes.h +++ b/core/enodes.h @@ -21,6 +21,12 @@ public: virtual ~ENode(); + // 进入场景时执行 + virtual void onEnter() {} + + // 离开场景时执行 + virtual void onExit() {} + // 更新节点 virtual void onUpdate() {} @@ -33,11 +39,11 @@ public: int nRelation /* 碰撞关系,取值为 ERelation::VALUE 中的一种 */ ) {} - // 进入场景时执行 - virtual void onEnter() {} + // 游戏暂停时的处理 + virtual void onPause() {} - // 离开场景时执行 - virtual void onExit() {} + // 节点被销毁时的处理 + virtual void onDestroy() {} // 获取节点显示状态 virtual bool isVisiable() const; @@ -331,46 +337,48 @@ public: protected: // 更新节点 - virtual void _update(); + void _update( + bool bPaused + ); // 渲染节点 - virtual void _render(); + void _render(); - // 渲染几何图形 - virtual void _drawShape(); + // 渲染图形 + void _drawShape(); // 节点被添加到场景时的执行程序 - virtual void _onEnter(); + void _onEnter(); // 节点从场景中消失时的执行程序 - virtual void _onExit(); + void _onExit(); // 设置节点所在场景 - virtual void _setParentScene( + void _setParentScene( EScene * scene ); // 对自身进行二维矩阵变换 - virtual void _updateTransform(); + void _updateTransform(); // 更新所有子节点矩阵 - virtual void _updateChildrenTransform(); + void _updateChildrenTransform(); // 更新所有子节点透明度 - virtual void _updateChildrenOpacity(); + void _updateChildrenOpacity(); - // 更新节点矩阵 + // 修改节点大小 + void _setSize( + float width, + float height + ); + + // 更新节点二维矩阵 static void _updateTransform(ENode * node); // 更新节点透明度 static void _updateOpacity(ENode * node); - // 修改节点大小 - virtual void _setSize( - float width, - float height - ); - protected: EString m_sName; size_t m_nHashName; @@ -624,13 +632,16 @@ public: ) override; // 更新按钮状态 - virtual void onUpdate(); + virtual void onUpdate() override; + + // 更新游戏暂停时的按钮状态 + virtual void onPause() override; protected: - enum STATUS { NORMAL, MOUSEOVER, SELECTED }; + enum BTN_STATE { NORMAL, MOUSEOVER, SELECTED }; // 设置按钮状态 - virtual void _setStatus(STATUS status); + virtual void _setState(BTN_STATE state); // 刷新按钮显示 virtual void _updateVisiable(); @@ -639,14 +650,14 @@ protected: virtual void _runCallback(); protected: - STATUS m_eStatus; - ENode * m_pNormal; - ENode * m_pMouseover; - ENode * m_pSelected; - ENode * m_pDisabled; - bool m_bEnable; - bool m_bIsSelected; - BtnClkCallback m_Callback; + ENode * m_pNormal; + ENode * m_pMouseover; + ENode * m_pSelected; + ENode * m_pDisabled; + bool m_bEnable; + bool m_bIsSelected; + BTN_STATE m_eBtnState; + BtnClkCallback m_Callback; }; @@ -659,54 +670,53 @@ public: // 创建开关按钮 EButtonToggle( - ENode * toggleOnNormal, - ENode * toggleOffNormal, + ENode * onNormal, + ENode * offNormal, const BtnClkCallback & callback = nullptr ); // 创建开关按钮 EButtonToggle( - ENode * toggleOnNormal, - ENode * toggleOffNormal, - ENode * toggleOnSelected, - ENode * toggleOffSelected, + ENode * onNormal, + ENode * offNormal, + ENode * onSelected, + ENode * offSelected, const BtnClkCallback & callback = nullptr ); // 创建开关按钮 EButtonToggle( - ENode * toggleOnNormal, - ENode * toggleOffNormal, - ENode * toggleOnMouseOver, - ENode * toggleOffMouseOver, - ENode * toggleOnSelected, - ENode * toggleOffSelected, + ENode * onNormal, + ENode * offNormal, + ENode * onMouseOver, + ENode * offMouseOver, + ENode * onSelected, + ENode * offSelected, const BtnClkCallback & callback = nullptr ); // 创建开关按钮 EButtonToggle( - ENode * toggleOnNormal, - ENode * toggleOffNormal, - ENode * toggleOnMouseOver, - ENode * toggleOffMouseOver, - ENode * toggleOnSelected, - ENode * toggleOffSelected, - ENode * toggleOnDisabled, - ENode * toggleOffDisabled, + ENode * onNormal, + ENode * offNormal, + ENode * onMouseOver, + ENode * offMouseOver, + ENode * onSelected, + ENode * offSelected, + ENode * onDisabled, + ENode * offDisabled, const BtnClkCallback & callback = nullptr ); - // 切换开关状态,并执行回调函数 + // 切换开关状态(执行回调函数) void toggle(); // 获取开关状态 - bool isToggleOn() const; + bool getState() const; - // 打开或关闭开关 - // 仅设置按钮状态,不执行回调函数 - void setToggle( - bool toggle + // 设置开关按钮的状态(打开或关闭) + void setState( + bool bState ); // 设置按钮打开状态下显示的按钮 @@ -749,9 +759,28 @@ public: ENode * disabled ); + // 设置中心点的横向位置 + // 默认为 0, 范围 [0, 1] + virtual void setPivotX( + float pivotX + ) override; + + // 设置中心点的纵向位置 + // 默认为 0, 范围 [0, 1] + virtual void setPivotY( + float pivotY + ) override; + + // 设置中心点位置 + // 默认为 (0, 0), 范围 [0, 1] + virtual void setPivot( + float pivotX, + float pivotY + ) override; + protected: // 刷新按钮开关 - virtual void _updateToggle(); + virtual void _updateState(); // 执行按钮回调函数 virtual void _runCallback() override; @@ -765,7 +794,7 @@ protected: ENode * m_pSelectedOff; ENode * m_pDisabledOn; ENode * m_pDisabledOff; - bool m_bToggle; + bool m_bState; };