修复了其他场景的按钮继续工作的bug;修复了监听器和定时器在某些情况下崩溃的bug

This commit is contained in:
Nomango 2017-11-08 15:23:07 +08:00
parent a7b29bbdf9
commit 07abf5cf96
7 changed files with 56 additions and 56 deletions

View File

@ -101,7 +101,7 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<DebugInformationFormat>None</DebugInformationFormat>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<MinimalRebuild>false</MinimalRebuild>
</ClCompile>
<Link>

View File

@ -1,4 +1,5 @@
#include "..\elisteners.h"
#include "..\enodes.h"
e2d::EListener::EListener()
: m_bRunning(false)
@ -53,3 +54,16 @@ void e2d::EListener::setAlwaysWorking(bool bAlways)
{
m_bAlways = bAlways;
}
bool e2d::EListener::_isReady() const
{
if (m_bRunning && m_pParentNode)
{
if (m_pParentNode->getParentScene() == EApp::getCurrentScene())
{
if (!EApp::isPaused() || m_bAlways)
return true;
}
}
return false;
}

View File

@ -24,21 +24,13 @@ void e2d::EMsgManager::MouseProc(UINT message, WPARAM wParam, LPARAM lParam)
do
{
auto &mlistener = s_vMouseListeners[--i];
auto mlistener = s_vMouseListeners[--i];
if (EApp::isPaused() && !mlistener->m_bAlways)
continue;
if (mlistener->m_bAlways || mlistener->isRunning())
if (mlistener->_isReady())
{
if (mlistener->getParentNode() &&
mlistener->getParentNode()->getParentScene() == EApp::getCurrentScene())
{
mlistener->_callOn();
if (mlistener->m_bSwallow)
break;
}
mlistener->_callOn();
if (mlistener->m_bSwallow)
break;
}
} while (i != 0);
}
@ -57,21 +49,13 @@ void e2d::EMsgManager::KeyboardProc(UINT message, WPARAM wParam, LPARAM lParam)
do
{
auto &klistener = s_vKeyboardListeners[--i];
auto klistener = s_vKeyboardListeners[--i];
if (EApp::isPaused() && !klistener->m_bAlways)
continue;
if (klistener->m_bAlways || klistener->isRunning())
if (klistener->_isReady())
{
if (klistener->getParentNode() &&
klistener->getParentNode()->getParentScene() == EApp::getCurrentScene())
{
klistener->_callOn();
if (klistener->m_bSwallow)
break;
}
klistener->_callOn();
if (klistener->m_bSwallow)
break;
}
} while (i != 0);
}

View File

@ -48,19 +48,19 @@ void e2d::EPhysicsManager::PhysicsGeometryProc(EGeometry * pActiveGeometry)
void e2d::EPhysicsManager::PhysicsListenerProc()
{
// 执行鼠标消息监听函数
for (size_t i = 0; i < s_vListeners.size(); i++)
{
auto &listener = s_vListeners[i];
EVector<EListenerPhysics*>::size_type i = s_vListeners.size();
if (listener->isRunning())
do
{
auto listener = s_vListeners[--i];
if (listener->_isReady())
{
if (listener->getParentNode() &&
listener->getParentNode()->getParentScene() == EApp::getCurrentScene())
{
listener->_callOn();
}
listener->_callOn();
if (listener->m_bSwallow)
break;
}
}
} while (i != 0);
}
void e2d::EPhysicsManager::bindListener(EListenerPhysics * listener, EScene * pParentScene)

View File

@ -8,22 +8,15 @@ static e2d::EVector<e2d::ETimer*> s_vTimers;
void e2d::ETimerManager::TimerProc()
{
if (EApp::isPaused())
if (s_vTimers.empty() || EApp::isPaused())
return;
for (size_t i = 0; i < s_vTimers.size(); i++)
{
auto &t = s_vTimers[i];
if (t->isRunning())
if (t->_isReady())
{
if (t->getParentNode() &&
t->getParentNode()->getParentScene() == EApp::getCurrentScene())
{
if (t->_isReady())
{
t->_callOn();
}
}
t->_callOn();
}
}
}

View File

@ -1,4 +1,5 @@
#include "..\etools.h"
#include "..\enodes.h"
#include "..\emanagers.h"
#include "..\Win\winbase.h"
@ -105,16 +106,21 @@ void e2d::ETimer::_callOn()
bool e2d::ETimer::_isReady()
{
if (m_bAtOnce && m_nRunTimes == 0)
return true;
if (m_nInterval == 0)
return true;
if (GetInterval(m_tLast) >= m_nInterval)
if (m_bRunning &&
m_pParentNode &&
m_pParentNode->getParentScene() == EApp::getCurrentScene())
{
m_tLast += milliseconds(m_nInterval);
return true;
if (m_bAtOnce && m_nRunTimes == 0)
return true;
if (m_nInterval == 0)
return true;
if (GetInterval(m_tLast) >= m_nInterval)
{
m_tLast += milliseconds(m_nInterval);
return true;
}
}
return false;
}

View File

@ -66,6 +66,9 @@ protected:
// 执行监听器回调函数
virtual void _callOn() = 0;
// 获取监听器状态是否就绪
virtual bool _isReady() const;
protected:
EString m_sName;
bool m_bRunning;