增加Time时间点和Duration时间段
This commit is contained in:
		
							parent
							
								
									e16249b1a4
								
							
						
					
					
						commit
						7d17c3b225
					
				|  | @ -24,7 +24,7 @@ bool e2d::Action::isRunning() | ||||||
| void e2d::Action::resume() | void e2d::Action::resume() | ||||||
| { | { | ||||||
| 	_running = true; | 	_running = true; | ||||||
| 	_last = Time::getTotalTime(); | 	_last = Game::getInstance()->getTotalTime(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Action::pause() | void e2d::Action::pause() | ||||||
|  | @ -56,7 +56,7 @@ void e2d::Action::reset() | ||||||
| { | { | ||||||
| 	_initialized = false; | 	_initialized = false; | ||||||
| 	_done = false; | 	_done = false; | ||||||
| 	_last = Time::getTotalTime(); | 	_last = Game::getInstance()->getTotalTime(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::Action::_isDone() | bool e2d::Action::_isDone() | ||||||
|  | @ -74,7 +74,7 @@ void e2d::Action::_startWithTarget(Node* target) | ||||||
| void e2d::Action::_init() | void e2d::Action::_init() | ||||||
| { | { | ||||||
| 	_initialized = true; | 	_initialized = true; | ||||||
| 	_last = Time::getTotalTime(); | 	_last = Game::getInstance()->getTotalTime(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Action::_update() | void e2d::Action::_update() | ||||||
|  |  | ||||||
|  | @ -56,7 +56,7 @@ void e2d::Animate::_update() | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	while ((Time::getTotalTime() - _last) >= _animation->getInterval()) | 	while ((Game::getInstance()->getTotalTime() - _last) >= _animation->getInterval()) | ||||||
| 	{ | 	{ | ||||||
| 		auto& frames = _animation->getFrames(); | 		auto& frames = _animation->getFrames(); | ||||||
| 		auto target = dynamic_cast<Sprite*>(_target); | 		auto target = dynamic_cast<Sprite*>(_target); | ||||||
|  | @ -80,7 +80,7 @@ void e2d::Animate::_update() | ||||||
| void e2d::Animate::_resetTime() | void e2d::Animate::_resetTime() | ||||||
| { | { | ||||||
| 	Action::_resetTime(); | 	Action::_resetTime(); | ||||||
| 	_last = Time::getTotalTime(); | 	_last = Game::getInstance()->getTotalTime(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Animate::reset() | void e2d::Animate::reset() | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ void e2d::Delay::_update() | ||||||
| { | { | ||||||
| 	Action::_update(); | 	Action::_update(); | ||||||
| 
 | 
 | ||||||
| 	_delta = Time::getTotalTime() - _last; | 	_delta = Game::getInstance()->getTotalTime() - _last; | ||||||
| 
 | 
 | ||||||
| 	if (_delta >= _delay) | 	if (_delta >= _delay) | ||||||
| 	{ | 	{ | ||||||
|  | @ -42,5 +42,5 @@ void e2d::Delay::_update() | ||||||
| void e2d::Delay::_resetTime() | void e2d::Delay::_resetTime() | ||||||
| { | { | ||||||
| 	Action::_resetTime(); | 	Action::_resetTime(); | ||||||
| 	_last = Time::getTotalTime() - _delta; | 	_last = Game::getInstance()->getTotalTime() - _delta; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ void e2d::FiniteTimeAction::_update() | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		_delta = std::min((Time::getTotalTime() - _last) / _duration, 1.0); | 		_delta = std::min((Game::getInstance()->getTotalTime() - _last) / _duration, 1.0); | ||||||
| 
 | 
 | ||||||
| 		if (_delta >= 1) | 		if (_delta >= 1) | ||||||
| 		{ | 		{ | ||||||
|  | @ -40,5 +40,5 @@ void e2d::FiniteTimeAction::_update() | ||||||
| void e2d::FiniteTimeAction::_resetTime() | void e2d::FiniteTimeAction::_resetTime() | ||||||
| { | { | ||||||
| 	Action::_resetTime(); | 	Action::_resetTime(); | ||||||
| 	_last = Time::getTotalTime() - _delta * _duration; | 	_last = Game::getInstance()->getTotalTime() - _delta * _duration; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -49,6 +49,10 @@ e2d::GC::GC() | ||||||
| 
 | 
 | ||||||
| e2d::GC::~GC() | e2d::GC::~GC() | ||||||
| { | { | ||||||
|  | 	// 删除所有对象
 | ||||||
|  | 	GC::clear(); | ||||||
|  | 	// 清除图片缓存
 | ||||||
|  | 	Image::clearCache(); | ||||||
| 	// 删除所有单例
 | 	// 删除所有单例
 | ||||||
| 	Game::destroyInstance(); | 	Game::destroyInstance(); | ||||||
| 	Renderer::destroyInstance(); | 	Renderer::destroyInstance(); | ||||||
|  | @ -92,6 +96,11 @@ void e2d::GC::flush() | ||||||
| void e2d::GC::clear() | void e2d::GC::clear() | ||||||
| { | { | ||||||
| 	_instance._cleanup = true; | 	_instance._cleanup = true; | ||||||
|  | 
 | ||||||
|  | 	SceneManager::getInstance()->clear(); | ||||||
|  | 	Timer::getInstance()->clearAllTasks(); | ||||||
|  | 	ActionManager::getInstance()->clearAll(); | ||||||
|  | 
 | ||||||
| 	for (auto pair : _instance._pool) | 	for (auto pair : _instance._pool) | ||||||
| 	{ | 	{ | ||||||
| 		if (pair.second) | 		if (pair.second) | ||||||
|  |  | ||||||
|  | @ -1,6 +1,9 @@ | ||||||
| #include "..\e2dbase.h" | #include "..\e2dbase.h" | ||||||
| #include "..\e2dmanager.h" | #include "..\e2dmanager.h" | ||||||
| #include "..\e2dtool.h" | #include "..\e2dtool.h" | ||||||
|  | #include <thread> | ||||||
|  | 
 | ||||||
|  | using namespace std::chrono; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| e2d::Game * e2d::Game::_instance = nullptr; | e2d::Game * e2d::Game::_instance = nullptr; | ||||||
|  | @ -11,6 +14,8 @@ e2d::Game::Game() | ||||||
| 	, _config(nullptr) | 	, _config(nullptr) | ||||||
| { | { | ||||||
| 	CoInitialize(nullptr); | 	CoInitialize(nullptr); | ||||||
|  | 
 | ||||||
|  | 	_start = _last = _now = steady_clock::now(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Game::~Game() | e2d::Game::~Game() | ||||||
|  | @ -36,7 +41,7 @@ void e2d::Game::destroyInstance() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Game::start(bool cleanup) | void e2d::Game::start() | ||||||
| { | { | ||||||
| 	auto input = Input::getInstance(); | 	auto input = Input::getInstance(); | ||||||
| 	auto window = Window::getInstance(); | 	auto window = Window::getInstance(); | ||||||
|  | @ -45,51 +50,56 @@ void e2d::Game::start(bool cleanup) | ||||||
| 	auto sceneManager = SceneManager::getInstance(); | 	auto sceneManager = SceneManager::getInstance(); | ||||||
| 	auto actionManager = ActionManager::getInstance(); | 	auto actionManager = ActionManager::getInstance(); | ||||||
| 
 | 
 | ||||||
| 	// 显示窗口
 | 	if (!input || !window || !renderer || !timer || !sceneManager || !actionManager) | ||||||
| 	::ShowWindow(window->getHWnd(), SW_SHOWNORMAL); | 	{ | ||||||
| 	// 刷新窗口内容
 | 		throw SystemException(L"初始化失败"); | ||||||
| 	::UpdateWindow(window->getHWnd()); | 	} | ||||||
| 	// 处理窗口消息
 |  | ||||||
| 	window->poll(); |  | ||||||
| 	// 初始化计时
 |  | ||||||
| 	Time::__init(); |  | ||||||
| 
 | 
 | ||||||
|  | 	HWND hWnd = window->getHWnd(); | ||||||
|  | 	if (hWnd == nullptr) | ||||||
|  | 	{ | ||||||
|  | 		throw SystemException(L"无法创建窗口"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 显示窗口
 | ||||||
|  | 	::ShowWindow(hWnd, SW_SHOWNORMAL); | ||||||
|  | 	::UpdateWindow(hWnd); | ||||||
|  | 	window->poll(); | ||||||
|  | 
 | ||||||
|  | 	// 开始游戏
 | ||||||
|  | 	const milliseconds frameInterval(15LL); | ||||||
|  | 	milliseconds wait, interval; | ||||||
|  | 	 | ||||||
| 	_ended = false; | 	_ended = false; | ||||||
|  | 	_last = _now = steady_clock::now(); | ||||||
| 
 | 
 | ||||||
| 	while (!_ended) | 	while (!_ended) | ||||||
| 	{ | 	{ | ||||||
| 		// 处理窗口消息
 | 		_now = steady_clock::now(); | ||||||
| 		window->poll(); | 		interval = duration_cast<milliseconds>(_now - _last); | ||||||
| 		// 刷新时间
 |  | ||||||
| 		Time::__updateNow(); |  | ||||||
| 
 | 
 | ||||||
| 		// 判断是否达到了刷新状态
 | 		if (frameInterval < interval) | ||||||
| 		if (Time::__isReady()) |  | ||||||
| 		{ | 		{ | ||||||
| 			if (_config->_unconfigured) | 			_last = _now; | ||||||
| 			{ |  | ||||||
| 				_config->_update(); |  | ||||||
| 			} |  | ||||||
| 
 | 
 | ||||||
| 			input->update();			// 获取用户输入
 | 			input->update();			// 获取用户输入
 | ||||||
| 			timer->update();			// 更新定时器
 | 			timer->update();			// 更新定时器
 | ||||||
| 			actionManager->update();	// 更新动作管理器
 | 			actionManager->update();	// 更新动作管理器
 | ||||||
| 			sceneManager->update();		// 更新场景内容
 | 			sceneManager->update();		// 更新场景内容
 | ||||||
|  | 			_config->_update();			// 更新游戏配置
 | ||||||
| 			renderer->render();			// 渲染游戏画面
 | 			renderer->render();			// 渲染游戏画面
 | ||||||
|  | 			window->poll();				// 处理窗口消息
 | ||||||
| 			GC::flush();				// 刷新内存池
 | 			GC::flush();				// 刷新内存池
 | ||||||
| 
 |  | ||||||
| 			Time::__updateLast();		// 刷新时间信息
 |  | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
| 			Time::__sleep();			// 挂起线程
 | 			wait = frameInterval - interval; | ||||||
|  | 			if (wait.count() > 1LL) | ||||||
|  | 			{ | ||||||
|  | 				std::this_thread::sleep_for(wait - milliseconds(1LL)); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	if (cleanup) |  | ||||||
| 	{ |  | ||||||
| 		Game::cleanup(); |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Game::pause() | void e2d::Game::pause() | ||||||
|  | @ -101,7 +111,9 @@ void e2d::Game::resume() | ||||||
| { | { | ||||||
| 	if (_paused && !_ended) | 	if (_paused && !_ended) | ||||||
| 	{ | 	{ | ||||||
| 		Time::__reset(); | 		_last = _now = steady_clock::now(); | ||||||
|  | 		Timer::getInstance()->updateTime(); | ||||||
|  | 		ActionManager::getInstance()->updateTime(); | ||||||
| 	} | 	} | ||||||
| 	_paused = false; | 	_paused = false; | ||||||
| } | } | ||||||
|  | @ -129,6 +141,11 @@ e2d::Config* e2d::Game::getConfig() | ||||||
| 	return _config; | 	return _config; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | double e2d::Game::getTotalTime() const | ||||||
|  | { | ||||||
|  | 	return duration_cast<microseconds>(steady_clock::now() - _start).count() / 1000.0 / 1000.0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void e2d::Game::quit() | void e2d::Game::quit() | ||||||
| { | { | ||||||
| 	_ended = true;	// 这个变量将控制游戏是否结束
 | 	_ended = true;	// 这个变量将控制游戏是否结束
 | ||||||
|  | @ -136,16 +153,7 @@ void e2d::Game::quit() | ||||||
| 
 | 
 | ||||||
| void e2d::Game::cleanup() | void e2d::Game::cleanup() | ||||||
| { | { | ||||||
| 	// 删除所有场景
 |  | ||||||
| 	SceneManager::getInstance()->clear(); |  | ||||||
| 	// 清空定时器
 |  | ||||||
| 	Timer::getInstance()->clearAllTasks(); |  | ||||||
| 	// 清除所有动作
 |  | ||||||
| 	ActionManager::getInstance()->clearAll(); |  | ||||||
| 	// 清空图片缓存
 |  | ||||||
| 	Image::clearCache(); |  | ||||||
| 	// 清空音乐缓存
 |  | ||||||
| 	Player::getInstance()->clearCache(); |  | ||||||
| 	// 删除所有对象
 |  | ||||||
| 	GC::clear(); | 	GC::clear(); | ||||||
|  | 	Image::clearCache(); | ||||||
|  | 	Player::getInstance()->clearCache(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -161,11 +161,11 @@ void e2d::Renderer::_renderFps() | ||||||
| { | { | ||||||
| 	++_renderTimes; | 	++_renderTimes; | ||||||
| 
 | 
 | ||||||
| 	double fDelay = Time::getTotalTime() - _lastRenderTime; | 	double fDelay = Game::getInstance()->getTotalTime() - _lastRenderTime; | ||||||
| 	if (fDelay >= 0.1) | 	if (fDelay >= 0.1) | ||||||
| 	{ | 	{ | ||||||
| 		_fpsText = String::format(L"FPS: %.1lf", (1 / fDelay) * _renderTimes); | 		_fpsText = String::format(L"FPS: %.1lf", (1 / fDelay) * _renderTimes); | ||||||
| 		_lastRenderTime = Time::getTotalTime(); | 		_lastRenderTime = Game::getInstance()->getTotalTime(); | ||||||
| 		_renderTimes = 0; | 		_renderTimes = 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,73 +0,0 @@ | ||||||
| #include "..\e2dbase.h" |  | ||||||
| #include "..\e2dtool.h" |  | ||||||
| #include "..\e2dmanager.h" |  | ||||||
| #include <thread> |  | ||||||
| 
 |  | ||||||
| using namespace std::chrono; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 游戏开始时间
 |  | ||||||
| steady_clock::time_point e2d::Time::_start; |  | ||||||
| // 当前时间
 |  | ||||||
| steady_clock::time_point e2d::Time::_now; |  | ||||||
| // 上一帧刷新时间
 |  | ||||||
| steady_clock::time_point e2d::Time::_last; |  | ||||||
| // 固定的刷新时间
 |  | ||||||
| steady_clock::time_point e2d::Time::_fixedLast; |  | ||||||
| // 每一帧间隔
 |  | ||||||
| milliseconds e2d::Time::_interval; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| double e2d::Time::getTotalTime() |  | ||||||
| { |  | ||||||
| 	return duration_cast<microseconds>(_now - _start).count() / 1000.0 / 1000.0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| double e2d::Time::getDeltaTime() |  | ||||||
| { |  | ||||||
| 	return duration_cast<microseconds>(_now - _last).count() / 1000.0 / 1000.0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::Time::__init() |  | ||||||
| { |  | ||||||
| 	_start = _fixedLast = _last = _now = steady_clock::now(); |  | ||||||
| 	_interval = milliseconds(15); |  | ||||||
| 	return true; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::Time::__isReady() |  | ||||||
| { |  | ||||||
| 	return _interval < duration_cast<milliseconds>(_now - _fixedLast); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::Time::__updateNow() |  | ||||||
| { |  | ||||||
| 	_now = steady_clock::now(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::Time::__updateLast() |  | ||||||
| { |  | ||||||
| 	_fixedLast += _interval; |  | ||||||
| 
 |  | ||||||
| 	_last = _now; |  | ||||||
| 	_now = steady_clock::now(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::Time::__reset() |  | ||||||
| { |  | ||||||
| 	_last = _fixedLast = _now = steady_clock::now(); |  | ||||||
| 	Timer::getInstance()->updateTime(); |  | ||||||
| 	ActionManager::getInstance()->updateTime(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::Time::__sleep() |  | ||||||
| { |  | ||||||
| 	// 计算挂起时长
 |  | ||||||
| 	int nWaitMS = 16 - static_cast<int>(duration_cast<milliseconds>(_now - _fixedLast).count()); |  | ||||||
| 	 |  | ||||||
| 	if (nWaitMS > 1) |  | ||||||
| 	{ |  | ||||||
| 		// 挂起线程,释放 CPU 占用
 |  | ||||||
| 		std::this_thread::sleep_for(milliseconds(nWaitMS)); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -107,6 +107,9 @@ bool e2d::Config::isColliderVisible() const | ||||||
| 
 | 
 | ||||||
| void e2d::Config::_update() | void e2d::Config::_update() | ||||||
| { | { | ||||||
|  | 	if (!_unconfigured) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
| 	_unconfigured = false; | 	_unconfigured = false; | ||||||
| 
 | 
 | ||||||
| 	if (_soundEnabled) | 	if (_soundEnabled) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | #include "..\e2dcommon.h" | ||||||
|  | 
 | ||||||
|  | using namespace std::chrono; | ||||||
|  | 
 | ||||||
|  | e2d::Duration::Duration() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::Duration e2d::Duration::operator+(Duration const & size) const | ||||||
|  | { | ||||||
|  | 	return Duration(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::Duration e2d::Duration::operator-(Duration const & size) const | ||||||
|  | { | ||||||
|  | 	return Duration(); | ||||||
|  | } | ||||||
|  | @ -296,9 +296,12 @@ bool e2d::Image::preload(const Resource& res) | ||||||
| 
 | 
 | ||||||
| void e2d::Image::clearCache() | void e2d::Image::clearCache() | ||||||
| { | { | ||||||
|  | 	if (_bitmapCache.empty()) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
| 	for (auto bitmap : _bitmapCache) | 	for (auto bitmap : _bitmapCache) | ||||||
| 	{ | 	{ | ||||||
| 		SafeRelease(bitmap.second); | 		bitmap.second->Release(); | ||||||
| 	} | 	} | ||||||
| 	_bitmapCache.clear(); | 	_bitmapCache.clear(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,18 @@ | ||||||
|  | #include "..\e2dcommon.h" | ||||||
|  | 
 | ||||||
|  | using namespace std::chrono; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | e2d::Time::Time() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::Time e2d::Time::operator+(Duration const & size) const | ||||||
|  | { | ||||||
|  | 	return Time(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::Duration e2d::Time::operator-(Time const & size) const | ||||||
|  | { | ||||||
|  | 	return Duration(); | ||||||
|  | } | ||||||
|  | @ -213,12 +213,16 @@ void e2d::ActionManager::clearAllBindedWith(Node * target) | ||||||
| 
 | 
 | ||||||
| void e2d::ActionManager::clearAll() | void e2d::ActionManager::clearAll() | ||||||
| { | { | ||||||
| 	for (auto action : _runningActions) | 	if (!_runningActions.empty()) | ||||||
| 	{ | 	{ | ||||||
| 		GC::release(action); | 		for (auto action : _runningActions) | ||||||
|  | 		{ | ||||||
|  | 			GC::release(action); | ||||||
|  | 		} | ||||||
|  | 		_runningActions.clear(); | ||||||
| 	} | 	} | ||||||
|  | 	 | ||||||
| 	_actions.clear(); | 	_actions.clear(); | ||||||
| 	_runningActions.clear(); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::vector<e2d::Action*> e2d::ActionManager::get(const String& name) | std::vector<e2d::Action*> e2d::ActionManager::get(const String& name) | ||||||
|  |  | ||||||
|  | @ -85,20 +85,19 @@ void e2d::SceneManager::pop(Transition * transition /* = nullptr */) | ||||||
| 	// 设置切换场景动作
 | 	// 设置切换场景动作
 | ||||||
| 	if (transition) | 	if (transition) | ||||||
| 	{ | 	{ | ||||||
| 		_transition = transition; |  | ||||||
| 		GC::retain(transition); | 		GC::retain(transition); | ||||||
| 		transition->_init(_currScene, _nextScene); | 		transition->_init(_currScene, _nextScene); | ||||||
| 		transition->_update(); | 		transition->_update(); | ||||||
|  | 		_transition = transition; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::SceneManager::clear() | void e2d::SceneManager::clear() | ||||||
| { | { | ||||||
| 	// 清空场景栈
 | 	// 清空场景栈
 | ||||||
| 	while (_scenes.size()) | 	while (!_scenes.empty()) | ||||||
| 	{ | 	{ | ||||||
| 		auto temp = _scenes.top(); | 		_scenes.top()->release(); | ||||||
| 		GC::safeRelease(temp); |  | ||||||
| 		_scenes.pop(); | 		_scenes.pop(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -13,9 +13,13 @@ e2d::Player::Player() | ||||||
| 
 | 
 | ||||||
| e2d::Player::~Player() | e2d::Player::~Player() | ||||||
| { | { | ||||||
| 	for (auto pair : _musicList) | 	if (!_musicList.empty()) | ||||||
| 		GC::release(pair.second); | 	{ | ||||||
| 	_musicList.clear(); | 		for (auto pair : _musicList) | ||||||
|  | 		{ | ||||||
|  | 			delete pair.second; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if (_masteringVoice) | 	if (_masteringVoice) | ||||||
| 		_masteringVoice->DestroyVoice(); | 		_masteringVoice->DestroyVoice(); | ||||||
|  | @ -31,9 +35,8 @@ e2d::Player * e2d::Player::getInstance() | ||||||
| 	{ | 	{ | ||||||
| 		_instance = new (std::nothrow) Player; | 		_instance = new (std::nothrow) Player; | ||||||
| 
 | 
 | ||||||
| 		HRESULT hr; | 		if (FAILED(XAudio2Create(&_instance->_xAudio2, 0)) || | ||||||
| 		if (FAILED(hr = XAudio2Create(&_instance->_xAudio2, 0)) || | 			FAILED(_instance->_xAudio2->CreateMasteringVoice(&_instance->_masteringVoice))) | ||||||
| 			FAILED(hr = _instance->_xAudio2->CreateMasteringVoice(&_instance->_masteringVoice))) |  | ||||||
| 		{ | 		{ | ||||||
| 			throw SystemException(L"³õʼ»¯ XAudio2 ×é¼þʧ°Ü"); | 			throw SystemException(L"³õʼ»¯ XAudio2 ×é¼þʧ°Ü"); | ||||||
| 		} | 		} | ||||||
|  | @ -68,11 +71,10 @@ bool e2d::Player::preload(const Resource& res) | ||||||
| 	if (_musicList.end() != _musicList.find(res)) | 	if (_musicList.end() != _musicList.find(res)) | ||||||
| 		return true; | 		return true; | ||||||
| 
 | 
 | ||||||
| 	Music * music = new (e2d::autorelease) Music(); | 	Music * music = new Music(); | ||||||
| 
 | 
 | ||||||
| 	if (music->open(res)) | 	if (music->open(res)) | ||||||
| 	{ | 	{ | ||||||
| 		GC::retain(music); |  | ||||||
| 		music->setVolume(_volume); | 		music->setVolume(_volume); | ||||||
| 		_musicList.insert(std::make_pair(res, music)); | 		_musicList.insert(std::make_pair(res, music)); | ||||||
| 		return true; | 		return true; | ||||||
|  | @ -139,10 +141,6 @@ void e2d::Player::stop(const String& filePath) | ||||||
| 
 | 
 | ||||||
| void e2d::Player::stop(const Resource& res) | void e2d::Player::stop(const Resource& res) | ||||||
| { | { | ||||||
| 	if (res.isResource()) |  | ||||||
| 	{ |  | ||||||
| 
 |  | ||||||
| 	} |  | ||||||
| 	if (_musicList.end() != _musicList.find(res)) | 	if (_musicList.end() != _musicList.find(res)) | ||||||
| 		_musicList[res]->stop(); | 		_musicList[res]->stop(); | ||||||
| } | } | ||||||
|  | @ -204,7 +202,7 @@ void e2d::Player::clearCache() | ||||||
| { | { | ||||||
| 	for (auto pair : _musicList) | 	for (auto pair : _musicList) | ||||||
| 	{ | 	{ | ||||||
| 		GC::release(pair.second); | 		delete pair.second; | ||||||
| 	} | 	} | ||||||
| 	_musicList.clear(); | 	_musicList.clear(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -60,7 +60,7 @@ bool e2d::Task::isReady() const | ||||||
| 		{ | 		{ | ||||||
| 			return true; | 			return true; | ||||||
| 		} | 		} | ||||||
| 		if ((Time::getTotalTime() - _lastTime) >= _delay) | 		if ((Game::getInstance()->getTotalTime() - _lastTime) >= _delay) | ||||||
| 		{ | 		{ | ||||||
| 			return true; | 			return true; | ||||||
| 		} | 		} | ||||||
|  | @ -80,5 +80,5 @@ e2d::String e2d::Task::getName() const | ||||||
| 
 | 
 | ||||||
| void e2d::Task::updateTime() | void e2d::Task::updateTime() | ||||||
| { | { | ||||||
| 	_lastTime = Time::getTotalTime(); | 	_lastTime = Game::getInstance()->getTotalTime(); | ||||||
| } | } | ||||||
|  | @ -100,6 +100,9 @@ void e2d::Timer::removeAllTasks() | ||||||
| 
 | 
 | ||||||
| void e2d::Timer::clearAllTasks() | void e2d::Timer::clearAllTasks() | ||||||
| { | { | ||||||
|  | 	if (_tasks.empty()) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
| 	for (auto task : _tasks) | 	for (auto task : _tasks) | ||||||
| 	{ | 	{ | ||||||
| 		GC::release(task); | 		GC::release(task); | ||||||
|  |  | ||||||
|  | @ -45,7 +45,7 @@ void e2d::Transition::_init(Scene * prev, Scene * next) | ||||||
| 		throw SystemException(L"场景过渡动画图层创建失败"); | 		throw SystemException(L"场景过渡动画图层创建失败"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	_last = Time::getTotalTime(); | 	_last = Game::getInstance()->getTotalTime(); | ||||||
| 	_outScene = prev; | 	_outScene = prev; | ||||||
| 	_inScene = next; | 	_inScene = next; | ||||||
| 	GC::retain(_outScene); | 	GC::retain(_outScene); | ||||||
|  | @ -64,7 +64,7 @@ void e2d::Transition::_update() | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		_delta = std::min((Time::getTotalTime() - _last) / _duration, 1.0); | 		_delta = std::min((Game::getInstance()->getTotalTime() - _last) / _duration, 1.0); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	this->_updateCustom(); | 	this->_updateCustom(); | ||||||
|  |  | ||||||
|  | @ -21,9 +21,7 @@ public: | ||||||
| 	static void destroyInstance(); | 	static void destroyInstance(); | ||||||
| 
 | 
 | ||||||
| 	// 启动游戏
 | 	// 启动游戏
 | ||||||
| 	void start( | 	void start(); | ||||||
| 		bool cleanup = true		/* 自动清理资源 */ |  | ||||||
| 	); |  | ||||||
| 
 | 
 | ||||||
| 	// 暂停游戏
 | 	// 暂停游戏
 | ||||||
| 	void pause(); | 	void pause(); | ||||||
|  | @ -48,6 +46,8 @@ public: | ||||||
| 	// 获取游戏配置
 | 	// 获取游戏配置
 | ||||||
| 	Config* getConfig(); | 	Config* getConfig(); | ||||||
| 
 | 
 | ||||||
|  | 	double getTotalTime() const; | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
| 	Game(); | 	Game(); | ||||||
| 
 | 
 | ||||||
|  | @ -59,6 +59,9 @@ private: | ||||||
| 	bool	_ended; | 	bool	_ended; | ||||||
| 	bool	_paused; | 	bool	_paused; | ||||||
| 	Config*	_config; | 	Config*	_config; | ||||||
|  | 	std::chrono::steady_clock::time_point _start; | ||||||
|  | 	std::chrono::steady_clock::time_point _now; | ||||||
|  | 	std::chrono::steady_clock::time_point _last; | ||||||
| 
 | 
 | ||||||
| 	static Game * _instance; | 	static Game * _instance; | ||||||
| }; | }; | ||||||
|  | @ -185,46 +188,6 @@ private: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // 时间控制
 |  | ||||||
| class Time |  | ||||||
| { |  | ||||||
| 	friend class Game; |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 	// 获取上一帧的时间间隔(秒)
 |  | ||||||
| 	static double getDeltaTime(); |  | ||||||
| 
 |  | ||||||
| 	// 获取游戏总时长(秒)
 |  | ||||||
| 	static double getTotalTime(); |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 	// 初始化计时操作
 |  | ||||||
| 	static bool __init(); |  | ||||||
| 
 |  | ||||||
| 	// 是否达到更新时间
 |  | ||||||
| 	static bool __isReady(); |  | ||||||
| 
 |  | ||||||
| 	// 更新当前时间
 |  | ||||||
| 	static void __updateNow(); |  | ||||||
| 
 |  | ||||||
| 	// 更新时间信息
 |  | ||||||
| 	static void __updateLast(); |  | ||||||
| 
 |  | ||||||
| 	// 重置时间信息
 |  | ||||||
| 	static void __reset(); |  | ||||||
| 
 |  | ||||||
| 	// 挂起线程
 |  | ||||||
| 	static void __sleep(); |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 	static std::chrono::steady_clock::time_point _start; |  | ||||||
| 	static std::chrono::steady_clock::time_point _now; |  | ||||||
| 	static std::chrono::steady_clock::time_point _last; |  | ||||||
| 	static std::chrono::steady_clock::time_point _fixedLast; |  | ||||||
| 	static std::chrono::milliseconds _interval; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 输入设备
 | // 输入设备
 | ||||||
| class Input | class Input | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -404,6 +404,34 @@ protected: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | // 时间段
 | ||||||
|  | class Duration | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	Duration(); | ||||||
|  | 
 | ||||||
|  | 	Duration operator + (Duration const & size) const; | ||||||
|  | 	Duration operator - (Duration const & size) const; | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  | 	std::chrono::milliseconds _duration; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // 时间点
 | ||||||
|  | class Time | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	Time(); | ||||||
|  | 
 | ||||||
|  | 	Time operator + (Duration const & size) const; | ||||||
|  | 	Duration operator - (Time const & size) const; | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  | 	std::chrono::steady_clock::time_point _time; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| // ×ÖÌå
 | // ×ÖÌå
 | ||||||
| class Font | class Font | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -55,11 +55,11 @@ | ||||||
|     <ClCompile Include="..\..\core\Base\GC.cpp" /> |     <ClCompile Include="..\..\core\Base\GC.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Input.cpp" /> |     <ClCompile Include="..\..\core\Base\Input.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> |     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Time.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Base\Window.cpp" /> |     <ClCompile Include="..\..\core\Base\Window.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Collider.cpp" /> |     <ClCompile Include="..\..\core\Common\Collider.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Color.cpp" /> |     <ClCompile Include="..\..\core\Common\Color.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Config.cpp" /> |     <ClCompile Include="..\..\core\Common\Config.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Duration.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Font.cpp" /> |     <ClCompile Include="..\..\core\Common\Font.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Function.cpp" /> |     <ClCompile Include="..\..\core\Common\Function.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Image.cpp" /> |     <ClCompile Include="..\..\core\Common\Image.cpp" /> | ||||||
|  | @ -70,6 +70,7 @@ | ||||||
|     <ClCompile Include="..\..\core\Common\Scene.cpp" /> |     <ClCompile Include="..\..\core\Common\Scene.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Size.cpp" /> |     <ClCompile Include="..\..\core\Common\Size.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\String.cpp" /> |     <ClCompile Include="..\..\core\Common\String.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Time.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Custom\Exception.cpp" /> |     <ClCompile Include="..\..\core\Custom\Exception.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Custom\SystemException.cpp" /> |     <ClCompile Include="..\..\core\Custom\SystemException.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Custom\TextRenderer.cpp" /> |     <ClCompile Include="..\..\core\Custom\TextRenderer.cpp" /> | ||||||
|  |  | ||||||
|  | @ -115,9 +115,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Base\Renderer.cpp"> |     <ClCompile Include="..\..\core\Base\Renderer.cpp"> | ||||||
|       <Filter>Base</Filter> |       <Filter>Base</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Base\Time.cpp"> |  | ||||||
|       <Filter>Base</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Base\Window.cpp"> |     <ClCompile Include="..\..\core\Base\Window.cpp"> | ||||||
|       <Filter>Base</Filter> |       <Filter>Base</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |  | ||||||
|  | @ -199,11 +199,11 @@ | ||||||
|     <ClCompile Include="..\..\core\Base\GC.cpp" /> |     <ClCompile Include="..\..\core\Base\GC.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Input.cpp" /> |     <ClCompile Include="..\..\core\Base\Input.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> |     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Time.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Base\Window.cpp" /> |     <ClCompile Include="..\..\core\Base\Window.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Collider.cpp" /> |     <ClCompile Include="..\..\core\Common\Collider.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Color.cpp" /> |     <ClCompile Include="..\..\core\Common\Color.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Config.cpp" /> |     <ClCompile Include="..\..\core\Common\Config.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Duration.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Font.cpp" /> |     <ClCompile Include="..\..\core\Common\Font.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Function.cpp" /> |     <ClCompile Include="..\..\core\Common\Function.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Image.cpp" /> |     <ClCompile Include="..\..\core\Common\Image.cpp" /> | ||||||
|  | @ -214,6 +214,7 @@ | ||||||
|     <ClCompile Include="..\..\core\Common\Scene.cpp" /> |     <ClCompile Include="..\..\core\Common\Scene.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Size.cpp" /> |     <ClCompile Include="..\..\core\Common\Size.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\String.cpp" /> |     <ClCompile Include="..\..\core\Common\String.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Time.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Custom\Exception.cpp" /> |     <ClCompile Include="..\..\core\Custom\Exception.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Custom\SystemException.cpp" /> |     <ClCompile Include="..\..\core\Custom\SystemException.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Custom\TextRenderer.cpp" /> |     <ClCompile Include="..\..\core\Custom\TextRenderer.cpp" /> | ||||||
|  |  | ||||||
|  | @ -115,9 +115,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Base\Renderer.cpp"> |     <ClCompile Include="..\..\core\Base\Renderer.cpp"> | ||||||
|       <Filter>Base</Filter> |       <Filter>Base</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Base\Time.cpp"> |  | ||||||
|       <Filter>Base</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Base\Window.cpp"> |     <ClCompile Include="..\..\core\Base\Window.cpp"> | ||||||
|       <Filter>Base</Filter> |       <Filter>Base</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |  | ||||||
|  | @ -219,11 +219,11 @@ | ||||||
|     <ClCompile Include="..\..\core\Base\GC.cpp" /> |     <ClCompile Include="..\..\core\Base\GC.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Input.cpp" /> |     <ClCompile Include="..\..\core\Base\Input.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> |     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Time.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Base\Window.cpp" /> |     <ClCompile Include="..\..\core\Base\Window.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Collider.cpp" /> |     <ClCompile Include="..\..\core\Common\Collider.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Color.cpp" /> |     <ClCompile Include="..\..\core\Common\Color.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Config.cpp" /> |     <ClCompile Include="..\..\core\Common\Config.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Duration.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Font.cpp" /> |     <ClCompile Include="..\..\core\Common\Font.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Function.cpp" /> |     <ClCompile Include="..\..\core\Common\Function.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Point.cpp" /> |     <ClCompile Include="..\..\core\Common\Point.cpp" /> | ||||||
|  | @ -234,6 +234,7 @@ | ||||||
|     <ClCompile Include="..\..\core\Common\Size.cpp" /> |     <ClCompile Include="..\..\core\Common\Size.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\String.cpp" /> |     <ClCompile Include="..\..\core\Common\String.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Image.cpp" /> |     <ClCompile Include="..\..\core\Common\Image.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Time.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Custom\Exception.cpp" /> |     <ClCompile Include="..\..\core\Custom\Exception.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Custom\SystemException.cpp" /> |     <ClCompile Include="..\..\core\Custom\SystemException.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Custom\TextRenderer.cpp" /> |     <ClCompile Include="..\..\core\Custom\TextRenderer.cpp" /> | ||||||
|  |  | ||||||
|  | @ -78,9 +78,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Manager\SceneManager.cpp"> |     <ClCompile Include="..\..\core\Manager\SceneManager.cpp"> | ||||||
|       <Filter>Manager</Filter> |       <Filter>Manager</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Base\Time.cpp"> |  | ||||||
|       <Filter>Base</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Base\Renderer.cpp"> |     <ClCompile Include="..\..\core\Base\Renderer.cpp"> | ||||||
|       <Filter>Base</Filter> |       <Filter>Base</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  | @ -249,6 +246,12 @@ | ||||||
|     <ClCompile Include="..\..\core\Event\Collision.cpp"> |     <ClCompile Include="..\..\core\Event\Collision.cpp"> | ||||||
|       <Filter>Event</Filter> |       <Filter>Event</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Time.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Duration.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="..\..\core\easy2d.h" /> |     <ClInclude Include="..\..\core\easy2d.h" /> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue