Magic_Game/core/Base/Game.cpp

121 lines
2.0 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 <thread>
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()
2018-07-24 12:49:32 +08:00
: _quit(true)
2018-07-03 01:49:20 +08:00
, _paused(false)
2018-07-24 12:49:32 +08:00
, _config()
2018-07-03 01:49:20 +08:00
{
2018-07-04 15:33:09 +08:00
CoInitialize(nullptr);
2018-07-03 01:49:20 +08:00
}
e2d::Game::~Game()
{
2018-07-04 15:33:09 +08:00
CoUninitialize();
}
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;
}
}
void e2d::Game::start()
2018-01-30 16:45:38 +08:00
{
2018-08-02 00:27:45 +08:00
_quit = false;
2018-08-02 00:27:45 +08:00
const int minInterval = 5;
Time last = Time::now();
2018-07-29 01:43:15 +08:00
HWND hWnd = Window::getInstance()->getHWnd();
2018-08-02 00:27:45 +08:00
::ShowWindow(hWnd, SW_SHOWNORMAL);
::UpdateWindow(hWnd);
2018-07-24 20:21:25 +08:00
Window::getInstance()->poll();
2018-08-02 00:27:45 +08:00
SceneManager::getInstance()->update();
2018-07-29 01:43:15 +08:00
2018-07-24 12:49:32 +08:00
while (!_quit)
2018-01-30 16:45:38 +08:00
{
2018-08-02 00:27:45 +08:00
auto now = Time::now();
auto dur = now - last;
2018-01-30 16:45:38 +08:00
2018-08-02 00:27:45 +08:00
if (dur.milliseconds() > minInterval)
2018-01-30 16:45:38 +08:00
{
2018-08-02 00:27:45 +08:00
last = now;
2018-07-29 01:43:15 +08:00
Input::getInstance()->update();
Timer::getInstance()->update();
ActionManager::getInstance()->update();
SceneManager::getInstance()->update();
Renderer::getInstance()->render();
Window::getInstance()->poll();
GC::getInstance()->flush();
2018-01-30 16:45:38 +08:00
}
else
{
// ID2D1HwndRenderTarget <20><><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD>ֱͬ<D6B1><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦʱ<C8BE><CAB1><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ʾ<EFBFBD><CABE>ˢ<EFBFBD>£<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷dz<CBB7><C7B3>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>Դ󲿷<D4B4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳̽<DFB3><CCBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// <20><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><E7B4B0><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD>ֹռ<D6B9>ù<EFBFBD><C3B9><EFBFBD> CPU <20><>
2018-08-02 00:27:45 +08:00
int wait = minInterval - dur.milliseconds();
if (wait > 1)
{
std::this_thread::sleep_for(std::chrono::milliseconds(wait));
}
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-24 12:49:32 +08:00
if (_paused && !_quit)
2018-05-24 00:58:16 +08:00
{
Timer::getInstance()->updateTime();
ActionManager::getInstance()->updateTime();
2018-05-24 00:58:16 +08:00
}
2018-07-05 16:44:47 +08:00
_paused = false;
}
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-07-24 12:49:32 +08:00
void e2d::Game::setConfig(const Config& config)
2018-07-04 17:00:21 +08:00
{
2018-07-24 20:21:25 +08:00
_config = config;
2018-07-04 17:00:21 +08:00
}
2018-07-24 12:49:32 +08:00
const e2d::Config& e2d::Game::getConfig()
2018-07-04 17:00:21 +08:00
{
return _config;
}
void e2d::Game::quit()
2018-01-30 16:45:38 +08:00
{
2018-07-24 12:49:32 +08:00
_quit = true;
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-22 21:22:27 +08:00
GC::getInstance()->clear();
Image::clearCache();
2018-01-30 16:45:38 +08:00
}