Magic_Game/core/Base/Game.cpp

232 lines
3.9 KiB
C++
Raw Normal View History

2018-04-21 21:24:46 +08:00
#include "..\e2dbase.h"
#include "..\e2dmanager.h"
2018-04-24 09:02:06 +08:00
#include "..\e2dtool.h"
2018-01-30 16:45:38 +08:00
// <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;
// <20><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
static e2d::String s_sGameName;
2018-01-30 16:45:38 +08:00
bool e2d::Game::init(const String& name, const String& mutexName)
2018-01-30 16:45:38 +08:00
{
if (s_bInitialized)
{
WARN_IF(true, "The game has been initialized!");
return false;
}
if (!mutexName.isEmpty())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD>
HANDLE hMutex = ::CreateMutex(NULL, TRUE, L"Easy2DApp-" + mutexName);
if (hMutex == nullptr)
{
WARN_IF(true, "CreateMutex Failed!");
}
else if (::GetLastError() == ERROR_ALREADY_EXISTS)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
Window::info(L"<EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д򿪣<EFBFBD>", L"<EFBFBD><EFBFBD>ʾ");
// <20>رս<D8B1><D5BD>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD>
::CloseHandle(hMutex);
return false;
}
}
// <20><>ʼ<EFBFBD><CABC> COM <20><><EFBFBD><EFBFBD>
CoInitialize(NULL);
// <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!");
goto dev_ind_res_fail;
}
2018-02-01 22:07:44 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!Window::__init())
{
WARN_IF(true, "Window::__init Failed!");
goto window_fail;
}
2018-02-01 22:07:44 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
if (!Renderer::__createDeviceResources())
{
WARN_IF(true, "Renderer::__createDeviceResources Failed!");
goto dev_res_fail;
}
2018-02-01 22:07:44 +08:00
// <20><>ʼ<EFBFBD><CABC> DirectInput
if (!Input::__init())
{
WARN_IF(true, "Input::__init Failed!");
goto input_fail;
}
2018-02-01 22:07:44 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!Music::__init())
{
WARN_IF(true, "Music::__init Failed!");
2018-04-26 21:47:56 +08:00
Music::__uninit();
}
2018-02-01 22:07:44 +08:00
2018-04-26 21:47:56 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
s_sGameName = name;
2018-04-26 21:47:56 +08:00
// <20><>ʼ<EFBFBD><CABC>·<EFBFBD><C2B7>
if (!Path::__init())
{
WARN_IF(true, "Path::__init Failed!");
}
// <20><>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
s_bInitialized = true;
goto succeeded;
input_fail:
Input::__uninit();
dev_res_fail:
Renderer::__discardDeviceResources();
2018-02-01 22:07:44 +08:00
window_fail:
Window::__init();
dev_ind_res_fail:
Renderer::__discardResources();
succeeded:
2018-01-30 16:45:38 +08:00
return s_bInitialized;
}
int e2d::Game::start(bool autoRelease/* true */)
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
{
2018-04-24 09:02:06 +08:00
Timer::__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>
while (Time::__isReady())
2018-02-04 21:24:27 +08:00
{
Input::__update(); // <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
}
Renderer::__render(); // <20><>Ⱦ<EFBFBD><C8BE>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
2018-05-08 17:40:36 +08:00
ObjectManager::__update(); // ˢ<><CBA2><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2018-01-30 16:45:38 +08:00
}
else
{
Time::__sleep(); // <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
2018-01-30 16:45:38 +08:00
}
}
if (autoRelease)
{
Game::destroy();
}
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 (s_bInitialized && s_bPaused)
2018-01-30 16:45:38 +08:00
{
Game::reset();
2018-01-30 16:45:38 +08:00
}
2018-05-15 23:59:58 +08:00
s_bPaused = false;
2018-01-30 16:45:38 +08:00
}
void e2d::Game::reset()
{
// ˢ<>µ<EFBFBD>ǰʱ<C7B0><CAB1>
Time::__reset();
// <20><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>Ͷ<EFBFBD>ʱ<EFBFBD><CAB1>
ActionManager::__resetAll();
Timer::__resetAll();
}
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>
}
2018-04-19 17:18:44 +08:00
void e2d::Game::destroy()
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();
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
InputManager::__uninit();
ColliderManager::__uninit();
2018-05-10 00:58:43 +08:00
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ActionManager::__uninit();
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
ObjectManager::__clear();
// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
Image::clearCache();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
Music::__uninit();
2018-04-24 09:02:06 +08:00
// <20><><EFBFBD>ն<EFBFBD>ʱ<EFBFBD><CAB1>
Timer::__uninit();
// <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
Input::__uninit();
2018-01-30 16:45:38 +08:00
// <20>ָ<EFBFBD><D6B8><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
Time::__uninit();
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::getName()
2018-01-30 16:45:38 +08:00
{
2018-04-19 17:18:44 +08:00
return s_sGameName;
2018-01-30 16:45:38 +08:00
}