#include "..\ebase.h" #include "..\emanager.h" // 控制游戏终止 static bool s_bEndGame = false; // 控制游戏暂停 static bool s_bPaused = false; // 是否进行过初始化 static bool s_bInitialized = false; // 游戏名称 static e2d::String s_sGameName; bool e2d::Game::init(String sGameName) { if (s_bInitialized) { WARN_IF(true, "The game has been initialized!"); return false; } do { // 初始化 COM 组件 CoInitializeEx(NULL, COINIT_MULTITHREADED); // 创建设备无关资源 if (!Renderer::__createDeviceIndependentResources()) { WARN_IF(true, "Renderer::__createDeviceIndependentResources Failed!"); break; } // 初始化窗口 if (!Window::__init()) { 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; } // 保存游戏名称 s_sGameName = sGameName; // 标志初始化成功 s_bInitialized = true; } while (0); return s_bInitialized; } int e2d::Game::start(bool bAutoRelease/* true */) { 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()) { TimerManager::__update(); // 定时器管理器执行程序 ActionManager::__update(); // 动作管理器执行程序 while (Time::__isReady()) { Input::__update(); // 获取用户输入 SceneManager::__update(); // 更新场景内容 Time::__updateLast(); // 刷新时间信息 } Renderer::__render(); // 渲染游戏画面 } else { ObjectManager::__update(); // 刷新内存池 Time::__sleep(); // 挂起线程 } } if (bAutoRelease) { Game::destroy(); } 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::destroy() { // 删除所有场景 SceneManager::__uninit(); // 关闭播放器 MusicManager::__uninit(); // 清空定时器 TimerManager::__uninit(); // 删除监听器 InputManager::__uninit(); ColliderManager::__uninit(); // 删除动画 ActionManager::__uninit(); // 关闭输入 Input::__uninit(); // 恢复计时操作 Time::__uninit(); // 清空图片缓存 Image::clearCache(); // 刷新内存池 ObjectManager::__clear(); // 删除渲染相关资源 Renderer::__discardResources(); // 销毁窗口 Window::__uninit(); CoUninitialize(); s_bInitialized = false; } bool e2d::Game::createMutex(String sMutexName, String sWindowTitle) { // 创建进程互斥体 HANDLE m_hMutex = ::CreateMutex(NULL, TRUE, L"Easy2DApp-" + sMutexName); if (m_hMutex == nullptr) { WARN_IF(true, "CreateMutex Failed!"); return true; } // 如果程序已经存在并且正在运行 if (::GetLastError() == ERROR_ALREADY_EXISTS) { // 关闭进程互斥体 ::CloseHandle(m_hMutex); // 打开指定窗口 if (!sWindowTitle.isEmpty()) { // 获取窗口句柄 HWND hProgramWnd = ::FindWindow(L"Easy2DApp", sWindowTitle); if (hProgramWnd) { // 获取窗口显示状态 WINDOWPLACEMENT wpm; ::GetWindowPlacement(hProgramWnd, &wpm); // 将运行的程序窗口还原成正常状态 wpm.showCmd = SW_SHOW; ::SetWindowPlacement(hProgramWnd, &wpm); ::SetWindowPos(hProgramWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); } } return false; } return true; } e2d::String e2d::Game::getName() { return s_sGameName; }