修复了其他场景的按钮继续工作的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> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<DebugInformationFormat>None</DebugInformationFormat> <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
</ClCompile> </ClCompile>
<Link> <Link>

View File

@ -1,4 +1,5 @@
#include "..\elisteners.h" #include "..\elisteners.h"
#include "..\enodes.h"
e2d::EListener::EListener() e2d::EListener::EListener()
: m_bRunning(false) : m_bRunning(false)
@ -53,3 +54,16 @@ void e2d::EListener::setAlwaysWorking(bool bAlways)
{ {
m_bAlways = 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,22 +24,14 @@ void e2d::EMsgManager::MouseProc(UINT message, WPARAM wParam, LPARAM lParam)
do do
{ {
auto &mlistener = s_vMouseListeners[--i]; auto mlistener = s_vMouseListeners[--i];
if (EApp::isPaused() && !mlistener->m_bAlways) if (mlistener->_isReady())
continue;
if (mlistener->m_bAlways || mlistener->isRunning())
{
if (mlistener->getParentNode() &&
mlistener->getParentNode()->getParentScene() == EApp::getCurrentScene())
{ {
mlistener->_callOn(); mlistener->_callOn();
if (mlistener->m_bSwallow) if (mlistener->m_bSwallow)
break; break;
} }
}
} while (i != 0); } while (i != 0);
} }
@ -57,22 +49,14 @@ void e2d::EMsgManager::KeyboardProc(UINT message, WPARAM wParam, LPARAM lParam)
do do
{ {
auto &klistener = s_vKeyboardListeners[--i]; auto klistener = s_vKeyboardListeners[--i];
if (EApp::isPaused() && !klistener->m_bAlways) if (klistener->_isReady())
continue;
if (klistener->m_bAlways || klistener->isRunning())
{
if (klistener->getParentNode() &&
klistener->getParentNode()->getParentScene() == EApp::getCurrentScene())
{ {
klistener->_callOn(); klistener->_callOn();
if (klistener->m_bSwallow) if (klistener->m_bSwallow)
break; break;
} }
}
} while (i != 0); } while (i != 0);
} }

View File

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

View File

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

View File

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

View File

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