Magic_Game/core/Base/Game.cpp

194 lines
2.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"
#include "..\e2dcollider.h"
2018-01-30 16:45:38 +08:00
2018-07-03 01:49:20 +08:00
e2d::Game * e2d::Game::_instance = nullptr;
2018-01-30 16:45:38 +08:00
2018-07-03 01:49:20 +08:00
e2d::Game::Game()
: _ended(false)
, _paused(false)
, _initialized(false)
{
}
e2d::Game::~Game()
{
}
2018-07-03 01:49:20 +08:00
e2d::Game * e2d::Game::getInstance()
{
if (!_instance)
_instance = new (std::nothrow) Game;
return _instance;
}
2018-01-30 16:45:38 +08:00
void e2d::Game::destroyInstance()
{
if (_instance)
{
delete _instance;
_instance = nullptr;
}
}
bool e2d::Game::init()
2018-01-30 16:45:38 +08:00
{
2018-07-03 01:49:20 +08:00
if (_initialized)
2018-01-30 16:45:38 +08:00
{
2018-05-24 12:24:39 +08:00
WARN("The game has been initialized!");
2018-01-30 16:45:38 +08:00
return false;
}
// <20><>ʼ<EFBFBD><CABC> COM <20><><EFBFBD><EFBFBD>
CoInitialize(nullptr);
bool bInputInit = false;
2018-05-24 12:24:39 +08:00
auto DestroyResources = [&]()
{
if (bInputInit) Input::__uninit();
};
// <20><>ʼ<EFBFBD><CABC> DirectInput
2018-05-24 12:24:39 +08:00
if (Input::__init())
{
2018-05-24 12:24:39 +08:00
bInputInit = true;
}
else
{
DestroyResources();
2018-07-03 01:49:20 +08:00
throw SystemException(L"<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> DirectInput <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>");
}
2018-02-01 22:07:44 +08:00
2018-04-26 21:47:56 +08:00
// <20><>ʼ<EFBFBD><CABC>·<EFBFBD><C2B7>
2018-07-03 01:49:20 +08:00
if (!Path::__init())
2018-04-26 21:47:56 +08:00
{
2018-07-03 01:49:20 +08:00
DestroyResources();
throw SystemException(L"<EFBFBD><EFBFBD>Ҫϵͳ·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
2018-04-26 21:47:56 +08:00
}
// <20><>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
2018-07-03 01:49:20 +08:00
_initialized = true;
2018-07-03 01:49:20 +08:00
return _initialized;
2018-01-30 16:45:38 +08:00
}
2018-07-03 01:49:20 +08:00
void e2d::Game::start(bool cleanup)
2018-01-30 16:45:38 +08:00
{
2018-07-03 01:49:20 +08:00
if (!_initialized)
2018-01-30 16:45:38 +08:00
{
2018-05-24 12:24:39 +08:00
throw Exception(L"<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>Ϸǰδ<EFBFBD><EFBFBD><EFBFBD>г<EFBFBD>ʼ<EFBFBD><EFBFBD>");
2018-01-30 16:45:38 +08:00
}
auto window = Window::getInstance();
auto renderer = Renderer::getInstance();
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
2018-07-03 01:49:20 +08:00
_ended = false;
2018-05-24 00:58:16 +08:00
2018-07-03 01:49:20 +08:00
while (!_ended)
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
// ˢ<><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
{
Input::__update(); // <20><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
Timer::__update(); // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
ActionManager::__update(); // <20><><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SceneManager::__update(); // <20><><EFBFBD>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
renderer->__render(); // <20><>Ⱦ<EFBFBD><C8BE>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
Time::__updateLast(); // ˢ<><CBA2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ
2018-01-30 16:45:38 +08:00
}
else
{
Time::__sleep(); // <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
GC::getInstance()->__update(); // ˢ<><CBA2><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2018-01-30 16:45:38 +08:00
}
}
2018-07-03 01:49:20 +08:00
_ended = true;
2018-05-24 00:58:16 +08:00
2018-07-03 01:49:20 +08:00
if (cleanup)
{
2018-07-03 01:49:20 +08:00
Game::cleanup();
}
2018-01-30 16:45:38 +08:00
}
void e2d::Game::pause()
2018-01-30 16:45:38 +08:00
{
2018-07-03 01:49:20 +08:00
_paused = true;
2018-01-30 16:45:38 +08:00
}
void e2d::Game::resume()
2018-01-30 16:45:38 +08:00
{
2018-07-03 01:49:20 +08:00
if (_initialized && _paused)
2018-01-30 16:45:38 +08:00
{
Game::reset();
2018-01-30 16:45:38 +08:00
}
2018-07-03 01:49:20 +08:00
_paused = false;
2018-01-30 16:45:38 +08:00
}
void e2d::Game::reset()
{
2018-07-03 01:49:20 +08:00
if (_initialized && !_ended)
2018-05-24 00:58:16 +08:00
{
Time::__reset();
ActionManager::__resetAll();
Timer::__resetAll();
}
}
bool e2d::Game::isPaused()
2018-01-30 16:45:38 +08:00
{
2018-07-03 01:49:20 +08:00
return _paused;
2018-01-30 16:45:38 +08:00
}
void e2d::Game::quit()
2018-01-30 16:45:38 +08:00
{
2018-07-03 01:49:20 +08:00
_ended = true; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
2018-01-30 16:45:38 +08:00
}
2018-07-03 01:49:20 +08:00
void e2d::Game::cleanup()
2018-01-30 16:45:38 +08:00
{
2018-07-03 01:49:20 +08:00
if (!_initialized)
return;
2018-02-01 22:07:44 +08:00
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>
SceneManager::__uninit();
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Input::__clearListeners();
// ɾ<><C9BE><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Collision::__clearListeners();
2018-05-10 00:58:43 +08:00
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ActionManager::__uninit();
// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
Image::clearCache();
2018-04-24 09:02:06 +08:00
// <20><><EFBFBD>ն<EFBFBD>ʱ<EFBFBD><CAB1>
Timer::__uninit();
// <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
Input::__uninit();
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
GC::getInstance()->clear();
2018-01-30 16:45:38 +08:00
CoUninitialize();
2018-02-01 22:07:44 +08:00
2018-07-03 01:49:20 +08:00
_initialized = false;
2018-01-30 16:45:38 +08:00
}