182 lines
3.1 KiB
C++
182 lines
3.1 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::String s_sAppName;
|
|
|
|
|
|
bool e2d::Game::init(const String & sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR pIconID, const String & sAppname)
|
|
{
|
|
if (s_bInitialized)
|
|
{
|
|
WARN_IF(true, "The game has been initialized!");
|
|
return false;
|
|
}
|
|
|
|
do
|
|
{
|
|
// 初始化 COM 组件
|
|
CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
|
|
|
// 设置 AppName
|
|
s_sAppName = sAppname;
|
|
|
|
// 创建设备无关资源
|
|
if (!Renderer::__createDeviceIndependentResources())
|
|
{
|
|
WARN_IF(true, "Renderer::__createDeviceIndependentResources Failed!");
|
|
break;
|
|
}
|
|
|
|
// 初始化窗口
|
|
if (!Window::__init(sTitle, nWidth, nHeight, pIconID))
|
|
{
|
|
WARN_IF(true, "Window::__init Failed!");
|
|
break;
|
|
}
|
|
|
|
// 创建设备相关资源
|
|
if (!Renderer::__createDeviceResources())
|
|
{
|
|
WARN_IF(true, "Renderer::__createDeviceResources Failed!");
|
|
break;
|
|
}
|
|
|
|
// 初始化 DirectInput
|
|
if (!Input::__init())
|
|
{
|
|
WARN_IF(true, "Input::__init Failed!");
|
|
break;
|
|
}
|
|
|
|
// 初始化播放器
|
|
if (!MusicManager::__init())
|
|
{
|
|
WARN_IF(true, "MusicManager::__init Failed!");
|
|
break;
|
|
}
|
|
|
|
// 重设 Client 大小
|
|
Window::setSize(nWidth, nHeight);
|
|
// 标志初始化成功
|
|
s_bInitialized = true;
|
|
|
|
} while (0);
|
|
|
|
return s_bInitialized;
|
|
}
|
|
|
|
int e2d::Game::run()
|
|
{
|
|
if (!s_bInitialized)
|
|
{
|
|
ASSERT(false, "You must initialize Game first!");
|
|
return -1;
|
|
}
|
|
|
|
// 初始化场景管理器
|
|
SceneManager::__init();
|
|
// 显示窗口
|
|
::ShowWindow(Window::getHWnd(), SW_SHOWNORMAL);
|
|
// 刷新窗口内容
|
|
::UpdateWindow(Window::getHWnd());
|
|
// 处理窗口消息
|
|
Window::__poll();
|
|
// 初始化计时
|
|
Time::__init();
|
|
|
|
while (!s_bEndGame)
|
|
{
|
|
// 处理窗口消息
|
|
Window::__poll();
|
|
// 刷新时间
|
|
Time::__updateNow();
|
|
|
|
// 判断是否达到了刷新状态
|
|
if (Time::__isReady())
|
|
{
|
|
while (Time::__isReady())
|
|
{
|
|
Input::__updateDeviceState(); // 获取用户输入
|
|
SceneManager::__update(); // 更新场景内容
|
|
Time::__updateLast(); // 刷新时间信息
|
|
}
|
|
|
|
TimerManager::__update(); // 定时器管理器执行程序
|
|
ActionManager::__update(); // 动作管理器执行程序
|
|
Renderer::__render(); // 渲染游戏画面
|
|
}
|
|
else
|
|
{
|
|
ObjectManager::__flush(); // 刷新内存池
|
|
Time::__sleep(); // 挂起线程
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void e2d::Game::pause()
|
|
{
|
|
s_bPaused = true;
|
|
}
|
|
|
|
void e2d::Game::resume()
|
|
{
|
|
if (isPaused())
|
|
{
|
|
s_bPaused = false;
|
|
// 刷新当前时间
|
|
Time::__updateLast();
|
|
// 重置动画和定时器
|
|
ActionManager::__resetAllActions();
|
|
TimerManager::__resetAllTimers();
|
|
}
|
|
}
|
|
|
|
bool e2d::Game::isPaused()
|
|
{
|
|
return s_bPaused;
|
|
}
|
|
|
|
void e2d::Game::quit()
|
|
{
|
|
s_bEndGame = true; // 这个变量将控制游戏是否结束
|
|
}
|
|
|
|
void e2d::Game::uninit()
|
|
{
|
|
// 删除所有场景
|
|
SceneManager::__uninit();
|
|
// 关闭输入
|
|
Input::__uninit();
|
|
// 关闭播放器
|
|
MusicManager::__uninit();
|
|
// 恢复计时操作
|
|
Time::__uninit();
|
|
// 清空图片缓存
|
|
Image::clearCache();
|
|
// 刷新内存池
|
|
ObjectManager::__flush();
|
|
// 删除渲染相关资源
|
|
Renderer::__discardResources();
|
|
// 销毁窗口
|
|
Window::__uninit();
|
|
|
|
CoUninitialize();
|
|
|
|
s_bInitialized = false;
|
|
}
|
|
|
|
e2d::String e2d::Game::getAppName()
|
|
{
|
|
return s_sAppName;
|
|
}
|