Magic_Game/core/Base/Game.cpp

189 lines
3.3 KiB
C++

#include "..\ebase.h"
#include "..\emanagers.h"
// 控制游戏终止
static bool s_bEndGame = false;
// 控制游戏暂停
static bool s_bPaused = false;
// 是否进行过初始化
static bool s_bInitialized = false;
// AppName
static e2d::EString s_sAppName;
bool e2d::EGame::init(LPCTSTR sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR pIconID, LPCTSTR sAppname)
{
if (s_bInitialized)
{
WARN_IF(true, "The game has been initialized!");
return false;
}
do
{
// 初始化 COM 组件
if (FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
{
WARN_IF(true, "CoInitializeEx Failed!");
break;
}
// 创建设备无关资源
if (!ERenderer::__createDeviceIndependentResources())
{
WARN_IF(true, "ERenderer::__createDeviceIndependentResources Failed!");
break;
}
// 初始化窗口
if (!EWindow::__init(sTitle, nWidth, nHeight, pIconID))
{
WARN_IF(true, "EWindow::__init Failed!");
break;
}
// 创建设备相关资源
if (!ERenderer::__createDeviceResources())
{
WARN_IF(true, "ERenderer::__createDeviceResources Failed!");
break;
}
// 初始化 DirectInput
if (!EInput::__init())
{
WARN_IF(true, "EInput::__init Failed!");
break;
}
// 初始化播放器
if (!EMusicManager::__init())
{
WARN_IF(true, "EMusicManager::__init Failed!");
break;
}
// 重设 Client 大小
EWindow::setSize(nWidth, nHeight);
// 设置 AppName
s_sAppName = (sAppname != nullptr) ? sAppname : EWindow::getTitle();
// 标志初始化成功
s_bInitialized = true;
} while (0);
return s_bInitialized;
}
int e2d::EGame::run()
{
if (!s_bInitialized)
{
ASSERT(false, "You must initialize EGame first!");
return -1;
}
// 初始化场景管理器
ESceneManager::__init();
// 显示窗口
::ShowWindow(EWindow::getHWnd(), SW_SHOWNORMAL);
// 刷新窗口内容
::UpdateWindow(EWindow::getHWnd());
// 处理窗口消息
EWindow::__poll();
// 初始化计时
ETime::__init();
while (!s_bEndGame)
{
// 处理窗口消息
EWindow::__poll();
// 刷新时间
ETime::__updateNow();
// 判断是否达到了刷新状态
if (ETime::__isReady())
{
while (ETime::__isReady())
{
EInput::__updateDeviceState(); // 获取用户输入
ESceneManager::__update(); // 更新场景内容
ETime::__updateLast(); // 刷新时间信息
}
if (!s_bPaused)
{
ETimerManager::__update(); // 定时器管理器执行程序
EActionManager::__update(); // 动作管理器执行程序
}
ERenderer::__render(); // 渲染游戏画面
}
else
{
EObjectManager::__flush(); // 刷新内存池
ETime::__sleep(); // 挂起线程
}
}
return 0;
}
void e2d::EGame::pause()
{
s_bPaused = true;
}
void e2d::EGame::resume()
{
if (isPaused())
{
s_bPaused = false;
// 刷新当前时间
ETime::__updateLast();
// 重置动画和定时器
EActionManager::__resetAllActions();
ETimerManager::__resetAllTimers();
}
}
bool e2d::EGame::isPaused()
{
return s_bPaused;
}
void e2d::EGame::quit()
{
s_bEndGame = true; // 这个变量将控制游戏是否结束
}
void e2d::EGame::uninit()
{
// 删除所有场景
ESceneManager::__uninit();
// 关闭输入
EInput::__uninit();
// 关闭播放器
EMusicManager::__uninit();
// 恢复计时操作
ETime::__uninit();
// 清空图片缓存
EImage::clearCache();
// 刷新内存池
EObjectManager::__flush();
// 删除渲染相关资源
ERenderer::__discardResources();
// 销毁窗口
EWindow::__uninit();
CoUninitialize();
s_bInitialized = false;
}
e2d::EString e2d::EGame::getAppName()
{
return s_sAppName;
}