perfect the pause function.
This commit is contained in:
		
							parent
							
								
									f6eecee3aa
								
							
						
					
					
						commit
						6319ed7f2b
					
				|  | @ -45,13 +45,9 @@ void e2d::EAction::stop() | ||||||
| 	m_bEnding = true; | 	m_bEnding = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EAction::setTarget(ENode * node) | void e2d::EAction::_setTarget(ENode * node) | ||||||
| { | { | ||||||
| 	if (!m_pTarget && node) | 	m_pTarget = node; | ||||||
| 	{ |  | ||||||
| 		// 动作只能有一个目标
 |  | ||||||
| 		m_pTarget = node; |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EAction * e2d::EAction::reverse() const | e2d::EAction * e2d::EAction::reverse() const | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ e2d::EActionLoop * e2d::EActionLoop::clone() const | ||||||
| void e2d::EActionLoop::_init() | void e2d::EActionLoop::_init() | ||||||
| { | { | ||||||
| 	EAction::_init(); | 	EAction::_init(); | ||||||
| 	m_pAction->setTarget(m_pTarget); | 	m_pAction->_setTarget(m_pTarget); | ||||||
| 	m_pAction->_init(); | 	m_pAction->_init(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -35,7 +35,7 @@ void e2d::EActionSequence::_init() | ||||||
| 	{ | 	{ | ||||||
| 		for (auto action : m_vActions) | 		for (auto action : m_vActions) | ||||||
| 		{ | 		{ | ||||||
| 			action->setTarget(m_pTarget); | 			action->_setTarget(m_pTarget); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	// 初始化第一个动作
 | 	// 初始化第一个动作
 | ||||||
|  |  | ||||||
|  | @ -35,8 +35,8 @@ e2d::EActionTwo * e2d::EActionTwo::reverse(bool actionReverse) const | ||||||
| void e2d::EActionTwo::_init() | void e2d::EActionTwo::_init() | ||||||
| { | { | ||||||
| 	EAction::_init(); | 	EAction::_init(); | ||||||
| 	m_pFirstAction->setTarget(m_pTarget); | 	m_pFirstAction->_setTarget(m_pTarget); | ||||||
| 	m_pSecondAction->setTarget(m_pTarget); | 	m_pSecondAction->_setTarget(m_pTarget); | ||||||
| 
 | 
 | ||||||
| 	m_pFirstAction->_init(); | 	m_pFirstAction->_init(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -35,8 +35,8 @@ e2d::EActionTwoAtSameTime * e2d::EActionTwoAtSameTime::reverse(bool actionRevers | ||||||
| void e2d::EActionTwoAtSameTime::_init() | void e2d::EActionTwoAtSameTime::_init() | ||||||
| { | { | ||||||
| 	EAction::_init(); | 	EAction::_init(); | ||||||
| 	m_pFirstAction->setTarget(m_pTarget); | 	m_pFirstAction->_setTarget(m_pTarget); | ||||||
| 	m_pSecondAction->setTarget(m_pTarget); | 	m_pSecondAction->_setTarget(m_pTarget); | ||||||
| 
 | 
 | ||||||
| 	m_pFirstAction->_init(); | 	m_pFirstAction->_init(); | ||||||
| 	m_pSecondAction->_init(); | 	m_pSecondAction->_init(); | ||||||
|  |  | ||||||
|  | @ -2,12 +2,14 @@ | ||||||
| 
 | 
 | ||||||
| e2d::EAnimation::EAnimation()  | e2d::EAnimation::EAnimation()  | ||||||
| 	: m_nFrameIndex(0) | 	: m_nFrameIndex(0) | ||||||
|  | 	, m_pTarget(nullptr) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EAnimation::EAnimation(float invertal) | e2d::EAnimation::EAnimation(float invertal) | ||||||
| 	: m_nFrameIndex(0) | 	: m_nFrameIndex(0) | ||||||
| 	, m_fInterval(invertal) | 	, m_fInterval(invertal) | ||||||
|  | 	, m_pTarget(nullptr) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -45,7 +47,7 @@ void e2d::EAnimation::_update() | ||||||
| 		// 重新记录时间
 | 		// 重新记录时间
 | ||||||
| 		m_fLast += m_fInterval; | 		m_fLast += m_fInterval; | ||||||
| 		// 加载关键帧
 | 		// 加载关键帧
 | ||||||
| 		reinterpret_cast<ESprite*>(m_pTarget)->loadFrom(m_vFrames[m_nFrameIndex]); | 		m_pTarget->loadFrom(m_vFrames[m_nFrameIndex]); | ||||||
| 		m_nFrameIndex++; | 		m_nFrameIndex++; | ||||||
| 		// 判断动作是否结束
 | 		// 判断动作是否结束
 | ||||||
| 		if (m_nFrameIndex == m_vFrames.size()) | 		if (m_nFrameIndex == m_vFrames.size()) | ||||||
|  | @ -62,6 +64,11 @@ void e2d::EAnimation::_reset() | ||||||
| 	m_nFrameIndex = 0; | 	m_nFrameIndex = 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void e2d::EAnimation::_setTarget(ENode * node) | ||||||
|  | { | ||||||
|  | 	m_pTarget = static_cast<ESprite*>(node); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void e2d::EAnimation::addKeyframe(EImage * frame) | void e2d::EAnimation::addKeyframe(EImage * frame) | ||||||
| { | { | ||||||
| 	if (frame) | 	if (frame) | ||||||
|  |  | ||||||
|  | @ -50,13 +50,6 @@ bool e2d::EGame::init(LPCTSTR sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR pIc | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// 初始化计时
 |  | ||||||
| 		if (!ETime::__init()) |  | ||||||
| 		{ |  | ||||||
| 			WARN_IF(true, "ETime::__init Failed!"); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// 初始化 DirectInput
 | 		// 初始化 DirectInput
 | ||||||
| 		if (!EInput::__init()) | 		if (!EInput::__init()) | ||||||
| 		{ | 		{ | ||||||
|  | @ -99,22 +92,32 @@ int e2d::EGame::run() | ||||||
| 	::UpdateWindow(EWindow::getHWnd()); | 	::UpdateWindow(EWindow::getHWnd()); | ||||||
| 	// 处理窗口消息
 | 	// 处理窗口消息
 | ||||||
| 	EWindow::__poll(); | 	EWindow::__poll(); | ||||||
| 	// 刷新时间信息
 | 	// 初始化计时
 | ||||||
| 	ETime::__updateNow(); | 	ETime::__init(); | ||||||
| 	ETime::__updateLast(); |  | ||||||
| 
 | 
 | ||||||
| 	while (!s_bEndGame) | 	while (!s_bEndGame) | ||||||
| 	{ | 	{ | ||||||
| 		// 处理窗口消息
 | 		// 处理窗口消息
 | ||||||
| 		EWindow::__poll(); | 		EWindow::__poll(); | ||||||
| 		// 刷新时间信息
 | 		// 刷新时间
 | ||||||
| 		ETime::__updateNow(); | 		ETime::__updateNow(); | ||||||
| 
 | 
 | ||||||
| 		// 判断是否达到了刷新状态
 | 		// 判断是否达到了刷新状态
 | ||||||
| 		if (ETime::getDeltaTime() >= 17) | 		if (ETime::__isReady()) | ||||||
| 		{ | 		{ | ||||||
| 			ETime::__updateLast();		// 刷新时间信息
 | 			while (ETime::__isReady()) | ||||||
| 			EGame::__update();			// 更新游戏内容
 | 			{ | ||||||
|  | 				EInput::__updateDeviceState();	// 获取用户输入
 | ||||||
|  | 				ESceneManager::__update();		// 更新场景内容
 | ||||||
|  | 				ETime::__updateLast();			// 刷新时间信息
 | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (!s_bPaused) | ||||||
|  | 			{ | ||||||
|  | 				ETimerManager::__update();	// 定时器管理器执行程序
 | ||||||
|  | 				EActionManager::__update();	// 动作管理器执行程序
 | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
| 			ERenderer::__render();		// 渲染游戏画面
 | 			ERenderer::__render();		// 渲染游戏画面
 | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
|  | @ -159,8 +162,6 @@ void e2d::EGame::uninit() | ||||||
| { | { | ||||||
| 	// 删除所有场景
 | 	// 删除所有场景
 | ||||||
| 	ESceneManager::__uninit(); | 	ESceneManager::__uninit(); | ||||||
| 	// 重置窗口属性
 |  | ||||||
| 	EWindow::__uninit(); |  | ||||||
| 	// 关闭输入
 | 	// 关闭输入
 | ||||||
| 	EInput::__uninit(); | 	EInput::__uninit(); | ||||||
| 	// 关闭播放器
 | 	// 关闭播放器
 | ||||||
|  | @ -169,27 +170,18 @@ void e2d::EGame::uninit() | ||||||
| 	ETime::__uninit(); | 	ETime::__uninit(); | ||||||
| 	// 清空图片缓存
 | 	// 清空图片缓存
 | ||||||
| 	EImage::clearCache(); | 	EImage::clearCache(); | ||||||
| 	// 删除渲染相关资源
 |  | ||||||
| 	ERenderer::__discardResources(); |  | ||||||
| 	// 刷新内存池
 | 	// 刷新内存池
 | ||||||
| 	EObjectManager::__flush(); | 	EObjectManager::__flush(); | ||||||
|  | 	// 删除渲染相关资源
 | ||||||
|  | 	ERenderer::__discardResources(); | ||||||
|  | 	// 销毁窗口
 | ||||||
|  | 	EWindow::__uninit(); | ||||||
| 
 | 
 | ||||||
| 	CoUninitialize(); | 	CoUninitialize(); | ||||||
| 
 | 
 | ||||||
| 	s_bInitialized = false; | 	s_bInitialized = false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EGame::__update() |  | ||||||
| { |  | ||||||
| 	if (s_bPaused) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	EInput::__updateDeviceState();	// 获取用户输入
 |  | ||||||
| 	ETimerManager::__update();		// 定时器管理器执行程序
 |  | ||||||
| 	EActionManager::__update();		// 动作管理器执行程序
 |  | ||||||
| 	ESceneManager::__update();		// 更新游戏内容
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EString e2d::EGame::getAppName() | e2d::EString e2d::EGame::getAppName() | ||||||
| { | { | ||||||
| 	return s_sAppName; | 	return s_sAppName; | ||||||
|  |  | ||||||
|  | @ -1,9 +1,23 @@ | ||||||
| #include "..\ebase.h" | #include "..\ebase.h" | ||||||
|  | #include <thread> | ||||||
|  | #include <chrono> | ||||||
|  | using namespace std::chrono; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | // 游戏开始时间
 | ||||||
|  | static steady_clock::time_point s_tStart; | ||||||
|  | // 当前时间
 | ||||||
|  | static steady_clock::time_point s_tNow; | ||||||
|  | // 上一帧刷新时间
 | ||||||
|  | static steady_clock::time_point s_tFixedUpdate; | ||||||
|  | // 上一次更新时间
 | ||||||
|  | static steady_clock::time_point s_tLastUpdate; | ||||||
| // 上一帧与当前帧的时间间隔
 | // 上一帧与当前帧的时间间隔
 | ||||||
| static int s_nInterval = 0; | static int s_nInterval = 0; | ||||||
| // 游戏开始时长
 | // 游戏开始时长
 | ||||||
| static float s_fTotalTime = 0; | static float s_fTotalTime = 0; | ||||||
|  | // 每一帧间隔
 | ||||||
|  | static milliseconds s_tExceptedInvertal; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| float e2d::ETime::getTotalTime() | float e2d::ETime::getTotalTime() | ||||||
|  | @ -16,26 +30,10 @@ int e2d::ETime::getDeltaTime() | ||||||
| 	return s_nInterval; | 	return s_nInterval; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #if _MSC_VER > 1600 |  | ||||||
| 
 |  | ||||||
| #include <thread> |  | ||||||
| #include <chrono> |  | ||||||
| using namespace std::chrono; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 游戏开始时间
 |  | ||||||
| static steady_clock::time_point s_tStart; |  | ||||||
| // 当前时间
 |  | ||||||
| static steady_clock::time_point s_tNow; |  | ||||||
| // 上一帧刷新时间
 |  | ||||||
| static steady_clock::time_point s_tLast; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| bool e2d::ETime::__init() | bool e2d::ETime::__init() | ||||||
| { | { | ||||||
| 	s_tStart = s_tLast = s_tNow = steady_clock::now(); | 	s_tStart = s_tLastUpdate = s_tFixedUpdate = s_tNow = steady_clock::now(); | ||||||
|  | 	s_tExceptedInvertal = milliseconds(17); | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -43,93 +41,35 @@ void e2d::ETime::__uninit() | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool e2d::ETime::__isReady() | ||||||
|  | { | ||||||
|  | 	return s_tExceptedInvertal < duration_cast<milliseconds>(s_tNow - s_tFixedUpdate); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void e2d::ETime::__updateNow() | void e2d::ETime::__updateNow() | ||||||
| { | { | ||||||
|  | 	// 刷新时间
 | ||||||
| 	s_tNow = steady_clock::now(); | 	s_tNow = steady_clock::now(); | ||||||
| 	s_fTotalTime = static_cast<float>(duration_cast<milliseconds>(s_tNow - s_tStart).count()) / 1000.0f; |  | ||||||
| 	s_nInterval = static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tLast).count()); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETime::__updateLast() | void e2d::ETime::__updateLast() | ||||||
| { | { | ||||||
| 	s_tLast = s_tNow; | 	s_tFixedUpdate += s_tExceptedInvertal; | ||||||
|  | 	s_tLastUpdate = s_tNow; | ||||||
|  | 
 | ||||||
|  | 	s_tNow = steady_clock::now(); | ||||||
|  | 	s_nInterval = static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tLastUpdate).count()); | ||||||
|  | 	s_fTotalTime = static_cast<float>(duration_cast<milliseconds>(s_tNow - s_tStart).count()) / 1000.0f; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETime::__sleep() | void e2d::ETime::__sleep() | ||||||
| { | { | ||||||
| 	// 计算挂起时长
 | 	// 计算挂起时长
 | ||||||
| 	int nWaitMS = 16 - s_nInterval; | 	int nWaitMS = 16 - static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tFixedUpdate).count()); | ||||||
| 	// 挂起线程,释放 CPU 占用
 | 	 | ||||||
| 	if (nWaitMS > 1) | 	if (nWaitMS > 1) | ||||||
| 	{ | 	{ | ||||||
|  | 		// 挂起线程,释放 CPU 占用
 | ||||||
| 		std::this_thread::sleep_for(milliseconds(nWaitMS)); | 		std::this_thread::sleep_for(milliseconds(nWaitMS)); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #else |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #include <mmsystem.h> |  | ||||||
| #pragma comment(lib, "winmm.lib") |  | ||||||
| 
 |  | ||||||
| // 时钟频率
 |  | ||||||
| static LARGE_INTEGER s_tFreq; |  | ||||||
| // 当前时间
 |  | ||||||
| static LARGE_INTEGER s_tNow; |  | ||||||
| // 游戏开始时间
 |  | ||||||
| static LARGE_INTEGER s_tStart; |  | ||||||
| // 上一帧画面绘制时间
 |  | ||||||
| static LARGE_INTEGER s_tLast; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| bool e2d::ETime::__init() |  | ||||||
| { |  | ||||||
| 	bool bRet = false; |  | ||||||
| 	if (::timeBeginPeriod(1)) |  | ||||||
| 	{ |  | ||||||
| 		// 修改时间精度
 |  | ||||||
| 		if (::QueryPerformanceFrequency(&s_tFreq))	// 获取时钟频率
 |  | ||||||
| 		{ |  | ||||||
| 
 |  | ||||||
| 			if (::QueryPerformanceCounter(&s_tNow))		// 刷新当前时间
 |  | ||||||
| 			{ |  | ||||||
| 				s_tStart = s_tLast = s_tNow; |  | ||||||
| 				bRet = true; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return bRet; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ETime::__uninit() |  | ||||||
| { |  | ||||||
| 	::timeEndPeriod(1);	// 重置时间精度
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ETime::__updateNow() |  | ||||||
| { |  | ||||||
| 	::QueryPerformanceCounter(&s_tNow); |  | ||||||
| 	s_fTotalTime = static_cast<float>(s_tNow.QuadPart - s_tStart.QuadPart) / s_tFreq.QuadPart; |  | ||||||
| 	s_nInterval = static_cast<int>((s_tNow.QuadPart - s_tLast.QuadPart) * 1000LL / s_tFreq.QuadPart); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ETime::__updateLast() |  | ||||||
| { |  | ||||||
| 	s_tLast = s_tNow; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ETime::__sleep() |  | ||||||
| { |  | ||||||
| 	// 计算挂起时长
 |  | ||||||
| 	int nWaitMS = 16 - s_nInterval; |  | ||||||
| 	// 挂起线程,释放 CPU 占用
 |  | ||||||
| 	if (nWaitMS > 1) |  | ||||||
| 	{ |  | ||||||
| 		::Sleep(nWaitMS); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #endif // _MSC_VER > 1600
 |  | ||||||
|  | @ -102,10 +102,14 @@ bool e2d::EWindow::__init(LPCTSTR sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR | ||||||
| 
 | 
 | ||||||
| void e2d::EWindow::__uninit() | void e2d::EWindow::__uninit() | ||||||
| { | { | ||||||
|  | 	// 关闭控制台
 | ||||||
| 	if (::GetConsoleWindow()) | 	if (::GetConsoleWindow()) | ||||||
| 	{ | 	{ | ||||||
| 		::FreeConsole(); | 		::FreeConsole(); | ||||||
| 	} | 	} | ||||||
|  | 	// 关闭窗口
 | ||||||
|  | 	DestroyWindow(s_HWnd); | ||||||
|  | 	s_HWnd = nullptr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EWindow::__poll() | void e2d::EWindow::__poll() | ||||||
|  |  | ||||||
|  | @ -39,13 +39,21 @@ void e2d::EScene::_render() | ||||||
| 
 | 
 | ||||||
| void e2d::EScene::_update() | void e2d::EScene::_update() | ||||||
| { | { | ||||||
| 	// 执行 onUpdate 函数
 | 	if (!EGame::isPaused()) | ||||||
| 	if (m_bAutoUpdate) |  | ||||||
| 	{ | 	{ | ||||||
| 		this->onUpdate(); | 		// 执行 onUpdate 函数
 | ||||||
|  | 		if (m_bAutoUpdate) | ||||||
|  | 		{ | ||||||
|  | 			this->onUpdate(); | ||||||
|  | 		} | ||||||
|  | 		// 更新根节点
 | ||||||
|  | 		m_pRoot->_update(false); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		// 更新根节点
 | ||||||
|  | 		m_pRoot->_update(true); | ||||||
| 	} | 	} | ||||||
| 	// 更新根节点
 |  | ||||||
| 	m_pRoot->_update(); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EScene::setAutoUpdate(bool bAutoUpdate) | void e2d::EScene::setAutoUpdate(bool bAutoUpdate) | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ | ||||||
| 
 | 
 | ||||||
| e2d::EButton::EButton() | e2d::EButton::EButton() | ||||||
| 	: m_Callback((const BtnClkCallback &)nullptr) | 	: m_Callback((const BtnClkCallback &)nullptr) | ||||||
| 	, m_eStatus(EButton::NORMAL) | 	, m_eBtnState(EButton::NORMAL) | ||||||
| 	, m_bEnable(true) | 	, m_bEnable(true) | ||||||
| 	, m_bIsSelected(false) | 	, m_bIsSelected(false) | ||||||
| 	, m_pNormal(nullptr) | 	, m_pNormal(nullptr) | ||||||
|  | @ -14,7 +14,7 @@ e2d::EButton::EButton() | ||||||
| 
 | 
 | ||||||
| e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback) | e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback) | ||||||
| 	: m_Callback((const BtnClkCallback &)nullptr) | 	: m_Callback((const BtnClkCallback &)nullptr) | ||||||
| 	, m_eStatus(EButton::NORMAL) | 	, m_eBtnState(EButton::NORMAL) | ||||||
| 	, m_bEnable(true) | 	, m_bEnable(true) | ||||||
| 	, m_bIsSelected(false) | 	, m_bIsSelected(false) | ||||||
| 	, m_pNormal(nullptr) | 	, m_pNormal(nullptr) | ||||||
|  | @ -28,7 +28,7 @@ e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback) | ||||||
| 
 | 
 | ||||||
| e2d::EButton::EButton(ENode * normal, ENode * selected, const BtnClkCallback & callback) | e2d::EButton::EButton(ENode * normal, ENode * selected, const BtnClkCallback & callback) | ||||||
| 	: m_Callback((const BtnClkCallback &)nullptr) | 	: m_Callback((const BtnClkCallback &)nullptr) | ||||||
| 	, m_eStatus(EButton::NORMAL) | 	, m_eBtnState(EButton::NORMAL) | ||||||
| 	, m_bEnable(true) | 	, m_bEnable(true) | ||||||
| 	, m_bIsSelected(false) | 	, m_bIsSelected(false) | ||||||
| 	, m_pNormal(nullptr) | 	, m_pNormal(nullptr) | ||||||
|  | @ -43,7 +43,7 @@ e2d::EButton::EButton(ENode * normal, ENode * selected, const BtnClkCallback & c | ||||||
| 
 | 
 | ||||||
| e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const BtnClkCallback & callback) | e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const BtnClkCallback & callback) | ||||||
| 	: m_Callback((const BtnClkCallback &)nullptr) | 	: m_Callback((const BtnClkCallback &)nullptr) | ||||||
| 	, m_eStatus(EButton::NORMAL) | 	, m_eBtnState(EButton::NORMAL) | ||||||
| 	, m_bEnable(true) | 	, m_bEnable(true) | ||||||
| 	, m_bIsSelected(false) | 	, m_bIsSelected(false) | ||||||
| 	, m_pNormal(nullptr) | 	, m_pNormal(nullptr) | ||||||
|  | @ -59,7 +59,7 @@ e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const | ||||||
| 
 | 
 | ||||||
| e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, ENode * disabled, const BtnClkCallback & callback) | e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, ENode * disabled, const BtnClkCallback & callback) | ||||||
| 	: m_Callback((const BtnClkCallback &)nullptr) | 	: m_Callback((const BtnClkCallback &)nullptr) | ||||||
| 	, m_eStatus(EButton::NORMAL) | 	, m_eBtnState(EButton::NORMAL) | ||||||
| 	, m_bEnable(true) | 	, m_bEnable(true) | ||||||
| 	, m_bIsSelected(false) | 	, m_bIsSelected(false) | ||||||
| 	, m_pNormal(nullptr) | 	, m_pNormal(nullptr) | ||||||
|  | @ -228,7 +228,7 @@ void e2d::EButton::onUpdate() | ||||||
| 			{ | 			{ | ||||||
| 				// 鼠标左键按下,且位于按钮内时,标记 m_bIsSelected 为 true
 | 				// 鼠标左键按下,且位于按钮内时,标记 m_bIsSelected 为 true
 | ||||||
| 				m_bIsSelected = true; | 				m_bIsSelected = true; | ||||||
| 				_setStatus(EButton::SELECTED); | 				_setState(EButton::SELECTED); | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | @ -237,25 +237,30 @@ void e2d::EButton::onUpdate() | ||||||
| 		{ | 		{ | ||||||
| 			if (pSelected->isPointIn(EInput::getMousePos())) | 			if (pSelected->isPointIn(EInput::getMousePos())) | ||||||
| 			{ | 			{ | ||||||
| 				_setStatus(EButton::SELECTED); | 				_setState(EButton::SELECTED); | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		else if (m_pNormal->isPointIn(EInput::getMousePos())) | 		else if (m_pNormal->isPointIn(EInput::getMousePos())) | ||||||
| 		{ | 		{ | ||||||
| 			_setStatus(EButton::MOUSEOVER); | 			_setState(EButton::MOUSEOVER); | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		_setStatus(EButton::NORMAL); | 		_setState(EButton::NORMAL); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EButton::_setStatus(STATUS status) | void e2d::EButton::onPause() | ||||||
| { | { | ||||||
| 	if (m_eStatus != status) | 	this->onUpdate(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EButton::_setState(BTN_STATE state) | ||||||
|  | { | ||||||
|  | 	if (m_eBtnState != state) | ||||||
| 	{ | 	{ | ||||||
| 		m_eStatus = status; | 		m_eBtnState = state; | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -269,11 +274,11 @@ void e2d::EButton::_updateVisiable() | ||||||
| 
 | 
 | ||||||
| 	if (m_bEnable) | 	if (m_bEnable) | ||||||
| 	{ | 	{ | ||||||
| 		if (m_eStatus == EButton::SELECTED && m_pSelected) | 		if (m_eBtnState == EButton::SELECTED && m_pSelected) | ||||||
| 		{ | 		{ | ||||||
| 			m_pSelected->setVisiable(true); | 			m_pSelected->setVisiable(true); | ||||||
| 		} | 		} | ||||||
| 		else if (m_eStatus == EButton::MOUSEOVER && m_pMouseover) | 		else if (m_eBtnState == EButton::MOUSEOVER && m_pMouseover) | ||||||
| 		{ | 		{ | ||||||
| 			m_pMouseover->setVisiable(true); | 			m_pMouseover->setVisiable(true); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ | ||||||
| 
 | 
 | ||||||
| e2d::EButtonToggle::EButtonToggle() | e2d::EButtonToggle::EButtonToggle() | ||||||
| 	: EButton() | 	: EButton() | ||||||
| 	, m_bToggle(true) | 	, m_bState(true) | ||||||
| 	, m_pNormalOn(nullptr) | 	, m_pNormalOn(nullptr) | ||||||
| 	, m_pMouseoverOn(nullptr) | 	, m_pMouseoverOn(nullptr) | ||||||
| 	, m_pSelectedOn(nullptr) | 	, m_pSelectedOn(nullptr) | ||||||
|  | @ -16,7 +16,7 @@ e2d::EButtonToggle::EButtonToggle() | ||||||
| 
 | 
 | ||||||
| e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, const BtnClkCallback & callback) | e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, const BtnClkCallback & callback) | ||||||
| 	: EButton() | 	: EButton() | ||||||
| 	, m_bToggle(true) | 	, m_bState(true) | ||||||
| 	, m_pNormalOn(nullptr) | 	, m_pNormalOn(nullptr) | ||||||
| 	, m_pMouseoverOn(nullptr) | 	, m_pMouseoverOn(nullptr) | ||||||
| 	, m_pSelectedOn(nullptr) | 	, m_pSelectedOn(nullptr) | ||||||
|  | @ -33,7 +33,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma | ||||||
| 
 | 
 | ||||||
| e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback) | e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback) | ||||||
| 	: EButton() | 	: EButton() | ||||||
| 	, m_bToggle(true) | 	, m_bState(true) | ||||||
| 	, m_pNormalOn(nullptr) | 	, m_pNormalOn(nullptr) | ||||||
| 	, m_pMouseoverOn(nullptr) | 	, m_pMouseoverOn(nullptr) | ||||||
| 	, m_pSelectedOn(nullptr) | 	, m_pSelectedOn(nullptr) | ||||||
|  | @ -52,7 +52,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma | ||||||
| 
 | 
 | ||||||
| e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback) | e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback) | ||||||
| 	: EButton() | 	: EButton() | ||||||
| 	, m_bToggle(true) | 	, m_bState(true) | ||||||
| 	, m_pNormalOn(nullptr) | 	, m_pNormalOn(nullptr) | ||||||
| 	, m_pMouseoverOn(nullptr) | 	, m_pMouseoverOn(nullptr) | ||||||
| 	, m_pSelectedOn(nullptr) | 	, m_pSelectedOn(nullptr) | ||||||
|  | @ -73,7 +73,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma | ||||||
| 
 | 
 | ||||||
| e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, ENode * toggleOnDisabled, ENode * toggleOffDisabled, const BtnClkCallback & callback) | e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, ENode * toggleOnDisabled, ENode * toggleOffDisabled, const BtnClkCallback & callback) | ||||||
| 	: EButton() | 	: EButton() | ||||||
| 	, m_bToggle(true) | 	, m_bState(true) | ||||||
| 	, m_pNormalOn(nullptr) | 	, m_pNormalOn(nullptr) | ||||||
| 	, m_pMouseoverOn(nullptr) | 	, m_pMouseoverOn(nullptr) | ||||||
| 	, m_pSelectedOn(nullptr) | 	, m_pSelectedOn(nullptr) | ||||||
|  | @ -97,7 +97,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma | ||||||
| void e2d::EButtonToggle::toggle() | void e2d::EButtonToggle::toggle() | ||||||
| { | { | ||||||
| 	// 设置按钮状态
 | 	// 设置按钮状态
 | ||||||
| 	setToggle(!m_bToggle); | 	setState(!m_bState); | ||||||
| 	// 执行回调函数
 | 	// 执行回调函数
 | ||||||
| 	if (m_Callback) | 	if (m_Callback) | ||||||
| 	{ | 	{ | ||||||
|  | @ -105,17 +105,17 @@ void e2d::EButtonToggle::toggle() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::EButtonToggle::isToggleOn() const | bool e2d::EButtonToggle::getState() const | ||||||
| { | { | ||||||
| 	return m_bToggle; | 	return m_bState; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EButtonToggle::setToggle(bool toggle) | void e2d::EButtonToggle::setState(bool bState) | ||||||
| { | { | ||||||
| 	if (m_bToggle != toggle) | 	if (m_bState != bState) | ||||||
| 	{ | 	{ | ||||||
| 		m_bToggle = toggle; | 		m_bState = bState; | ||||||
| 		_updateToggle(); | 		_updateState(); | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -133,10 +133,11 @@ void e2d::EButtonToggle::setNormal(ENode * normal) | ||||||
| 		if (normal) | 		if (normal) | ||||||
| 		{ | 		{ | ||||||
| 			this->addChild(normal); | 			this->addChild(normal); | ||||||
|  | 			normal->setPivot(m_fPivotX, m_fPivotY); | ||||||
| 		} | 		} | ||||||
| 		m_pNormalOn = normal; | 		m_pNormalOn = normal; | ||||||
| 
 | 
 | ||||||
| 		_updateToggle(); | 		_updateState(); | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -154,10 +155,11 @@ void e2d::EButtonToggle::setMouseOver(ENode * mouseover) | ||||||
| 		if (mouseover) | 		if (mouseover) | ||||||
| 		{ | 		{ | ||||||
| 			this->addChild(mouseover); | 			this->addChild(mouseover); | ||||||
|  | 			mouseover->setPivot(m_fPivotX, m_fPivotY); | ||||||
| 		} | 		} | ||||||
| 		m_pMouseoverOn = mouseover; | 		m_pMouseoverOn = mouseover; | ||||||
| 
 | 
 | ||||||
| 		_updateToggle(); | 		_updateState(); | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -175,10 +177,11 @@ void e2d::EButtonToggle::setSelected(ENode * selected) | ||||||
| 		if (selected) | 		if (selected) | ||||||
| 		{ | 		{ | ||||||
| 			this->addChild(selected); | 			this->addChild(selected); | ||||||
|  | 			selected->setPivot(m_fPivotX, m_fPivotY); | ||||||
| 		} | 		} | ||||||
| 		m_pSelectedOn = selected; | 		m_pSelectedOn = selected; | ||||||
| 
 | 
 | ||||||
| 		_updateToggle(); | 		_updateState(); | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -196,10 +199,11 @@ void e2d::EButtonToggle::setDisabled(ENode * disabled) | ||||||
| 		if (disabled) | 		if (disabled) | ||||||
| 		{ | 		{ | ||||||
| 			this->addChild(disabled); | 			this->addChild(disabled); | ||||||
|  | 			disabled->setPivot(m_fPivotX, m_fPivotY); | ||||||
| 		} | 		} | ||||||
| 		m_pDisabledOn = disabled; | 		m_pDisabledOn = disabled; | ||||||
| 
 | 
 | ||||||
| 		_updateToggle(); | 		_updateState(); | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -217,10 +221,11 @@ void e2d::EButtonToggle::setNormalOff(ENode * normal) | ||||||
| 		if (normal) | 		if (normal) | ||||||
| 		{ | 		{ | ||||||
| 			this->addChild(normal); | 			this->addChild(normal); | ||||||
|  | 			normal->setPivot(m_fPivotX, m_fPivotY); | ||||||
| 		} | 		} | ||||||
| 		m_pNormalOff = normal; | 		m_pNormalOff = normal; | ||||||
| 
 | 
 | ||||||
| 		_updateToggle(); | 		_updateState(); | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -238,10 +243,11 @@ void e2d::EButtonToggle::setMouseOverOff(ENode * mouseover) | ||||||
| 		if (mouseover) | 		if (mouseover) | ||||||
| 		{ | 		{ | ||||||
| 			this->addChild(mouseover); | 			this->addChild(mouseover); | ||||||
|  | 			mouseover->setPivot(m_fPivotX, m_fPivotY); | ||||||
| 		} | 		} | ||||||
| 		m_pMouseoverOff = mouseover; | 		m_pMouseoverOff = mouseover; | ||||||
| 
 | 
 | ||||||
| 		_updateToggle(); | 		_updateState(); | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -259,10 +265,11 @@ void e2d::EButtonToggle::setSelectedOff(ENode * selected) | ||||||
| 		if (selected) | 		if (selected) | ||||||
| 		{ | 		{ | ||||||
| 			this->addChild(selected); | 			this->addChild(selected); | ||||||
|  | 			selected->setPivot(m_fPivotX, m_fPivotY); | ||||||
| 		} | 		} | ||||||
| 		m_pSelectedOff = selected; | 		m_pSelectedOff = selected; | ||||||
| 
 | 
 | ||||||
| 		_updateToggle(); | 		_updateState(); | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -280,17 +287,57 @@ void e2d::EButtonToggle::setDisabledOff(ENode * disabled) | ||||||
| 		if (disabled) | 		if (disabled) | ||||||
| 		{ | 		{ | ||||||
| 			this->addChild(disabled); | 			this->addChild(disabled); | ||||||
|  | 			disabled->setPivot(m_fPivotX, m_fPivotY); | ||||||
| 		} | 		} | ||||||
| 		m_pDisabledOff = disabled; | 		m_pDisabledOff = disabled; | ||||||
| 
 | 
 | ||||||
| 		_updateToggle(); | 		_updateState(); | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EButtonToggle::_updateToggle() | void e2d::EButtonToggle::setPivotX(float pivotX) | ||||||
| { | { | ||||||
| 	if (m_bToggle) | 	ENode::setPivotX(pivotX); | ||||||
|  | 	if (m_pNormalOn) m_pNormalOn->setPivotX(pivotX); | ||||||
|  | 	if (m_pMouseoverOn) m_pMouseoverOn->setPivotX(pivotX); | ||||||
|  | 	if (m_pSelectedOn) m_pSelectedOn->setPivotX(pivotX); | ||||||
|  | 	if (m_pDisabledOn) m_pDisabledOn->setPivotX(pivotX); | ||||||
|  | 	if (m_pNormalOff) m_pNormalOff->setPivotX(pivotX); | ||||||
|  | 	if (m_pMouseoverOff) m_pMouseoverOff->setPivotX(pivotX); | ||||||
|  | 	if (m_pSelectedOff) m_pSelectedOff->setPivotX(pivotX); | ||||||
|  | 	if (m_pDisabledOff) m_pDisabledOff->setPivotX(pivotX); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EButtonToggle::setPivotY(float pivotY) | ||||||
|  | { | ||||||
|  | 	ENode::setPivotY(pivotY); | ||||||
|  | 	if (m_pNormalOn) m_pNormalOn->setPivotY(pivotY); | ||||||
|  | 	if (m_pMouseoverOn) m_pMouseoverOn->setPivotY(pivotY); | ||||||
|  | 	if (m_pSelectedOn) m_pSelectedOn->setPivotY(pivotY); | ||||||
|  | 	if (m_pDisabledOn) m_pDisabledOn->setPivotY(pivotY); | ||||||
|  | 	if (m_pNormalOff) m_pNormalOff->setPivotY(pivotY); | ||||||
|  | 	if (m_pMouseoverOff) m_pMouseoverOff->setPivotY(pivotY); | ||||||
|  | 	if (m_pSelectedOff) m_pSelectedOff->setPivotY(pivotY); | ||||||
|  | 	if (m_pDisabledOff) m_pDisabledOff->setPivotY(pivotY); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EButtonToggle::setPivot(float pivotX, float pivotY) | ||||||
|  | { | ||||||
|  | 	ENode::setPivot(pivotX, pivotY); | ||||||
|  | 	if (m_pNormalOn) m_pNormalOn->setPivot(pivotX, pivotY); | ||||||
|  | 	if (m_pMouseoverOn) m_pMouseoverOn->setPivot(pivotX, pivotY); | ||||||
|  | 	if (m_pSelectedOn) m_pSelectedOn->setPivot(pivotX, pivotY); | ||||||
|  | 	if (m_pDisabledOn) m_pDisabledOn->setPivot(pivotX, pivotY); | ||||||
|  | 	if (m_pNormalOff) m_pNormalOff->setPivot(pivotX, pivotY); | ||||||
|  | 	if (m_pMouseoverOff) m_pMouseoverOff->setPivot(pivotX, pivotY); | ||||||
|  | 	if (m_pSelectedOff) m_pSelectedOff->setPivot(pivotX, pivotY); | ||||||
|  | 	if (m_pDisabledOff) m_pDisabledOff->setPivot(pivotX, pivotY); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EButtonToggle::_updateState() | ||||||
|  | { | ||||||
|  | 	if (m_bState) | ||||||
| 	{ | 	{ | ||||||
| 		m_pNormal = m_pNormalOn; | 		m_pNormal = m_pNormalOn; | ||||||
| 		m_pMouseover = m_pMouseoverOn; | 		m_pMouseover = m_pMouseoverOn; | ||||||
|  | @ -318,8 +365,8 @@ void e2d::EButtonToggle::_updateToggle() | ||||||
| 
 | 
 | ||||||
| void e2d::EButtonToggle::_runCallback() | void e2d::EButtonToggle::_runCallback() | ||||||
| { | { | ||||||
| 	m_bToggle = !m_bToggle; | 	m_bState = !m_bState; | ||||||
| 	_updateToggle(); | 	_updateState(); | ||||||
| 
 | 
 | ||||||
| 	if (m_Callback) | 	if (m_Callback) | ||||||
| 	{ | 	{ | ||||||
|  |  | ||||||
|  | @ -45,7 +45,7 @@ e2d::ENode::~ENode() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::_update() | void e2d::ENode::_update(bool bPaused) | ||||||
| { | { | ||||||
| 	if (m_bTransformNeeded) | 	if (m_bTransformNeeded) | ||||||
| 	{ | 	{ | ||||||
|  | @ -77,7 +77,7 @@ void e2d::ENode::_update() | ||||||
| 			// 访问 Order 小于零的节点
 | 			// 访问 Order 小于零的节点
 | ||||||
| 			if (child->getOrder() < 0) | 			if (child->getOrder() < 0) | ||||||
| 			{ | 			{ | ||||||
| 				child->_update(); | 				child->_update(bPaused); | ||||||
| 			} | 			} | ||||||
| 			else | 			else | ||||||
| 			{ | 			{ | ||||||
|  | @ -85,20 +85,29 @@ void e2d::ENode::_update() | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// 执行 onUpdate 函数
 | 		if (bPaused) | ||||||
| 		if (m_bAutoUpdate) | 		{ | ||||||
|  | 			this->onPause(); | ||||||
|  | 		} | ||||||
|  | 		else if (m_bAutoUpdate) | ||||||
| 		{ | 		{ | ||||||
| 			this->onUpdate(); | 			this->onUpdate(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// 访问剩余节点
 | 		// 访问剩余节点
 | ||||||
| 		for (; i < size; i++) | 		for (; i < size; i++) | ||||||
| 			m_vChildren[i]->_update(); | 			m_vChildren[i]->_update(bPaused); | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		// 执行 onUpdate 函数
 | 		if (bPaused) | ||||||
| 		this->onUpdate(); | 		{ | ||||||
|  | 			this->onPause(); | ||||||
|  | 		} | ||||||
|  | 		else if (m_bAutoUpdate) | ||||||
|  | 		{ | ||||||
|  | 			this->onUpdate(); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -720,7 +729,7 @@ void e2d::ENode::runAction(EAction * action) | ||||||
| 	{ | 	{ | ||||||
| 		action = action->clone(); | 		action = action->clone(); | ||||||
| 	} | 	} | ||||||
| 	action->setTarget(this); | 	action->_setTarget(this); | ||||||
| 	EActionManager::addAction(action); | 	EActionManager::addAction(action); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -253,6 +253,8 @@ void EMusic::_close() | ||||||
| { | { | ||||||
| 	if (m_pSourceVoice) | 	if (m_pSourceVoice) | ||||||
| 	{ | 	{ | ||||||
|  | 		m_pSourceVoice->Stop(); | ||||||
|  | 		m_pSourceVoice->FlushSourceBuffers(); | ||||||
| 		m_pSourceVoice->DestroyVoice(); | 		m_pSourceVoice->DestroyVoice(); | ||||||
| 		m_pSourceVoice = nullptr; | 		m_pSourceVoice = nullptr; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
| namespace e2d | namespace e2d | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
|  | class ENode; | ||||||
| class EActionManager; | class EActionManager; | ||||||
| class EActionTwo; | class EActionTwo; | ||||||
| class EActionLoop; | class EActionLoop; | ||||||
|  | @ -14,6 +15,7 @@ class ETransitionFade; | ||||||
| class EAction : | class EAction : | ||||||
| 	public EObject | 	public EObject | ||||||
| { | { | ||||||
|  | 	friend ENode; | ||||||
| 	friend EActionManager; | 	friend EActionManager; | ||||||
| 	friend EActionTwo; | 	friend EActionTwo; | ||||||
| 	friend EActionLoop; | 	friend EActionLoop; | ||||||
|  | @ -49,11 +51,6 @@ public: | ||||||
| 	// 获取执行该动作的目标
 | 	// 获取执行该动作的目标
 | ||||||
| 	virtual ENode * getTarget(); | 	virtual ENode * getTarget(); | ||||||
| 
 | 
 | ||||||
| 	// 设置动作执行目标
 |  | ||||||
| 	virtual void setTarget( |  | ||||||
| 		ENode * node |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| protected: | protected: | ||||||
| 	// 初始化动作
 | 	// 初始化动作
 | ||||||
| 	virtual void _init(); | 	virtual void _init(); | ||||||
|  | @ -70,6 +67,11 @@ protected: | ||||||
| 	// 重置动画时间
 | 	// 重置动画时间
 | ||||||
| 	virtual void _resetTime(); | 	virtual void _resetTime(); | ||||||
| 
 | 
 | ||||||
|  | 	// 设置动作执行目标
 | ||||||
|  | 	virtual void _setTarget( | ||||||
|  | 		ENode * node | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 	bool	m_bRunning; | 	bool	m_bRunning; | ||||||
| 	bool	m_bEnding; | 	bool	m_bEnding; | ||||||
|  | @ -579,9 +581,9 @@ public: | ||||||
| 		EImage * frame	/* 添加关键帧 */ | 		EImage * frame	/* 添加关键帧 */ | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置每一帧的时间间隔(秒)
 | 	// 设置每一帧的时间间隔
 | ||||||
| 	void setInterval( | 	void setInterval( | ||||||
| 		float interval | 		float interval	/* 帧间隔(秒) */ | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 获取该动画的拷贝对象
 | 	// 获取该动画的拷贝对象
 | ||||||
|  | @ -600,9 +602,15 @@ protected: | ||||||
| 	// 重置动作
 | 	// 重置动作
 | ||||||
| 	virtual void _reset() override; | 	virtual void _reset() override; | ||||||
| 
 | 
 | ||||||
|  | 	// 设置动作执行目标
 | ||||||
|  | 	virtual void _setTarget( | ||||||
|  | 		ENode * node | ||||||
|  | 	) override; | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 	float	m_fInterval; | 	float		m_fInterval; | ||||||
| 	UINT	m_nFrameIndex; | 	UINT		m_nFrameIndex; | ||||||
|  | 	ESprite*	m_pTarget; | ||||||
| 	std::vector<EImage*> m_vFrames; | 	std::vector<EImage*> m_vFrames; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -41,10 +41,6 @@ public: | ||||||
| 
 | 
 | ||||||
| 	// 获取 AppName
 | 	// 获取 AppName
 | ||||||
| 	static EString getAppName(); | 	static EString getAppName(); | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 	// 更新游戏内容
 |  | ||||||
| 	static void __update(); |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -129,6 +125,9 @@ private: | ||||||
| 	// 重置计时操作
 | 	// 重置计时操作
 | ||||||
| 	static void __uninit(); | 	static void __uninit(); | ||||||
| 
 | 
 | ||||||
|  | 	// 是否达到更新时间
 | ||||||
|  | 	static bool __isReady(); | ||||||
|  | 
 | ||||||
| 	// 更新当前时间
 | 	// 更新当前时间
 | ||||||
| 	static void __updateNow(); | 	static void __updateNow(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -634,8 +634,11 @@ public: | ||||||
| 	// 重写这个函数,它将在每一帧画面刷新时执行
 | 	// 重写这个函数,它将在每一帧画面刷新时执行
 | ||||||
| 	virtual void onUpdate() {} | 	virtual void onUpdate() {} | ||||||
| 
 | 
 | ||||||
|  | 	// 重写这个函数,它将在游戏暂停时执行
 | ||||||
|  | 	virtual void onPause() {} | ||||||
|  | 
 | ||||||
| 	// 开启或禁用 onUpdate 函数
 | 	// 开启或禁用 onUpdate 函数
 | ||||||
| 	virtual void setAutoUpdate( | 	void setAutoUpdate( | ||||||
| 		bool bAutoUpdate | 		bool bAutoUpdate | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										149
									
								
								core/enodes.h
								
								
								
								
							
							
						
						
									
										149
									
								
								core/enodes.h
								
								
								
								
							|  | @ -21,6 +21,12 @@ public: | ||||||
| 
 | 
 | ||||||
| 	virtual ~ENode(); | 	virtual ~ENode(); | ||||||
| 
 | 
 | ||||||
|  | 	// 进入场景时执行
 | ||||||
|  | 	virtual void onEnter() {} | ||||||
|  | 
 | ||||||
|  | 	// 离开场景时执行
 | ||||||
|  | 	virtual void onExit() {} | ||||||
|  | 
 | ||||||
| 	// 更新节点
 | 	// 更新节点
 | ||||||
| 	virtual void onUpdate() {} | 	virtual void onUpdate() {} | ||||||
| 
 | 
 | ||||||
|  | @ -33,11 +39,11 @@ public: | ||||||
| 		int nRelation			/* 碰撞关系,取值为 ERelation::VALUE 中的一种 */ | 		int nRelation			/* 碰撞关系,取值为 ERelation::VALUE 中的一种 */ | ||||||
| 	) {} | 	) {} | ||||||
| 
 | 
 | ||||||
| 	// 进入场景时执行
 | 	// 游戏暂停时的处理
 | ||||||
| 	virtual void onEnter() {} | 	virtual void onPause() {} | ||||||
| 
 | 
 | ||||||
| 	// 离开场景时执行
 | 	// 节点被销毁时的处理
 | ||||||
| 	virtual void onExit() {} | 	virtual void onDestroy() {} | ||||||
| 
 | 
 | ||||||
| 	// 获取节点显示状态
 | 	// 获取节点显示状态
 | ||||||
| 	virtual bool isVisiable() const; | 	virtual bool isVisiable() const; | ||||||
|  | @ -331,46 +337,48 @@ public: | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	// 更新节点
 | 	// 更新节点
 | ||||||
| 	virtual void _update(); | 	void _update( | ||||||
|  | 		bool bPaused | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
| 	// 渲染节点
 | 	// 渲染节点
 | ||||||
| 	virtual void _render(); | 	void _render(); | ||||||
| 
 | 
 | ||||||
| 	// 渲染几何图形
 | 	// 渲染图形
 | ||||||
| 	virtual void _drawShape(); | 	void _drawShape(); | ||||||
| 
 | 
 | ||||||
| 	// 节点被添加到场景时的执行程序
 | 	// 节点被添加到场景时的执行程序
 | ||||||
| 	virtual void _onEnter(); | 	void _onEnter(); | ||||||
| 
 | 
 | ||||||
| 	// 节点从场景中消失时的执行程序
 | 	// 节点从场景中消失时的执行程序
 | ||||||
| 	virtual void _onExit(); | 	void _onExit(); | ||||||
| 
 | 
 | ||||||
| 	// 设置节点所在场景
 | 	// 设置节点所在场景
 | ||||||
| 	virtual void _setParentScene( | 	void _setParentScene( | ||||||
| 		EScene * scene | 		EScene * scene | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 对自身进行二维矩阵变换
 | 	// 对自身进行二维矩阵变换
 | ||||||
| 	virtual void _updateTransform(); | 	void _updateTransform(); | ||||||
| 
 | 
 | ||||||
| 	// 更新所有子节点矩阵
 | 	// 更新所有子节点矩阵
 | ||||||
| 	virtual void _updateChildrenTransform(); | 	void _updateChildrenTransform(); | ||||||
| 
 | 
 | ||||||
| 	// 更新所有子节点透明度
 | 	// 更新所有子节点透明度
 | ||||||
| 	virtual void _updateChildrenOpacity(); | 	void _updateChildrenOpacity(); | ||||||
| 
 | 
 | ||||||
| 	// 更新节点矩阵
 | 	// 修改节点大小
 | ||||||
|  | 	void _setSize( | ||||||
|  | 		float width, | ||||||
|  | 		float height | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 更新节点二维矩阵
 | ||||||
| 	static void _updateTransform(ENode * node); | 	static void _updateTransform(ENode * node); | ||||||
| 
 | 
 | ||||||
| 	// 更新节点透明度
 | 	// 更新节点透明度
 | ||||||
| 	static void _updateOpacity(ENode * node); | 	static void _updateOpacity(ENode * node); | ||||||
| 
 | 
 | ||||||
| 	// 修改节点大小
 |  | ||||||
| 	virtual void _setSize( |  | ||||||
| 		float width, |  | ||||||
| 		float height |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| protected: | protected: | ||||||
| 	EString		m_sName; | 	EString		m_sName; | ||||||
| 	size_t		m_nHashName; | 	size_t		m_nHashName; | ||||||
|  | @ -624,13 +632,16 @@ public: | ||||||
| 	) override; | 	) override; | ||||||
| 
 | 
 | ||||||
| 	// 更新按钮状态
 | 	// 更新按钮状态
 | ||||||
| 	virtual void onUpdate(); | 	virtual void onUpdate() override; | ||||||
|  | 
 | ||||||
|  | 	// 更新游戏暂停时的按钮状态
 | ||||||
|  | 	virtual void onPause() override; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	enum STATUS { NORMAL, MOUSEOVER, SELECTED }; | 	enum BTN_STATE { NORMAL, MOUSEOVER, SELECTED }; | ||||||
| 
 | 
 | ||||||
| 	// 设置按钮状态
 | 	// 设置按钮状态
 | ||||||
| 	virtual void _setStatus(STATUS status); | 	virtual void _setState(BTN_STATE state); | ||||||
| 
 | 
 | ||||||
| 	// 刷新按钮显示
 | 	// 刷新按钮显示
 | ||||||
| 	virtual void _updateVisiable(); | 	virtual void _updateVisiable(); | ||||||
|  | @ -639,14 +650,14 @@ protected: | ||||||
| 	virtual void _runCallback(); | 	virtual void _runCallback(); | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	STATUS	m_eStatus; | 	ENode *			m_pNormal; | ||||||
| 	ENode * m_pNormal; | 	ENode *			m_pMouseover; | ||||||
| 	ENode * m_pMouseover; | 	ENode *			m_pSelected; | ||||||
| 	ENode * m_pSelected; | 	ENode *			m_pDisabled; | ||||||
| 	ENode * m_pDisabled; | 	bool			m_bEnable; | ||||||
| 	bool	m_bEnable; | 	bool			m_bIsSelected; | ||||||
| 	bool	m_bIsSelected; | 	BTN_STATE		m_eBtnState; | ||||||
| 	BtnClkCallback m_Callback; | 	BtnClkCallback	m_Callback; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -659,54 +670,53 @@ public: | ||||||
| 
 | 
 | ||||||
| 	// 创建开关按钮
 | 	// 创建开关按钮
 | ||||||
| 	EButtonToggle( | 	EButtonToggle( | ||||||
| 		ENode * toggleOnNormal, | 		ENode * onNormal, | ||||||
| 		ENode * toggleOffNormal, | 		ENode * offNormal, | ||||||
| 		const BtnClkCallback & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建开关按钮
 | 	// 创建开关按钮
 | ||||||
| 	EButtonToggle( | 	EButtonToggle( | ||||||
| 		ENode * toggleOnNormal, | 		ENode * onNormal, | ||||||
| 		ENode * toggleOffNormal, | 		ENode * offNormal, | ||||||
| 		ENode * toggleOnSelected, | 		ENode * onSelected, | ||||||
| 		ENode * toggleOffSelected, | 		ENode * offSelected, | ||||||
| 		const BtnClkCallback & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建开关按钮
 | 	// 创建开关按钮
 | ||||||
| 	EButtonToggle( | 	EButtonToggle( | ||||||
| 		ENode * toggleOnNormal, | 		ENode * onNormal, | ||||||
| 		ENode * toggleOffNormal, | 		ENode * offNormal, | ||||||
| 		ENode * toggleOnMouseOver, | 		ENode * onMouseOver, | ||||||
| 		ENode * toggleOffMouseOver, | 		ENode * offMouseOver, | ||||||
| 		ENode * toggleOnSelected, | 		ENode * onSelected, | ||||||
| 		ENode * toggleOffSelected, | 		ENode * offSelected, | ||||||
| 		const BtnClkCallback & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建开关按钮
 | 	// 创建开关按钮
 | ||||||
| 	EButtonToggle( | 	EButtonToggle( | ||||||
| 		ENode * toggleOnNormal, | 		ENode * onNormal, | ||||||
| 		ENode * toggleOffNormal, | 		ENode * offNormal, | ||||||
| 		ENode * toggleOnMouseOver, | 		ENode * onMouseOver, | ||||||
| 		ENode * toggleOffMouseOver, | 		ENode * offMouseOver, | ||||||
| 		ENode * toggleOnSelected, | 		ENode * onSelected, | ||||||
| 		ENode * toggleOffSelected, | 		ENode * offSelected, | ||||||
| 		ENode * toggleOnDisabled, | 		ENode * onDisabled, | ||||||
| 		ENode * toggleOffDisabled, | 		ENode * offDisabled, | ||||||
| 		const BtnClkCallback & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 切换开关状态,并执行回调函数
 | 	// 切换开关状态(执行回调函数)
 | ||||||
| 	void toggle(); | 	void toggle(); | ||||||
| 
 | 
 | ||||||
| 	// 获取开关状态
 | 	// 获取开关状态
 | ||||||
| 	bool isToggleOn() const; | 	bool getState() const; | ||||||
| 
 | 
 | ||||||
| 	// 打开或关闭开关
 | 	// 设置开关按钮的状态(打开或关闭)
 | ||||||
| 	// 仅设置按钮状态,不执行回调函数
 | 	void setState( | ||||||
| 	void setToggle( | 		bool bState | ||||||
| 		bool toggle |  | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置按钮打开状态下显示的按钮
 | 	// 设置按钮打开状态下显示的按钮
 | ||||||
|  | @ -749,9 +759,28 @@ public: | ||||||
| 		ENode * disabled | 		ENode * disabled | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | 	// 设置中心点的横向位置
 | ||||||
|  | 	// 默认为 0, 范围 [0, 1]
 | ||||||
|  | 	virtual void setPivotX( | ||||||
|  | 		float pivotX | ||||||
|  | 	) override; | ||||||
|  | 
 | ||||||
|  | 	// 设置中心点的纵向位置
 | ||||||
|  | 	// 默认为 0, 范围 [0, 1]
 | ||||||
|  | 	virtual void setPivotY( | ||||||
|  | 		float pivotY | ||||||
|  | 	) override; | ||||||
|  | 
 | ||||||
|  | 	// 设置中心点位置
 | ||||||
|  | 	// 默认为 (0, 0), 范围 [0, 1]
 | ||||||
|  | 	virtual void setPivot( | ||||||
|  | 		float pivotX, | ||||||
|  | 		float pivotY | ||||||
|  | 	) override; | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 	// 刷新按钮开关
 | 	// 刷新按钮开关
 | ||||||
| 	virtual void _updateToggle(); | 	virtual void _updateState(); | ||||||
| 
 | 
 | ||||||
| 	// 执行按钮回调函数
 | 	// 执行按钮回调函数
 | ||||||
| 	virtual void _runCallback() override; | 	virtual void _runCallback() override; | ||||||
|  | @ -765,7 +794,7 @@ protected: | ||||||
| 	ENode * m_pSelectedOff; | 	ENode * m_pSelectedOff; | ||||||
| 	ENode * m_pDisabledOn; | 	ENode * m_pDisabledOn; | ||||||
| 	ENode * m_pDisabledOff; | 	ENode * m_pDisabledOff; | ||||||
| 	bool	m_bToggle; | 	bool	m_bState; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue