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

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;
// 场景栈
std::stack<e2d::EScene*> s_SceneStack;
// 游戏开始时间
static steady_clock::time_point s_tStart;
e2d::EApp::EApp()
: m_bRunning(false)
@ -195,6 +197,8 @@ void e2d::EApp::run()
UpdateWindow(GetHWnd());
// 运行游戏
m_bRunning = true;
// 记录开始时间
s_tStart = steady_clock::now();
MSG msg;
@ -222,7 +226,15 @@ void e2d::EApp::setFPS(UINT32 fps)
nAnimationInterval = 1000 / fps;
}
bool e2d::EApp::onExit()
void e2d::EApp::onActivate()
{
}
void e2d::EApp::onInactive()
{
}
bool e2d::EApp::onCloseWindow()
{
return true;
}
@ -242,15 +254,18 @@ void e2d::EApp::_mainLoop()
// 判断间隔时间是否足够
if (nInterval >= nAnimationInterval)
{
// 记录当前时间
tLast = GetNow();
// 游戏控制流程
_onControl();
// 刷新游戏画面
if (!_onRender())
if (!m_bPaused)
{
MessageBox(GetHWnd(), L"Game Render Failed!", L"Error", MB_OK);
this->quit();
// 记录当前时间
tLast = GetNow();
// 游戏控制流程
_onControl();
// 刷新游戏画面
if (!_onRender())
{
MessageBox(GetHWnd(), L"Game Render Failed!", L"Error", MB_OK);
this->quit();
}
}
}
else
@ -436,7 +451,12 @@ HWND e2d::EApp::getHWnd()
return GetHWnd();
}
void e2d::EApp::closeWindow()
LONGLONG e2d::EApp::getTotalDurationFromStart()
{
return GetInterval(s_tStart);
}
void e2d::EApp::hideWindow()
{
ShowWindow(GetHWnd(), SW_HIDE);
}
@ -460,11 +480,6 @@ void e2d::EApp::free()
}
// 删除图片缓存
ESprite::clearCache();
// 删除所有定时器、监听器和动画
ETimerManager::clearAllTimers();
EMsgManager::clearAllKeyboardListeners();
EMsgManager::clearAllMouseListeners();
//ActionManager::clearAllActions();
// 删除所有对象
EObjectManager::clearAllObjects();
}
@ -481,7 +496,7 @@ void e2d::EApp::end()
void e2d::EApp::_enterNextScene()
{
// 执行当前场景的 onExit 函数
// 执行当前场景的 onCloseWindow 函数
if (m_pCurrentScene)
{
m_pCurrentScene->onExit();
@ -650,10 +665,31 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
wasHandled = true;
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:
{
if (pEApp->onExit())
if (pEApp->getCurrentScene()->onCloseWindow() &&
pEApp->onCloseWindow())
{
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()
{
m_Root->_callOn();

View File

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

View File

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