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-07-21 22:57:21 +08:00
# 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
}
2018-07-03 18:16:26 +08:00
e2d : : Game : : ~ Game ( )
{
2018-07-04 15:33:09 +08:00
CoUninitialize ( ) ;
2018-07-03 18:16:26 +08:00
}
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-21 22:57:21 +08:00
void e2d : : Game : : start ( )
2018-01-30 16:45:38 +08:00
{
2018-08-02 00:27:45 +08:00
_quit = false ;
2018-07-29 13:44:53 +08:00
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
2018-07-21 22:57:21 +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
{
2018-07-29 13:44:53 +08:00
// ID2D1HwndRenderTarget <20> <> <EFBFBD> <EFBFBD> Ⱦʱ<C8BE> <CAB1> <EFBFBD> ȴ<EFBFBD> <C8B4> <EFBFBD> ʾ <EFBFBD> <CABE> ˢ<EFBFBD> £<EFBFBD> <C2A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˴ <EFBFBD> ֱͬ<D6B1> <CDAC> <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 ( ) ;
2018-07-29 13:44:53 +08:00
if ( wait > 1 )
{
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( wait ) ) ;
}
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-24 12:49:32 +08:00
if ( _paused & & ! _quit )
2018-05-24 00:58:16 +08:00
{
2018-07-21 22:57:21 +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 ;
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-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
if ( _config . isSoundEnabled ( ) ! = config . isSoundEnabled ( ) )
{
if ( config . isSoundEnabled ( ) )
Player : : getInstance ( ) - > getXAudio2 ( ) - > StartEngine ( ) ;
else
Player : : getInstance ( ) - > getXAudio2 ( ) - > StopEngine ( ) ;
}
_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 ;
}
2018-02-07 16:37:12 +08:00
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 ( ) ;
2018-04-21 18:22:01 +08:00
Image : : clearCache ( ) ;
2018-07-05 22:05:23 +08:00
Player : : getInstance ( ) - > clearCache ( ) ;
2018-01-30 16:45:38 +08:00
}