Magic_Game/core/Base/Game.cpp

182 lines
3.1 KiB
C++
Raw Normal View History

2018-01-30 16:45:38 +08:00
#include "..\ebase.h"
#include "..\emanagers.h"
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7>ֹ
static bool s_bEndGame = false;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7>ͣ
static bool s_bPaused = false;
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>ʼ<EFBFBD><CABC>
static bool s_bInitialized = false;
// AppName
static e2d::String s_sAppName;
2018-01-30 16:45:38 +08:00
2018-02-28 19:17:15 +08:00
bool e2d::Game::init(const String & sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR pIconID, const String & sAppname)
2018-01-30 16:45:38 +08:00
{
if (s_bInitialized)
{
WARN_IF(true, "The game has been initialized!");
return false;
}
2018-02-01 22:07:44 +08:00
do
2018-01-30 16:45:38 +08:00
{
2018-02-01 22:07:44 +08:00
// <20><>ʼ<EFBFBD><CABC> COM <20><><EFBFBD><EFBFBD>
2018-02-06 21:11:54 +08:00
CoInitializeEx(NULL, COINIT_MULTITHREADED);
2018-02-01 22:07:44 +08:00
2018-03-01 00:19:09 +08:00
// <20><><EFBFBD><EFBFBD> AppName
s_sAppName = sAppname;
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD><DEB9><EFBFBD>Դ
if (!Renderer::__createDeviceIndependentResources())
2018-01-30 16:45:38 +08:00
{
WARN_IF(true, "Renderer::__createDeviceIndependentResources Failed!");
2018-02-01 22:07:44 +08:00
break;
2018-01-30 16:45:38 +08:00
}
2018-02-01 22:07:44 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!Window::__init(sTitle, nWidth, nHeight, pIconID))
2018-02-01 22:07:44 +08:00
{
WARN_IF(true, "Window::__init Failed!");
2018-02-01 22:07:44 +08:00
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
if (!Renderer::__createDeviceResources())
2018-02-01 22:07:44 +08:00
{
WARN_IF(true, "Renderer::__createDeviceResources Failed!");
2018-02-01 22:07:44 +08:00
break;
}
// <20><>ʼ<EFBFBD><CABC> DirectInput
if (!Input::__init())
2018-02-01 22:07:44 +08:00
{
WARN_IF(true, "Input::__init Failed!");
2018-02-01 22:07:44 +08:00
break;
}
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!MusicManager::__init())
2018-02-01 22:07:44 +08:00
{
WARN_IF(true, "MusicManager::__init Failed!");
2018-02-01 22:07:44 +08:00
break;
}
// <20><><EFBFBD><EFBFBD> Client <20><>С
Window::setSize(nWidth, nHeight);
2018-02-01 22:07:44 +08:00
// <20><>־<EFBFBD><D6BE>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
s_bInitialized = true;
} while (0);
2018-01-30 16:45:38 +08:00
return s_bInitialized;
}
int e2d::Game::run()
2018-01-30 16:45:38 +08:00
{
if (!s_bInitialized)
{
ASSERT(false, "You must initialize Game first!");
2018-01-30 16:45:38 +08:00
return -1;
}
2018-02-01 22:07:44 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SceneManager::__init();
2018-01-30 16:45:38 +08:00
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
::ShowWindow(Window::getHWnd(), SW_SHOWNORMAL);
2018-01-30 16:45:38 +08:00
// ˢ<>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
::UpdateWindow(Window::getHWnd());
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
Window::__poll();
2018-02-04 21:24:27 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ
Time::__init();
2018-01-30 16:45:38 +08:00
while (!s_bEndGame)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
Window::__poll();
2018-02-04 21:24:27 +08:00
// ˢ<><CBA2>ʱ<EFBFBD><CAB1>
Time::__updateNow();
2018-01-30 16:45:38 +08:00
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFB5BD>ˢ<EFBFBD><CBA2>״̬
if (Time::__isReady())
2018-01-30 16:45:38 +08:00
{
while (Time::__isReady())
2018-02-04 21:24:27 +08:00
{
Input::__updateDeviceState(); // <20><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
SceneManager::__update(); // <20><><EFBFBD>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Time::__updateLast(); // ˢ<><CBA2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ
2018-02-04 21:24:27 +08:00
}
TimerManager::__update(); // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD>
ActionManager::__update(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD>
Renderer::__render(); // <20><>Ⱦ<EFBFBD><C8BE>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
2018-01-30 16:45:38 +08:00
}
else
{
ObjectManager::__flush(); // ˢ<><CBA2><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
Time::__sleep(); // <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
2018-01-30 16:45:38 +08:00
}
}
return 0;
}
void e2d::Game::pause()
2018-01-30 16:45:38 +08:00
{
s_bPaused = true;
}
void e2d::Game::resume()
2018-01-30 16:45:38 +08:00
{
if (isPaused())
{
s_bPaused = false;
// ˢ<>µ<EFBFBD>ǰʱ<C7B0><CAB1>
Time::__updateLast();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>Ͷ<EFBFBD>ʱ<EFBFBD><CAB1>
ActionManager::__resetAllActions();
TimerManager::__resetAllTimers();
2018-01-30 16:45:38 +08:00
}
}
bool e2d::Game::isPaused()
2018-01-30 16:45:38 +08:00
{
return s_bPaused;
}
void e2d::Game::quit()
2018-01-30 16:45:38 +08:00
{
s_bEndGame = true; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
}
void e2d::Game::uninit()
2018-01-30 16:45:38 +08:00
{
2018-02-01 22:07:44 +08:00
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>
SceneManager::__uninit();
2018-01-30 16:45:38 +08:00
// <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
Input::__uninit();
2018-02-01 22:07:44 +08:00
// <20>رղ<D8B1><D5B2><EFBFBD><EFBFBD><EFBFBD>
MusicManager::__uninit();
2018-01-30 16:45:38 +08:00
// <20>ָ<EFBFBD><D6B8><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
Time::__uninit();
2018-02-03 22:04:43 +08:00
// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
Image::clearCache();
2018-02-01 22:07:44 +08:00
// ˢ<><CBA2><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
ObjectManager::__flush();
2018-02-04 21:24:27 +08:00
// ɾ<><C9BE><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
Renderer::__discardResources();
2018-02-04 21:24:27 +08:00
// <20><><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>
Window::__uninit();
2018-01-30 16:45:38 +08:00
CoUninitialize();
2018-02-01 22:07:44 +08:00
s_bInitialized = false;
2018-01-30 16:45:38 +08:00
}
e2d::String e2d::Game::getAppName()
2018-01-30 16:45:38 +08:00
{
return s_sAppName;
}