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-05-22 00:11:57 +08:00
|
|
|
|
#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)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-03 18:16:26 +08:00
|
|
|
|
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
|
|
|
|
|
2018-07-03 18:16:26 +08:00
|
|
|
|
void e2d::Game::destroyInstance()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_instance)
|
|
|
|
|
|
{
|
|
|
|
|
|
delete _instance;
|
|
|
|
|
|
_instance = nullptr;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-03 01:49:20 +08:00
|
|
|
|
bool e2d::Game::init(const String& mutexName)
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-14 00:57:16 +08:00
|
|
|
|
if (!mutexName.isEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD>
|
2018-05-24 14:33:16 +08:00
|
|
|
|
String fullMutexName = L"Easy2DApp-" + mutexName;
|
|
|
|
|
|
HANDLE hMutex = ::CreateMutex(nullptr, TRUE, (LPCWSTR)fullMutexName);
|
2018-05-14 00:57:16 +08:00
|
|
|
|
|
|
|
|
|
|
if (hMutex == nullptr)
|
|
|
|
|
|
{
|
2018-05-24 12:24:39 +08:00
|
|
|
|
WARN("CreateMutex Failed!");
|
2018-05-14 00:57:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
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>ʾ
|
2018-07-03 18:16:26 +08:00
|
|
|
|
Window::getInstance()->info(L"<EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>", L"<EFBFBD><EFBFBD>ʾ");
|
2018-05-14 00:57:16 +08:00
|
|
|
|
// <20>رս<D8B1><D5BD>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
::CloseHandle(hMutex);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-24 10:35:58 +08:00
|
|
|
|
// <20><>ʼ<EFBFBD><CABC> COM <20><><EFBFBD><EFBFBD>
|
2018-05-17 15:22:14 +08:00
|
|
|
|
CoInitialize(nullptr);
|
2018-04-24 10:35:58 +08:00
|
|
|
|
|
2018-07-03 18:16:26 +08:00
|
|
|
|
bool bInputInit = false,
|
2018-05-24 12:24:39 +08:00
|
|
|
|
bMusicInit = false;
|
|
|
|
|
|
|
|
|
|
|
|
auto DestroyResources = [&]()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (bInputInit) Input::__uninit();
|
|
|
|
|
|
if (bMusicInit) Music::__uninit();
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2018-04-24 10:35:58 +08:00
|
|
|
|
// <20><>ʼ<EFBFBD><CABC> DirectInput
|
2018-05-24 12:24:39 +08:00
|
|
|
|
if (Input::__init())
|
2018-04-24 10:35:58 +08:00
|
|
|
|
{
|
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-04-24 10:35:58 +08:00
|
|
|
|
}
|
2018-02-01 22:07:44 +08:00
|
|
|
|
|
2018-04-24 10:35:58 +08:00
|
|
|
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2018-05-24 12:24:39 +08:00
|
|
|
|
if (Music::__init())
|
2018-04-24 10:35:58 +08:00
|
|
|
|
{
|
2018-05-24 12:24:39 +08:00
|
|
|
|
bMusicInit = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
DestroyResources();
|
2018-07-03 01:49:20 +08:00
|
|
|
|
throw SystemException(L"<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> XAudio2 <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>");
|
2018-04-24 10:35:58 +08:00
|
|
|
|
}
|
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-04-24 10:35:58 +08:00
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-03 18:16:26 +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>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
SceneManager::__init();
|
2018-01-30 16:45:38 +08:00
|
|
|
|
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
2018-07-03 18:16:26 +08:00
|
|
|
|
::ShowWindow(window->getHWnd(), SW_SHOWNORMAL);
|
2018-01-30 16:45:38 +08:00
|
|
|
|
// ˢ<>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2018-07-03 18:16:26 +08:00
|
|
|
|
::UpdateWindow(window->getHWnd());
|
2018-01-30 16:45:38 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
2018-07-03 18:16:26 +08:00
|
|
|
|
window->__poll();
|
2018-02-04 21:24:27 +08:00
|
|
|
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ
|
2018-02-07 16:37:12 +08:00
|
|
|
|
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>Ϣ
|
2018-07-03 18:16:26 +08:00
|
|
|
|
window->__poll();
|
2018-02-04 21:24:27 +08:00
|
|
|
|
// ˢ<><CBA2>ʱ<EFBFBD><CAB1>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
Time::__updateNow();
|
2018-01-30 16:45:38 +08:00
|
|
|
|
|
|
|
|
|
|
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7>ﵽ<EFBFBD><EFB5BD>ˢ<EFBFBD><CBA2>״̬
|
2018-02-07 16:37:12 +08:00
|
|
|
|
if (Time::__isReady())
|
2018-01-30 16:45:38 +08:00
|
|
|
|
{
|
2018-05-31 01:22:41 +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>
|
2018-07-03 18:16:26 +08:00
|
|
|
|
renderer->__render(); // <20><>Ⱦ<EFBFBD><C8BE>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
|
2018-05-31 01:22:41 +08:00
|
|
|
|
|
|
|
|
|
|
Time::__updateLast(); // ˢ<><CBA2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ
|
2018-01-30 16:45:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2018-07-03 18:16:26 +08:00
|
|
|
|
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-04-21 00:46:26 +08:00
|
|
|
|
{
|
2018-07-03 01:49:20 +08:00
|
|
|
|
Game::cleanup();
|
2018-04-21 00:46:26 +08:00
|
|
|
|
}
|
2018-01-30 16:45:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +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
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +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
|
|
|
|
{
|
2018-05-10 18:18:02 +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
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-10 18:18:02 +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();
|
|
|
|
|
|
}
|
2018-05-10 18:18:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +08:00
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +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)
|
2018-05-22 11:58:45 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
2018-02-01 22:07:44 +08:00
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
SceneManager::__uninit();
|
2018-05-22 00:11:57 +08:00
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2018-05-22 00:36:03 +08:00
|
|
|
|
Input::__clearListeners();
|
2018-05-22 00:11:57 +08:00
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2018-05-22 00:36:03 +08:00
|
|
|
|
Collision::__clearListeners();
|
2018-05-10 00:58:43 +08:00
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2018-04-21 00:46:26 +08:00
|
|
|
|
ActionManager::__uninit();
|
2018-05-17 23:53:27 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
|
|
|
|
|
|
Player::__uninit();
|
2018-04-21 18:22:01 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
|
|
|
|
|
|
Image::clearCache();
|
2018-04-24 10:35:58 +08:00
|
|
|
|
// <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();
|
2018-04-21 00:46:26 +08:00
|
|
|
|
// <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
Input::__uninit();
|
2018-07-03 18:16:26 +08:00
|
|
|
|
// ɾ<><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
|
|
|
|
}
|