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;
|
2018-04-13 00:39:27 +08:00
|
|
|
|
// <20><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
|
|
|
|
|
|
static e2d::String s_sGameName;
|
2018-01-30 16:45:38 +08:00
|
|
|
|
|
|
|
|
|
|
|
2018-05-07 15:48:06 +08:00
|
|
|
|
bool e2d::Game::init(const String& name)
|
2018-01-30 16:45:38 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (s_bInitialized)
|
|
|
|
|
|
{
|
|
|
|
|
|
WARN_IF(true, "The game has been initialized!");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-24 10:35:58 +08:00
|
|
|
|
// <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
|
|
|
|
{
|
2018-04-24 10:35:58 +08:00
|
|
|
|
WARN_IF(true, "Renderer::__createDeviceIndependentResources Failed!");
|
|
|
|
|
|
goto dev_ind_res_fail;
|
|
|
|
|
|
}
|
2018-02-01 22:07:44 +08:00
|
|
|
|
|
2018-04-24 10:35:58 +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
|
|
|
|
|
2018-04-24 10:35:58 +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
|
|
|
|
|
2018-04-24 10:35:58 +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
|
|
|
|
|
2018-04-24 10:35:58 +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-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><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
|
2018-05-07 15:48:06 +08:00
|
|
|
|
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>
|
2018-04-24 10:35:58 +08:00
|
|
|
|
s_bInitialized = true;
|
|
|
|
|
|
goto succeeded;
|
|
|
|
|
|
|
|
|
|
|
|
input_fail:
|
|
|
|
|
|
Input::__uninit();
|
|
|
|
|
|
|
|
|
|
|
|
dev_res_fail:
|
|
|
|
|
|
Renderer::__discardDeviceResources();
|
2018-02-01 22:07:44 +08:00
|
|
|
|
|
2018-04-24 10:35:58 +08:00
|
|
|
|
window_fail:
|
|
|
|
|
|
Window::__init();
|
|
|
|
|
|
|
|
|
|
|
|
dev_ind_res_fail:
|
|
|
|
|
|
Renderer::__discardResources();
|
|
|
|
|
|
|
|
|
|
|
|
succeeded:
|
2018-01-30 16:45:38 +08:00
|
|
|
|
return s_bInitialized;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-07 15:48:06 +08:00
|
|
|
|
int e2d::Game::start(bool autoRelease/* true */)
|
2018-01-30 16:45:38 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (!s_bInitialized)
|
|
|
|
|
|
{
|
2018-02-07 16:37:12 +08:00
|
|
|
|
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>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
SceneManager::__init();
|
2018-01-30 16:45:38 +08:00
|
|
|
|
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
::ShowWindow(Window::getHWnd(), SW_SHOWNORMAL);
|
2018-01-30 16:45:38 +08:00
|
|
|
|
// ˢ<>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
::UpdateWindow(Window::getHWnd());
|
2018-01-30 16:45:38 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
2018-02-07 16:37:12 +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
|
|
|
|
|
|
|
|
|
|
while (!s_bEndGame)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
2018-02-07 16:37:12 +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-04-24 09:02:06 +08:00
|
|
|
|
Timer::__update(); // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD>
|
2018-03-11 23:56:40 +08:00
|
|
|
|
ActionManager::__update(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
while (Time::__isReady())
|
2018-02-04 21:24:27 +08:00
|
|
|
|
{
|
2018-03-11 23:56:40 +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
|
|
|
|
}
|
2018-03-11 23:56:40 +08:00
|
|
|
|
Renderer::__render(); // <20><>Ⱦ<EFBFBD><C8BE>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
|
2018-01-30 16:45:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2018-03-11 23:56:40 +08:00
|
|
|
|
ObjectManager::__update(); // ˢ<><CBA2><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
|
|
|
|
|
|
Time::__sleep(); // <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
|
2018-01-30 16:45:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-07 15:48:06 +08:00
|
|
|
|
if (autoRelease)
|
2018-04-21 00:46:26 +08:00
|
|
|
|
{
|
|
|
|
|
|
Game::destroy();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-01-30 16:45:38 +08:00
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +08:00
|
|
|
|
void e2d::Game::pause()
|
2018-01-30 16:45:38 +08:00
|
|
|
|
{
|
|
|
|
|
|
s_bPaused = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +08:00
|
|
|
|
void e2d::Game::resume()
|
2018-01-30 16:45:38 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (isPaused())
|
|
|
|
|
|
{
|
|
|
|
|
|
s_bPaused = false;
|
|
|
|
|
|
// ˢ<>µ<EFBFBD>ǰʱ<C7B0><CAB1>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
Time::__updateLast();
|
2018-01-30 16:45:38 +08:00
|
|
|
|
// <20><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>Ͷ<EFBFBD>ʱ<EFBFBD><CAB1>
|
2018-04-24 09:02:06 +08:00
|
|
|
|
ActionManager::__resetAll();
|
|
|
|
|
|
Timer::__resetAll();
|
2018-01-30 16:45:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +08:00
|
|
|
|
bool e2d::Game::isPaused()
|
2018-01-30 16:45:38 +08:00
|
|
|
|
{
|
|
|
|
|
|
return s_bPaused;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +08:00
|
|
|
|
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>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
SceneManager::__uninit();
|
2018-04-21 00:46:26 +08:00
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
InputManager::__uninit();
|
|
|
|
|
|
ColliderManager::__uninit();
|
|
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
ActionManager::__uninit();
|
2018-04-21 18:22:01 +08:00
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
|
|
|
|
|
ObjectManager::__clear();
|
|
|
|
|
|
// <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-01-30 16:45:38 +08:00
|
|
|
|
// <20>ָ<EFBFBD><D6B8><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
Time::__uninit();
|
2018-02-04 21:24:27 +08:00
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
|
2018-02-07 16:37:12 +08:00
|
|
|
|
Renderer::__discardResources();
|
2018-02-04 21:24:27 +08:00
|
|
|
|
// <20><><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>
|
2018-02-07 16:37:12 +08:00
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-07 15:48:06 +08:00
|
|
|
|
bool e2d::Game::createMutex(const String& sMutexName, const String& sWindowTitle)
|
2018-04-13 00:39:27 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
HANDLE m_hMutex = ::CreateMutex(NULL, TRUE, L"Easy2DApp-" + sMutexName);
|
|
|
|
|
|
|
|
|
|
|
|
if (m_hMutex == nullptr)
|
|
|
|
|
|
{
|
|
|
|
|
|
WARN_IF(true, "CreateMutex Failed!");
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (::GetLastError() == ERROR_ALREADY_EXISTS)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>رս<D8B1><D5BD>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
::CloseHandle(m_hMutex);
|
2018-04-17 01:11:56 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (!sWindowTitle.isEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
|
|
|
|
|
|
HWND hProgramWnd = ::FindWindow(L"Easy2DApp", sWindowTitle);
|
|
|
|
|
|
if (hProgramWnd)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ״̬
|
|
|
|
|
|
WINDOWPLACEMENT wpm;
|
|
|
|
|
|
::GetWindowPlacement(hProgramWnd, &wpm);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>еij<D0B5><C4B3>ڻ<F2B4B0BF>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
wpm.showCmd = SW_SHOW;
|
|
|
|
|
|
::SetWindowPlacement(hProgramWnd, &wpm);
|
|
|
|
|
|
::SetWindowPos(hProgramWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2018-04-13 00:39:27 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|