新增获取游戏时长函数,以及窗口在激活、非激活、关闭时的执行函数

This commit is contained in:
Nomango 2017-10-17 23:50:02 +08:00
parent 2422ec258b
commit 0689e1b0e9
6 changed files with 96 additions and 23 deletions

View File

@ -16,6 +16,8 @@ using namespace std::chrono;
e2d::EApp * s_pInstance = nullptr; e2d::EApp * s_pInstance = nullptr;
// 场景栈 // 场景栈
std::stack<e2d::EScene*> s_SceneStack; std::stack<e2d::EScene*> s_SceneStack;
// 游戏开始时间
static steady_clock::time_point s_tStart;
e2d::EApp::EApp() e2d::EApp::EApp()
: m_bRunning(false) : m_bRunning(false)
@ -195,6 +197,8 @@ void e2d::EApp::run()
UpdateWindow(GetHWnd()); UpdateWindow(GetHWnd());
// 运行游戏 // 运行游戏
m_bRunning = true; m_bRunning = true;
// 记录开始时间
s_tStart = steady_clock::now();
MSG msg; MSG msg;
@ -222,7 +226,15 @@ void e2d::EApp::setFPS(UINT32 fps)
nAnimationInterval = 1000 / fps; nAnimationInterval = 1000 / fps;
} }
bool e2d::EApp::onExit() void e2d::EApp::onActivate()
{
}
void e2d::EApp::onInactive()
{
}
bool e2d::EApp::onCloseWindow()
{ {
return true; return true;
} }
@ -241,6 +253,8 @@ void e2d::EApp::_mainLoop()
nInterval = GetInterval(tLast); nInterval = GetInterval(tLast);
// 判断间隔时间是否足够 // 判断间隔时间是否足够
if (nInterval >= nAnimationInterval) if (nInterval >= nAnimationInterval)
{
if (!m_bPaused)
{ {
// 记录当前时间 // 记录当前时间
tLast = GetNow(); tLast = GetNow();
@ -253,6 +267,7 @@ void e2d::EApp::_mainLoop()
this->quit(); this->quit();
} }
} }
}
else else
{ {
// 计算挂起时长 // 计算挂起时长
@ -436,7 +451,12 @@ HWND e2d::EApp::getHWnd()
return GetHWnd(); return GetHWnd();
} }
void e2d::EApp::closeWindow() LONGLONG e2d::EApp::getTotalDurationFromStart()
{
return GetInterval(s_tStart);
}
void e2d::EApp::hideWindow()
{ {
ShowWindow(GetHWnd(), SW_HIDE); ShowWindow(GetHWnd(), SW_HIDE);
} }
@ -460,11 +480,6 @@ void e2d::EApp::free()
} }
// 删除图片缓存 // 删除图片缓存
ESprite::clearCache(); ESprite::clearCache();
// 删除所有定时器、监听器和动画
ETimerManager::clearAllTimers();
EMsgManager::clearAllKeyboardListeners();
EMsgManager::clearAllMouseListeners();
//ActionManager::clearAllActions();
// 删除所有对象 // 删除所有对象
EObjectManager::clearAllObjects(); EObjectManager::clearAllObjects();
} }
@ -481,7 +496,7 @@ void e2d::EApp::end()
void e2d::EApp::_enterNextScene() void e2d::EApp::_enterNextScene()
{ {
// 执行当前场景的 onExit 函数 // 执行当前场景的 onCloseWindow 函数
if (m_pCurrentScene) if (m_pCurrentScene)
{ {
m_pCurrentScene->onExit(); m_pCurrentScene->onExit();
@ -650,10 +665,31 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
wasHandled = true; wasHandled = true;
break; break;
// 窗口激活消息
case WM_ACTIVATE:
{
if (LOWORD(wParam) == WA_INACTIVE)
{
pEApp->getCurrentScene()->onInactive();
pEApp->onInactive();
pEApp->m_bPaused = true;
}
else
{
pEApp->onActivate();
pEApp->getCurrentScene()->onActivate();
pEApp->m_bPaused = false;
}
}
result = 1;
wasHandled = true;
break;
// 窗口关闭消息 // 窗口关闭消息
case WM_CLOSE: case WM_CLOSE:
{ {
if (pEApp->onExit()) if (pEApp->getCurrentScene()->onCloseWindow() &&
pEApp->onCloseWindow())
{ {
DestroyWindow(hWnd); DestroyWindow(hWnd);
} }

View File

@ -26,6 +26,19 @@ void e2d::EScene::onExit()
{ {
} }
void e2d::EScene::onActivate()
{
}
void e2d::EScene::onInactive()
{
}
bool e2d::EScene::onCloseWindow()
{
return true;
}
void e2d::EScene::_onRender() void e2d::EScene::_onRender()
{ {
m_Root->_callOn(); m_Root->_callOn();

View File

@ -208,6 +208,7 @@
<ClCompile Include="Node\ENode.cpp" /> <ClCompile Include="Node\ENode.cpp" />
<ClCompile Include="Node\ERectangle.cpp" /> <ClCompile Include="Node\ERectangle.cpp" />
<ClCompile Include="Node\ESprite.cpp" /> <ClCompile Include="Node\ESprite.cpp" />
<ClCompile Include="Node\EText.cpp" />
<ClCompile Include="Tool\EObjectManager.cpp" /> <ClCompile Include="Tool\EObjectManager.cpp" />
<ClCompile Include="Tool\ETimerManager.cpp" /> <ClCompile Include="Tool\ETimerManager.cpp" />
<ClCompile Include="Win\winbase.cpp" /> <ClCompile Include="Win\winbase.cpp" />

View File

@ -78,6 +78,9 @@
<ClCompile Include="Msg\Listener\EKeyboardPressListener.cpp"> <ClCompile Include="Msg\Listener\EKeyboardPressListener.cpp">
<Filter>Msg\Listener</Filter> <Filter>Msg\Listener</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Node\EText.cpp">
<Filter>Node</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Win\winbase.h"> <ClInclude Include="Win\winbase.h">

1
Easy2D/Node/EText.cpp Normal file
View File

@ -0,0 +1 @@
#include "..\enodes.h"

View File

@ -46,8 +46,14 @@ public:
UINT32 fps UINT32 fps
); );
// 退出程序时的执行程序 // 重写这个函数,它将在窗口激活时执行
virtual bool onExit(); virtual void onActivate();
// 重写这个函数,它将在窗口非激活时执行
virtual void onInactive();
// 重写这个函数,它将在关闭窗口时执行
virtual bool onCloseWindow();
// 释放所有内存资源 // 释放所有内存资源
void free(); void free();
@ -95,6 +101,12 @@ public:
// 获取当前场景 // 获取当前场景
static EScene * getCurrentScene(); static EScene * getCurrentScene();
// 获取窗口句柄
static HWND getHWnd();
// 获取从游戏开始到当前经过的毫秒数
static LONGLONG getTotalDurationFromStart();
// 获取 AppName // 获取 AppName
static EString getAppName(); static EString getAppName();
@ -113,11 +125,8 @@ public:
bool value bool value
); );
// 获取窗口句柄
static HWND getHWnd();
// 隐藏窗口 // 隐藏窗口
static void closeWindow(); static void hideWindow();
// 显示窗口 // 显示窗口
static void showWindow(); static void showWindow();
@ -166,6 +175,7 @@ protected:
protected: protected:
bool m_bRunning; bool m_bRunning;
bool m_bPaused;
EString m_sTitle; EString m_sTitle;
EString m_sAppName; EString m_sAppName;
EColor m_ClearColor; EColor m_ClearColor;
@ -191,6 +201,15 @@ public:
// 重写这个函数,它将在离开这个场景时自动执行 // 重写这个函数,它将在离开这个场景时自动执行
virtual void onExit(); virtual void onExit();
// 重写这个函数,它将在窗口激活时执行
virtual void onActivate();
// 重写这个函数,它将在窗口非激活时执行
virtual void onInactive();
// 重写这个函数,它将在关闭窗口时执行
virtual bool onCloseWindow();
// 添加子节点到场景 // 添加子节点到场景
void add( void add(
ENode * child, ENode * child,