update a lot of new features.
This commit is contained in:
		
							parent
							
								
									b71119548a
								
							
						
					
					
						commit
						c79ba16d29
					
				|  | @ -1,15 +1,13 @@ | ||||||
| #include "..\eactions.h" | #include "..\eactions.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::EAction::EAction() : | e2d::EAction::EAction()  | ||||||
| 	m_bRunning(false), | 	: m_bRunning(false) | ||||||
| 	m_bEnding(false), | 	, m_bEnding(false) | ||||||
| 	m_bInit(false), | 	, m_bInit(false) | ||||||
| 	m_pTarget(nullptr), | 	, m_pTarget(nullptr) | ||||||
| 	m_pParentScene(nullptr) | 	, m_pParentScene(nullptr) | ||||||
|  | 	, m_fLast(0) | ||||||
| { | { | ||||||
| 	// 默认动作 15ms 运行一次
 |  | ||||||
| 	setInterval(15); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EAction::~EAction() | e2d::EAction::~EAction() | ||||||
|  | @ -34,7 +32,7 @@ void e2d::EAction::start() | ||||||
| void e2d::EAction::resume() | void e2d::EAction::resume() | ||||||
| { | { | ||||||
| 	m_bRunning = true; | 	m_bRunning = true; | ||||||
| 	m_tLast = GetNow(); | 	m_fLast = ETime::getTotalTime(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EAction::pause() | void e2d::EAction::pause() | ||||||
|  | @ -47,22 +45,11 @@ void e2d::EAction::stop() | ||||||
| 	m_bEnding = true; | 	m_bEnding = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EAction::setInterval(LONGLONG milliSeconds) |  | ||||||
| { |  | ||||||
| 	// 设置动作的时间间隔
 |  | ||||||
| 	SetInterval(m_nAnimationInterval, milliSeconds); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EAction::setTarget(ENode * node) | void e2d::EAction::setTarget(ENode * node) | ||||||
| { | { | ||||||
| 	if (m_pTarget) | 	if (!m_pTarget && node) | ||||||
| 	{ | 	{ | ||||||
| 		// 动作只能有一个目标
 | 		// 动作只能有一个目标
 | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (node) |  | ||||||
| 	{ |  | ||||||
| 		m_pTarget = node; | 		m_pTarget = node; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -82,7 +69,7 @@ void e2d::EAction::_init() | ||||||
| { | { | ||||||
| 	m_bInit = true; | 	m_bInit = true; | ||||||
| 	// 记录当前时间
 | 	// 记录当前时间
 | ||||||
| 	m_tLast = GetNow(); | 	m_fLast = ETime::getTotalTime(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EAction::_update() | void e2d::EAction::_update() | ||||||
|  | @ -97,10 +84,10 @@ void e2d::EAction::_reset() | ||||||
| { | { | ||||||
| 	m_bInit = false; | 	m_bInit = false; | ||||||
| 	m_bEnding = false; | 	m_bEnding = false; | ||||||
| 	m_tLast = GetNow(); | 	m_fLast = ETime::getTotalTime(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EAction::_resetTime() | void e2d::EAction::_resetTime() | ||||||
| { | { | ||||||
| 	m_tLast = GetNow(); | 	m_fLast = ETime::getTotalTime(); | ||||||
| } | } | ||||||
|  | @ -1,14 +1,13 @@ | ||||||
| #include "..\eactions.h" | #include "..\eactions.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::EActionDelay::EActionDelay(float duration) | e2d::EActionDelay::EActionDelay(float duration) | ||||||
| { | { | ||||||
| 	setInterval(static_cast<LONGLONG>(duration * 1000)); | 	m_fDelayTime = max(duration, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EActionDelay * e2d::EActionDelay::clone() const | e2d::EActionDelay * e2d::EActionDelay::clone() const | ||||||
| { | { | ||||||
| 	return new EActionDelay(static_cast<float>(ToMilliseconds(m_nAnimationInterval.QuadPart)) / 1000.0f); | 	return new EActionDelay(m_fDelayTime); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionDelay::_init() | void e2d::EActionDelay::_init() | ||||||
|  | @ -20,7 +19,7 @@ void e2d::EActionDelay::_update() | ||||||
| { | { | ||||||
| 	EAction::_update(); | 	EAction::_update(); | ||||||
| 	// 判断时间间隔是否足够
 | 	// 判断时间间隔是否足够
 | ||||||
| 	if (IsIntervalFull(m_tLast, m_nAnimationInterval)) | 	if ((ETime::getTotalTime() - m_fLast) >= m_fDelayTime) | ||||||
| 	{ | 	{ | ||||||
| 		this->stop(); | 		this->stop(); | ||||||
| 	} | 	} | ||||||
|  | @ -0,0 +1,35 @@ | ||||||
|  | #include "..\eactions.h" | ||||||
|  | 
 | ||||||
|  | e2d::EActionGradual::EActionGradual(float duration) | ||||||
|  | 	: m_fRateOfProgress(0) | ||||||
|  | { | ||||||
|  | 	m_fDuration = max(duration, 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EActionGradual::_init() | ||||||
|  | { | ||||||
|  | 	EAction::_init(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EActionGradual::_update() | ||||||
|  | { | ||||||
|  | 	// 判断时间间隔是否足够
 | ||||||
|  | 	if (m_fDuration == 0) | ||||||
|  | 	{ | ||||||
|  | 		m_fRateOfProgress = 1; | ||||||
|  | 		this->stop(); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	// 计算动画进度
 | ||||||
|  | 	m_fRateOfProgress = min((ETime::getTotalTime() - m_fLast) / m_fDuration, 1); | ||||||
|  | 	// 判断动作是否结束
 | ||||||
|  | 	if (m_fRateOfProgress >= 1) | ||||||
|  | 	{ | ||||||
|  | 		this->stop(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EActionGradual::_reset() | ||||||
|  | { | ||||||
|  | 	EAction::_reset(); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,49 @@ | ||||||
|  | #include "..\eactions.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | e2d::EActionMoveBy::EActionMoveBy(float duration, EVector2 vector) : | ||||||
|  | 	EActionGradual(duration) | ||||||
|  | { | ||||||
|  | 	m_MoveVec = vector; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EActionMoveBy::_init() | ||||||
|  | { | ||||||
|  | 	EActionGradual::_init(); | ||||||
|  | 	if (m_pTarget) | ||||||
|  | 	{ | ||||||
|  | 		m_BeginPos = m_pTarget->getPos(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EActionMoveBy::_update() | ||||||
|  | { | ||||||
|  | 	EActionGradual::_update(); | ||||||
|  | 
 | ||||||
|  | 	if (m_pTarget == nullptr) | ||||||
|  | 	{ | ||||||
|  | 		this->stop(); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// ÒÆ¶¯½Úµã
 | ||||||
|  | 	m_pTarget->setPos( | ||||||
|  | 		m_BeginPos.x + m_MoveVec.x * m_fRateOfProgress, | ||||||
|  | 		m_BeginPos.y + m_MoveVec.y * m_fRateOfProgress | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EActionMoveBy::_reset() | ||||||
|  | { | ||||||
|  | 	EActionGradual::_reset(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EActionMoveBy * e2d::EActionMoveBy::clone() const | ||||||
|  | { | ||||||
|  | 	return new EActionMoveBy(m_fDuration, m_MoveVec); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EActionMoveBy * e2d::EActionMoveBy::reverse() const | ||||||
|  | { | ||||||
|  | 	return new EActionMoveBy(m_fDuration, EVector2(-m_MoveVec.x, -m_MoveVec.y)); | ||||||
|  | } | ||||||
|  | @ -1,14 +1,14 @@ | ||||||
| #include "..\eactions.h" | #include "..\eactions.h" | ||||||
| 
 | 
 | ||||||
| e2d::EActionMoveTo::EActionMoveTo(float duration, EPoint pos) : | e2d::EActionMoveTo::EActionMoveTo(float duration, EPoint pos) : | ||||||
| 	EActionMoveBy(duration, EVec()) | 	EActionMoveBy(duration, EVector2()) | ||||||
| { | { | ||||||
| 	m_EndPos = pos; | 	m_EndPos = pos; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EActionMoveTo * e2d::EActionMoveTo::clone() const | e2d::EActionMoveTo * e2d::EActionMoveTo::clone() const | ||||||
| { | { | ||||||
| 	return new EActionMoveTo(m_fTotalDuration / 1000, m_EndPos); | 	return new EActionMoveTo(m_fDuration, m_EndPos); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionMoveTo::_init() | void e2d::EActionMoveTo::_init() | ||||||
|  | @ -18,25 +18,15 @@ void e2d::EActionOpacityBy::_init() | ||||||
| 
 | 
 | ||||||
| void e2d::EActionOpacityBy::_update() | void e2d::EActionOpacityBy::_update() | ||||||
| { | { | ||||||
| 	EAction::_update(); | 	EActionGradual::_update(); | ||||||
| 
 | 
 | ||||||
| 	if (m_pTarget == nullptr) | 	if (m_pTarget == nullptr) | ||||||
| 	{ | 	{ | ||||||
| 		this->stop(); | 		this->stop(); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 	// 设置节点透明度
 | ||||||
| 	while (EActionGradual::_isDelayEnough()) | 	m_pTarget->setOpacity(m_nBeginVal + m_nVariation * m_fRateOfProgress); | ||||||
| 	{ |  | ||||||
| 		// 设置节点透明度
 |  | ||||||
| 		m_pTarget->setOpacity(m_nBeginVal + m_nVariation * m_fRateOfProgress); |  | ||||||
| 		// 判断动作是否结束
 |  | ||||||
| 		if (_isEnd()) |  | ||||||
| 		{ |  | ||||||
| 			this->stop(); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionOpacityBy::_reset() | void e2d::EActionOpacityBy::_reset() | ||||||
|  | @ -46,10 +36,10 @@ void e2d::EActionOpacityBy::_reset() | ||||||
| 
 | 
 | ||||||
| e2d::EActionOpacityBy * e2d::EActionOpacityBy::clone() const | e2d::EActionOpacityBy * e2d::EActionOpacityBy::clone() const | ||||||
| { | { | ||||||
| 	return new EActionOpacityBy(m_fTotalDuration / 1000, m_nVariation); | 	return new EActionOpacityBy(m_fDuration, m_nVariation); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EActionOpacityBy * e2d::EActionOpacityBy::reverse() const | e2d::EActionOpacityBy * e2d::EActionOpacityBy::reverse() const | ||||||
| { | { | ||||||
| 	return new EActionOpacityBy(m_fTotalDuration / 1000, -m_nVariation); | 	return new EActionOpacityBy(m_fDuration, -m_nVariation); | ||||||
| } | } | ||||||
|  | @ -9,7 +9,7 @@ e2d::EActionOpacityTo::EActionOpacityTo(float duration, float opacity) : | ||||||
| 
 | 
 | ||||||
| e2d::EActionOpacityTo * e2d::EActionOpacityTo::clone() const | e2d::EActionOpacityTo * e2d::EActionOpacityTo::clone() const | ||||||
| { | { | ||||||
| 	return new EActionOpacityTo(m_fTotalDuration / 1000, m_nEndVal); | 	return new EActionOpacityTo(m_fDuration, m_nEndVal); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionOpacityTo::_init() | void e2d::EActionOpacityTo::_init() | ||||||
|  | @ -18,7 +18,7 @@ void e2d::EActionRotateBy::_init() | ||||||
| 
 | 
 | ||||||
| void e2d::EActionRotateBy::_update() | void e2d::EActionRotateBy::_update() | ||||||
| { | { | ||||||
| 	EAction::_update(); | 	EActionGradual::_update(); | ||||||
| 
 | 
 | ||||||
| 	if (m_pTarget == nullptr) | 	if (m_pTarget == nullptr) | ||||||
| 	{ | 	{ | ||||||
|  | @ -26,17 +26,8 @@ void e2d::EActionRotateBy::_update() | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	while (EActionGradual::_isDelayEnough()) | 	// 旋转节点
 | ||||||
| 	{ | 	m_pTarget->setRotation(m_nBeginVal + m_nVariation * m_fRateOfProgress); | ||||||
| 		// 旋转节点
 |  | ||||||
| 		m_pTarget->setRotation(m_nBeginVal + m_nVariation * m_fRateOfProgress); |  | ||||||
| 		// 判断动作是否结束
 |  | ||||||
| 		if (_isEnd()) |  | ||||||
| 		{ |  | ||||||
| 			this->stop(); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionRotateBy::_reset() | void e2d::EActionRotateBy::_reset() | ||||||
|  | @ -46,10 +37,10 @@ void e2d::EActionRotateBy::_reset() | ||||||
| 
 | 
 | ||||||
| e2d::EActionRotateBy * e2d::EActionRotateBy::clone() const | e2d::EActionRotateBy * e2d::EActionRotateBy::clone() const | ||||||
| { | { | ||||||
| 	return new EActionRotateBy(m_fTotalDuration / 1000, m_nVariation); | 	return new EActionRotateBy(m_fDuration, m_nVariation); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EActionRotateBy * e2d::EActionRotateBy::reverse() const | e2d::EActionRotateBy * e2d::EActionRotateBy::reverse() const | ||||||
| { | { | ||||||
| 	return new EActionRotateBy(m_fTotalDuration / 1000, -m_nVariation); | 	return new EActionRotateBy(m_fDuration, -m_nVariation); | ||||||
| } | } | ||||||
|  | @ -9,7 +9,7 @@ e2d::EActionRotateTo::EActionRotateTo(float duration, float rotation) : | ||||||
| 
 | 
 | ||||||
| e2d::EActionRotateTo * e2d::EActionRotateTo::clone() const | e2d::EActionRotateTo * e2d::EActionRotateTo::clone() const | ||||||
| { | { | ||||||
| 	return new EActionRotateTo(m_fTotalDuration / 1000, m_nEndVal); | 	return new EActionRotateTo(m_fDuration, m_nEndVal); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionRotateTo::_init() | void e2d::EActionRotateTo::_init() | ||||||
|  | @ -27,7 +27,7 @@ void e2d::EActionScaleBy::_init() | ||||||
| 
 | 
 | ||||||
| void e2d::EActionScaleBy::_update() | void e2d::EActionScaleBy::_update() | ||||||
| { | { | ||||||
| 	EAction::_update(); | 	EActionGradual::_update(); | ||||||
| 
 | 
 | ||||||
| 	if (m_pTarget == nullptr) | 	if (m_pTarget == nullptr) | ||||||
| 	{ | 	{ | ||||||
|  | @ -35,19 +35,10 @@ void e2d::EActionScaleBy::_update() | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	while (EActionGradual::_isDelayEnough()) | 	// 缩放节点
 | ||||||
| 	{ | 	m_pTarget->setScale( | ||||||
| 		// 缩放节点
 | 		m_nBeginScaleX + m_nVariationX * m_fRateOfProgress,  | ||||||
| 		m_pTarget->setScale( | 		m_nBeginScaleX + m_nVariationX * m_fRateOfProgress); | ||||||
| 			m_nBeginScaleX + m_nVariationX * m_fRateOfProgress,  |  | ||||||
| 			m_nBeginScaleX + m_nVariationX * m_fRateOfProgress); |  | ||||||
| 		// 判断动作是否结束
 |  | ||||||
| 		if (_isEnd()) |  | ||||||
| 		{ |  | ||||||
| 			this->stop(); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionScaleBy::_reset() | void e2d::EActionScaleBy::_reset() | ||||||
|  | @ -57,10 +48,10 @@ void e2d::EActionScaleBy::_reset() | ||||||
| 
 | 
 | ||||||
| e2d::EActionScaleBy * e2d::EActionScaleBy::clone() const | e2d::EActionScaleBy * e2d::EActionScaleBy::clone() const | ||||||
| { | { | ||||||
| 	return new EActionScaleBy(m_fTotalDuration / 1000, m_nVariationX, m_nVariationY); | 	return new EActionScaleBy(m_fDuration, m_nVariationX, m_nVariationY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EActionScaleBy * e2d::EActionScaleBy::reverse() const | e2d::EActionScaleBy * e2d::EActionScaleBy::reverse() const | ||||||
| { | { | ||||||
| 	return new EActionScaleBy(m_fTotalDuration / 1000, -m_nVariationX, -m_nVariationY); | 	return new EActionScaleBy(m_fDuration, -m_nVariationX, -m_nVariationY); | ||||||
| } | } | ||||||
|  | @ -16,7 +16,7 @@ e2d::EActionScaleTo::EActionScaleTo(float duration, float scaleX, float scaleY) | ||||||
| 
 | 
 | ||||||
| e2d::EActionScaleTo * e2d::EActionScaleTo::clone() const | e2d::EActionScaleTo * e2d::EActionScaleTo::clone() const | ||||||
| { | { | ||||||
| 	return new EActionScaleTo(m_fTotalDuration / 1000, m_nEndScaleX, m_nEndScaleY); | 	return new EActionScaleTo(m_fDuration, m_nEndScaleX, m_nEndScaleY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionScaleTo::_init() | void e2d::EActionScaleTo::_init() | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| #include "..\eactions.h" | #include "..\eactions.h" | ||||||
| #include <stdarg.h> |  | ||||||
| 
 | 
 | ||||||
| e2d::EActionSequence::EActionSequence() : | e2d::EActionSequence::EActionSequence() : | ||||||
| 	m_nActionIndex(0) | 	m_nActionIndex(0) | ||||||
|  | @ -1,18 +1,14 @@ | ||||||
| #include "..\eactions.h" | #include "..\eactions.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| #include <typeinfo> |  | ||||||
| 
 | 
 | ||||||
| e2d::EAnimation::EAnimation() : | e2d::EAnimation::EAnimation()  | ||||||
| 	m_nFrameIndex(0) | 	: m_nFrameIndex(0) | ||||||
| { | { | ||||||
| 	// 帧动画默认 0.1s 刷新一次
 |  | ||||||
| 	setInterval(100); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EAnimation::EAnimation(LONGLONG frameDelay) : | e2d::EAnimation::EAnimation(float invertal) | ||||||
| 	m_nFrameIndex(0) | 	: m_nFrameIndex(0) | ||||||
|  | 	, m_fInterval(invertal) | ||||||
| { | { | ||||||
| 	setInterval(frameDelay); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EAnimation::~EAnimation() | e2d::EAnimation::~EAnimation() | ||||||
|  | @ -23,6 +19,11 @@ e2d::EAnimation::~EAnimation() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void e2d::EAnimation::setInterval(float interval) | ||||||
|  | { | ||||||
|  | 	m_fInterval = max(interval, 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void e2d::EAnimation::_init() | void e2d::EAnimation::_init() | ||||||
| { | { | ||||||
| 	EAction::_init(); | 	EAction::_init(); | ||||||
|  | @ -39,11 +40,11 @@ void e2d::EAnimation::_update() | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// 判断时间间隔是否足够
 | 	// 判断时间间隔是否足够
 | ||||||
| 	while (IsIntervalFull(m_tLast, m_nAnimationInterval)) | 	while ((ETime::getTotalTime() - m_fLast) >= m_fInterval) | ||||||
| 	{ | 	{ | ||||||
| 		// 重新记录时间
 | 		// 重新记录时间
 | ||||||
| 		m_tLast.QuadPart += m_nAnimationInterval.QuadPart; | 		m_fLast += m_fInterval; | ||||||
| 		// 加载精灵帧
 | 		// ¼ÓÔØ¹Ø¼üÖ¡
 | ||||||
| 		reinterpret_cast<ESprite*>(m_pTarget)->loadFrom(m_vFrames[m_nFrameIndex]); | 		reinterpret_cast<ESprite*>(m_pTarget)->loadFrom(m_vFrames[m_nFrameIndex]); | ||||||
| 		m_nFrameIndex++; | 		m_nFrameIndex++; | ||||||
| 		// 判断动作是否结束
 | 		// 判断动作是否结束
 | ||||||
|  | @ -61,7 +62,7 @@ void e2d::EAnimation::_reset() | ||||||
| 	m_nFrameIndex = 0; | 	m_nFrameIndex = 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EAnimation::addFrame(ESpriteFrame * frame) | void e2d::EAnimation::addKeyframe(EKeyframe * frame) | ||||||
| { | { | ||||||
| 	if (frame) | 	if (frame) | ||||||
| 	{ | 	{ | ||||||
|  | @ -72,10 +73,10 @@ void e2d::EAnimation::addFrame(ESpriteFrame * frame) | ||||||
| 
 | 
 | ||||||
| e2d::EAnimation * e2d::EAnimation::clone() const | e2d::EAnimation * e2d::EAnimation::clone() const | ||||||
| { | { | ||||||
| 	auto a = new EAnimation(ToMilliseconds(m_nAnimationInterval.QuadPart)); | 	auto a = new EAnimation(m_fInterval); | ||||||
| 	for (auto frame = m_vFrames.begin(); frame != m_vFrames.end(); frame++) | 	for (auto frame = m_vFrames.begin(); frame != m_vFrames.end(); frame++) | ||||||
| 	{ | 	{ | ||||||
| 		a->addFrame((*frame)); | 		a->addKeyframe((*frame)); | ||||||
| 	} | 	} | ||||||
| 	return a; | 	return a; | ||||||
| } | } | ||||||
|  | @ -1,47 +0,0 @@ | ||||||
| #include "..\eactions.h" |  | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 |  | ||||||
| e2d::EActionGradual::EActionGradual(float duration) |  | ||||||
| 	: m_fRateOfProgress(0) |  | ||||||
| 	, m_fDuration(0) |  | ||||||
| 	, m_fTotalDuration(duration * 1000) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EActionGradual::_isEnd() const |  | ||||||
| { |  | ||||||
| 	return m_fDuration >= m_fTotalDuration; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EActionGradual::_init() |  | ||||||
| { |  | ||||||
| 	EAction::_init(); |  | ||||||
| } |  | ||||||
| #include <iostream> |  | ||||||
| bool e2d::EActionGradual::_isDelayEnough() |  | ||||||
| { |  | ||||||
| 	// 判断时间间隔是否足够
 |  | ||||||
| 	if (m_fTotalDuration == 0) |  | ||||||
| 	{ |  | ||||||
| 		m_fRateOfProgress = 1; |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (IsIntervalFull(m_tLast, m_nAnimationInterval)) |  | ||||||
| 	{ |  | ||||||
| 		// 重新记录时间
 |  | ||||||
| 		m_tLast.QuadPart += m_nAnimationInterval.QuadPart; |  | ||||||
| 		m_fDuration += static_cast<float>(ToMilliseconds(m_nAnimationInterval.QuadPart)); |  | ||||||
| 		std::cout << ToMilliseconds(m_nAnimationInterval.QuadPart) << std::endl; |  | ||||||
| 		// 计算动画进度
 |  | ||||||
| 		m_fRateOfProgress = m_fDuration / m_fTotalDuration; |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EActionGradual::_reset() |  | ||||||
| { |  | ||||||
| 	EAction::_reset(); |  | ||||||
| 	m_fDuration = 0; |  | ||||||
| } |  | ||||||
|  | @ -1,58 +0,0 @@ | ||||||
| #include "..\eactions.h" |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| e2d::EActionMoveBy::EActionMoveBy(float duration, EVec vector) : |  | ||||||
| 	EActionGradual(duration) |  | ||||||
| { |  | ||||||
| 	m_MoveVec = vector; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EActionMoveBy::_init() |  | ||||||
| { |  | ||||||
| 	EActionGradual::_init(); |  | ||||||
| 	if (m_pTarget) |  | ||||||
| 	{ |  | ||||||
| 		m_BeginPos = m_pTarget->getPos(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EActionMoveBy::_update() |  | ||||||
| { |  | ||||||
| 	EAction::_update(); |  | ||||||
| 
 |  | ||||||
| 	if (m_pTarget == nullptr) |  | ||||||
| 	{ |  | ||||||
| 		this->stop(); |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	while (EActionGradual::_isDelayEnough()) |  | ||||||
| 	{ |  | ||||||
| 		// 移动节点
 |  | ||||||
| 		m_pTarget->setPos( |  | ||||||
| 			m_BeginPos.x + m_MoveVec.x * m_fRateOfProgress, |  | ||||||
| 			m_BeginPos.y + m_MoveVec.y * m_fRateOfProgress |  | ||||||
| 		); |  | ||||||
| 		// 判断动作是否结束
 |  | ||||||
| 		if (_isEnd()) |  | ||||||
| 		{ |  | ||||||
| 			this->stop(); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EActionMoveBy::_reset() |  | ||||||
| { |  | ||||||
| 	EActionGradual::_reset(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EActionMoveBy * e2d::EActionMoveBy::clone() const |  | ||||||
| { |  | ||||||
| 	return new EActionMoveBy(m_fTotalDuration / 1000, m_MoveVec); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EActionMoveBy * e2d::EActionMoveBy::reverse() const |  | ||||||
| { |  | ||||||
| 	return new EActionMoveBy(m_fTotalDuration / 1000, EVec(-m_MoveVec.x, -m_MoveVec.y)); |  | ||||||
| } |  | ||||||
|  | @ -1,784 +0,0 @@ | ||||||
| #include "..\ebase.h" |  | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| #include "..\emanagers.h" |  | ||||||
| #include "..\enodes.h" |  | ||||||
| #include "..\etransitions.h" |  | ||||||
| #include "..\etools.h" |  | ||||||
| #include <stack> |  | ||||||
| #include <imm.h> |  | ||||||
| #pragma comment (lib ,"imm32.lib") |  | ||||||
| #include <mmsystem.h> |  | ||||||
| #pragma comment(lib, "winmm.lib") |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 唯一实例指针
 |  | ||||||
| static e2d::EApp * s_pInstance = nullptr; |  | ||||||
| // 场景栈
 |  | ||||||
| static std::stack<e2d::EScene*> s_SceneStack; |  | ||||||
| // 游戏开始时间
 |  | ||||||
| static LARGE_INTEGER s_tStart; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| e2d::EApp::EApp() |  | ||||||
| 	: m_bEnd(false) |  | ||||||
| 	, m_bPaused(false) |  | ||||||
| 	, m_bManualPaused(false) |  | ||||||
| 	, m_bShowConsole(false) |  | ||||||
| 	, m_nAnimationInterval() |  | ||||||
| 	, m_ClearColor(EColor::BLACK) |  | ||||||
| 	, m_pTransition(nullptr) |  | ||||||
| 	, m_pCurrentScene(nullptr) |  | ||||||
| 	, m_pNextScene(nullptr) |  | ||||||
| { |  | ||||||
| 	CoInitialize(NULL); |  | ||||||
| 
 |  | ||||||
| 	// 获取时钟频率
 |  | ||||||
| 	LARGE_INTEGER tFreq; |  | ||||||
| 	QueryPerformanceFrequency(&tFreq); |  | ||||||
| 	// 默认帧率为 60
 |  | ||||||
| 	m_nAnimationInterval.QuadPart = static_cast<LONGLONG>(1.0 / 60 * tFreq.QuadPart); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EApp::~EApp() |  | ||||||
| { |  | ||||||
| 	SafeReleaseInterface(&GetSolidColorBrush()); |  | ||||||
| 	SafeReleaseInterface(&GetRenderTarget()); |  | ||||||
| 	SafeReleaseInterface(&GetFactory()); |  | ||||||
| 	SafeReleaseInterface(&GetImagingFactory()); |  | ||||||
| 	SafeReleaseInterface(&GetDirectWriteFactory()); |  | ||||||
| 	CoUninitialize(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EApp * e2d::EApp::getInstance() |  | ||||||
| { |  | ||||||
| 	if (!s_pInstance) |  | ||||||
| 	{ |  | ||||||
| 		s_pInstance = new EApp(); |  | ||||||
| 	} |  | ||||||
| 	return s_pInstance; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EApp::init(const EString &title, UINT32 width, UINT32 height, const EWindowStyle &wStyle /* = nullptr */) |  | ||||||
| { |  | ||||||
| 	EApp * pApp = EApp::getInstance(); |  | ||||||
| 	HRESULT hr; |  | ||||||
| 
 |  | ||||||
| 	// 保存窗口样式
 |  | ||||||
| 	pApp->m_WindowStyle = wStyle; |  | ||||||
| 	// 保存窗口名称
 |  | ||||||
| 	pApp->m_sTitle = title; |  | ||||||
| 
 |  | ||||||
| 	// 注册窗口类
 |  | ||||||
| 	WNDCLASSEX wcex = { sizeof(WNDCLASSEX) }; |  | ||||||
| 	wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; |  | ||||||
| 	wcex.lpfnWndProc = EApp::WndProc; |  | ||||||
| 	wcex.cbClsExtra = 0; |  | ||||||
| 	wcex.cbWndExtra = sizeof(LONG_PTR); |  | ||||||
| 	wcex.hInstance = HINST_THISCOMPONENT; |  | ||||||
| 	wcex.hbrBackground = (HBRUSH)(GetStockObject(BLACK_BRUSH)); |  | ||||||
| 	wcex.lpszMenuName = NULL; |  | ||||||
| 	wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION); |  | ||||||
| 	wcex.lpszClassName = L"Easy2DApp"; |  | ||||||
| 	// 设置窗口是否有关闭按钮
 |  | ||||||
| 	if (wStyle.m_bNoClose) |  | ||||||
| 	{ |  | ||||||
| 		wcex.style |= CS_NOCLOSE; |  | ||||||
| 	} |  | ||||||
| 	// 设置程序图标
 |  | ||||||
| 	if (wStyle.m_pIconID) |  | ||||||
| 	{ |  | ||||||
| 		wcex.hIcon = (HICON)::LoadImage( |  | ||||||
| 			GetModuleHandle(NULL),  |  | ||||||
| 			wStyle.m_pIconID,  |  | ||||||
| 			IMAGE_ICON,  |  | ||||||
| 			0,  |  | ||||||
| 			0,  |  | ||||||
| 			LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	RegisterClassEx(&wcex); |  | ||||||
| 
 |  | ||||||
| 	// 因为 CreateWindow 函数使用的是像素大小,获取系统的 DPI 以使它
 |  | ||||||
| 	// 适应窗口缩放
 |  | ||||||
| 	FLOAT dpiX, dpiY; |  | ||||||
| 
 |  | ||||||
| 	// 工厂将返回当前的系统 DPI,这个值也将用来创建窗口
 |  | ||||||
| 	GetFactory()->GetDesktopDpi(&dpiX, &dpiY); |  | ||||||
| 
 |  | ||||||
| 	width = static_cast<UINT>(ceil(width * dpiX / 96.f)); |  | ||||||
| 	height = static_cast<UINT>(ceil(height * dpiY / 96.f)); |  | ||||||
| 
 |  | ||||||
| 	// 获取屏幕分辨率
 |  | ||||||
| 	UINT screenWidth = static_cast<UINT>(GetSystemMetrics(SM_CXSCREEN)); |  | ||||||
| 	UINT screenHeight = static_cast<UINT>(GetSystemMetrics(SM_CYSCREEN)); |  | ||||||
| 	// 当输入的窗口大小比分辨率大时,给出警告
 |  | ||||||
| 	WARN_IF(screenWidth < width || screenHeight < height, "The window is larger than screen!"); |  | ||||||
| 	// 取最小值
 |  | ||||||
| 	width = min(width, screenWidth); |  | ||||||
| 	height = min(height, screenHeight); |  | ||||||
| 
 |  | ||||||
| 	// 创建窗口样式
 |  | ||||||
| 	DWORD dwStyle = WS_OVERLAPPED | WS_SYSMENU; |  | ||||||
| 	if (!wStyle.m_bNoMiniSize) |  | ||||||
| 	{ |  | ||||||
| 		dwStyle |= WS_MINIMIZEBOX; |  | ||||||
| 	} |  | ||||||
| 	// 创建窗口
 |  | ||||||
| 	GetHWnd() = CreateWindow( |  | ||||||
| 		L"Easy2DApp", |  | ||||||
| 		title, |  | ||||||
| 		dwStyle, |  | ||||||
| 		0, 0, width, height, |  | ||||||
| 		NULL, |  | ||||||
| 		NULL, |  | ||||||
| 		HINST_THISCOMPONENT, |  | ||||||
| 		NULL |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	hr = GetHWnd() ? S_OK : E_FAIL; |  | ||||||
| 
 |  | ||||||
| 	if (SUCCEEDED(hr)) |  | ||||||
| 	{ |  | ||||||
| 		// 禁用输入法
 |  | ||||||
| 		EApp::setKeyboardLayoutEnable(false); |  | ||||||
| 		// 重设客户区大小
 |  | ||||||
| 		EApp::setWindowSize(width, height); |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 		UnregisterClass(L"Easy2DApp", HINST_THISCOMPONENT); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (FAILED(hr)) |  | ||||||
| 	{ |  | ||||||
| 		MessageBox(nullptr, L"Initialize Failed!", L"Error", MB_OK); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return SUCCEEDED(hr); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int e2d::EApp::run() |  | ||||||
| { |  | ||||||
| 	if (GetHWnd() == nullptr) |  | ||||||
| 	{ |  | ||||||
| 		MessageBox(nullptr, L"Invalid window handle!", L"Error", MB_OK); |  | ||||||
| 		return -1; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	EApp * pApp = EApp::getInstance(); |  | ||||||
| 	// 进入第一个场景
 |  | ||||||
| 	pApp->_enterNextScene(); |  | ||||||
| 	// 关闭控制台
 |  | ||||||
| 	if (!pApp->m_bShowConsole) |  | ||||||
| 	{ |  | ||||||
| 		showConsole(false); |  | ||||||
| 	} |  | ||||||
| 	// 显示窗口
 |  | ||||||
| 	ShowWindow(GetHWnd(), SW_SHOWNORMAL); |  | ||||||
| 	UpdateWindow(GetHWnd()); |  | ||||||
| 	// 设置窗口置顶
 |  | ||||||
| 	if (pApp->m_WindowStyle.m_bTopMost) |  | ||||||
| 	{ |  | ||||||
| 		SetWindowPos(GetHWnd(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// 挂起时长
 |  | ||||||
| 	LONG nWait = 0L; |  | ||||||
| 	// 时间间隔
 |  | ||||||
| 	LONGLONG nInterval; |  | ||||||
| 	// 上一帧画面绘制时间
 |  | ||||||
| 	LARGE_INTEGER tLast; |  | ||||||
| 	// 时钟频率
 |  | ||||||
| 	LARGE_INTEGER tFreq; |  | ||||||
| 
 |  | ||||||
| 	// 修改时间精度
 |  | ||||||
| 	timeBeginPeriod(1); |  | ||||||
| 	// 获取时钟频率
 |  | ||||||
| 	QueryPerformanceFrequency(&tFreq); |  | ||||||
| 	// 刷新当前时间
 |  | ||||||
| 	QueryPerformanceCounter(&GetNow()); |  | ||||||
| 	// 记录开始时间
 |  | ||||||
| 	s_tStart = GetNow(); |  | ||||||
| 	tLast = GetNow(); |  | ||||||
| 	// 窗口消息
 |  | ||||||
| 	MSG msg; |  | ||||||
| 
 |  | ||||||
| 	while (!pApp->m_bEnd) |  | ||||||
| 	{ |  | ||||||
| 		// 处理窗口消息
 |  | ||||||
| 		while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) |  | ||||||
| 		{ |  | ||||||
| 			TranslateMessage(&msg); |  | ||||||
| 			DispatchMessage(&msg); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// 刷新当前时间
 |  | ||||||
| 		QueryPerformanceCounter(&GetNow()); |  | ||||||
| 		// 计算时间间隔
 |  | ||||||
| 		nInterval = GetNow().QuadPart - tLast.QuadPart; |  | ||||||
| 		// 判断间隔时间是否足够
 |  | ||||||
| 		if (nInterval >= pApp->m_nAnimationInterval.QuadPart) |  | ||||||
| 		{ |  | ||||||
| 			// 记录当前时间
 |  | ||||||
| 			tLast.QuadPart += pApp->m_nAnimationInterval.QuadPart; |  | ||||||
| 			// 更新游戏内容
 |  | ||||||
| 			pApp->_update(); |  | ||||||
| 			// 刷新游戏画面
 |  | ||||||
| 			pApp->_render(); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			// 计算挂起时长
 |  | ||||||
| 			nWait = static_cast<LONG>(ToMilliseconds(pApp->m_nAnimationInterval.QuadPart - nInterval) - 1LL); |  | ||||||
| 			// 挂起线程,释放 CPU 占用
 |  | ||||||
| 			if (nWait > 1L) |  | ||||||
| 			{ |  | ||||||
| 				Sleep(nWait); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// 关闭控制台
 |  | ||||||
| 	EApp::showConsole(false); |  | ||||||
| 	// 重置时间精度
 |  | ||||||
| 	timeEndPeriod(1); |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::pause() |  | ||||||
| { |  | ||||||
| 	EApp::getInstance()->m_bManualPaused = true; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::resume() |  | ||||||
| { |  | ||||||
| 	if (isPaused()) |  | ||||||
| 	{ |  | ||||||
| 		EApp::getInstance()->m_bPaused = false; |  | ||||||
| 		EApp::getInstance()->m_bManualPaused = false; |  | ||||||
| 		EApp::getInstance()->_updateTime(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EApp::isPaused() |  | ||||||
| { |  | ||||||
| 	return s_pInstance->m_bPaused || s_pInstance->m_bManualPaused; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::quit() |  | ||||||
| { |  | ||||||
| 	getInstance()->m_bEnd = true;	// 这个变量将控制游戏是否结束
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::showConsole(bool show /* = true */) |  | ||||||
| { |  | ||||||
| 	static FILE * stdoutstream = nullptr; |  | ||||||
| 	static FILE * stdinstream = nullptr; |  | ||||||
| 	static FILE * stderrstream = nullptr; |  | ||||||
| 
 |  | ||||||
| 	EApp::getInstance()->m_bShowConsole = show; |  | ||||||
| 	// 查找已存在的控制台句柄
 |  | ||||||
| 	HWND hwnd = GetConsoleWindow(); |  | ||||||
| 	// 关闭控制台
 |  | ||||||
| 	if (show) |  | ||||||
| 	{ |  | ||||||
| 		if (hwnd) |  | ||||||
| 		{ |  | ||||||
| 			ShowWindow(hwnd, SW_SHOWNORMAL); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			// 显示一个新控制台
 |  | ||||||
| 			if (AllocConsole()) |  | ||||||
| 			{ |  | ||||||
| 				freopen_s(&stdoutstream, "CONOUT$", "w+t", stdout); |  | ||||||
| 				freopen_s(&stderrstream, "CONOUT$", "w+t", stderr); |  | ||||||
| 				freopen_s(&stdinstream, "CONIN$", "r+t", stdin); |  | ||||||
| 			} |  | ||||||
| 			else |  | ||||||
| 			{ |  | ||||||
| 				MessageBox(nullptr, L"Alloc Console Failed!", L"Error", MB_OK); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 		if (hwnd) |  | ||||||
| 		{ |  | ||||||
| 			if (stdoutstream) |  | ||||||
| 			{ |  | ||||||
| 				fclose(stdoutstream); |  | ||||||
| 				fclose(stdinstream); |  | ||||||
| 				fclose(stderrstream); |  | ||||||
| 
 |  | ||||||
| 				stdoutstream = stdinstream = stderrstream = nullptr; |  | ||||||
| 			} |  | ||||||
| 			FreeConsole(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EApp::onActivate() |  | ||||||
| { |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EApp::onInactive() |  | ||||||
| { |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EApp::onCloseWindow() |  | ||||||
| { |  | ||||||
| 	return true; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::_update() |  | ||||||
| { |  | ||||||
| 	if (isPaused()) |  | ||||||
| 	{ |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// 正在切换场景时,执行场景切换动画
 |  | ||||||
| 	if (m_pTransition) |  | ||||||
| 	{ |  | ||||||
| 		m_pTransition->_update(); |  | ||||||
| 		if (m_pTransition->isEnding()) |  | ||||||
| 		{ |  | ||||||
| 			m_pTransition->release(); |  | ||||||
| 			m_pTransition = nullptr; |  | ||||||
| 			// 进入下一场景
 |  | ||||||
| 			_enterNextScene(); |  | ||||||
| 			// 刷新计时器
 |  | ||||||
| 			_updateTime(); |  | ||||||
| 		} |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// 下一场景指针不为空时,切换场景
 |  | ||||||
| 	if (m_pNextScene) |  | ||||||
| 	{ |  | ||||||
| 		// 进入下一场景
 |  | ||||||
| 		_enterNextScene(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// 断言当前场景非空
 |  | ||||||
| 	ASSERT(m_pCurrentScene != nullptr, "Current scene NULL pointer exception."); |  | ||||||
| 
 |  | ||||||
| 	EObjectManager::__flush();		// 刷新内存池
 |  | ||||||
| 	ETimerManager::TimerProc();		// 定时器管理器执行程序
 |  | ||||||
| 	EActionManager::ActionProc();	// 动作管理器执行程序
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::_render() |  | ||||||
| { |  | ||||||
| 	HRESULT hr = S_OK; |  | ||||||
| 
 |  | ||||||
| 	// 开始绘图
 |  | ||||||
| 	GetRenderTarget()->BeginDraw(); |  | ||||||
| 	// 使用背景色清空屏幕
 |  | ||||||
| 	GetRenderTarget()->Clear(D2D1::ColorF(m_ClearColor)); |  | ||||||
| 	// 绘制当前场景
 |  | ||||||
| 	if (m_pCurrentScene) |  | ||||||
| 	{ |  | ||||||
| 		m_pCurrentScene->_render(); |  | ||||||
| 	} |  | ||||||
| 	// 切换场景时,同时绘制两场景
 |  | ||||||
| 	if (m_pTransition && m_pNextScene) |  | ||||||
| 	{ |  | ||||||
| 		m_pNextScene->_render(); |  | ||||||
| 	} |  | ||||||
| 	// 终止绘图
 |  | ||||||
| 	hr = GetRenderTarget()->EndDraw(); |  | ||||||
| 
 |  | ||||||
| 	if (hr == D2DERR_RECREATE_TARGET) |  | ||||||
| 	{ |  | ||||||
| 		// 如果 Direct3D 设备在执行过程中消失,将丢弃当前的设备相关资源
 |  | ||||||
| 		// 并在下一次调用时重建资源
 |  | ||||||
| 		hr = S_OK; |  | ||||||
| 		SafeReleaseInterface(&GetRenderTarget()); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (FAILED(hr)) |  | ||||||
| 	{ |  | ||||||
| 		// 渲染时产生了未知的错误,退出游戏
 |  | ||||||
| 		MessageBox(GetHWnd(), L"Game rendering failed!", L"Error", MB_OK); |  | ||||||
| 		this->quit(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::setWindowSize(UINT32 width, UINT32 height) |  | ||||||
| { |  | ||||||
| 	// 获取屏幕分辨率
 |  | ||||||
| 	int screenWidth = GetSystemMetrics(SM_CXSCREEN); |  | ||||||
| 	int screenHeight = GetSystemMetrics(SM_CYSCREEN); |  | ||||||
| 	// 获取窗口大小(包含菜单栏)
 |  | ||||||
| 	tagRECT rcWindow; |  | ||||||
| 	GetWindowRect(GetHWnd(), &rcWindow); |  | ||||||
| 	// 获取客户区大小
 |  | ||||||
| 	tagRECT rcClient; |  | ||||||
| 	GetClientRect(GetHWnd(), &rcClient); |  | ||||||
| 	// 计算边框大小
 |  | ||||||
| 	width += (rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left); |  | ||||||
| 	height += (rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top); |  | ||||||
| 	// 修改窗口大小,并设置窗口在屏幕居中
 |  | ||||||
| 	MoveWindow(GetHWnd(), (screenWidth - width) / 2, (screenHeight - height) / 2, width, height, TRUE); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::setWindowTitle(const EString &title) |  | ||||||
| { |  | ||||||
| 	// 设置窗口标题
 |  | ||||||
| 	SetWindowText(GetHWnd(), title); |  | ||||||
| 	// 保存当前标题,用于修改窗口大小时恢复标题
 |  | ||||||
| 	getInstance()->m_sTitle = title; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EString e2d::EApp::getTitle() |  | ||||||
| { |  | ||||||
| 	return getInstance()->m_sTitle; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| float e2d::EApp::getWidth() |  | ||||||
| { |  | ||||||
| 	return GetRenderTarget()->GetSize().width; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| float e2d::EApp::getHeight() |  | ||||||
| { |  | ||||||
| 	return GetRenderTarget()->GetSize().height; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESize e2d::EApp::getSize() |  | ||||||
| { |  | ||||||
| 	return ESize(GetRenderTarget()->GetSize().width, GetRenderTarget()->GetSize().height); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::enterScene(EScene * scene, ETransition * transition /* = nullptr */, bool saveCurrentScene /* = true */) |  | ||||||
| { |  | ||||||
| 	ASSERT(scene != nullptr, "Next scene NULL pointer exception!"); |  | ||||||
| 	scene->retain(); |  | ||||||
| 	// 保存下一场景的指针
 |  | ||||||
| 	getInstance()->m_pNextScene = scene; |  | ||||||
| 	// 切换场景时,是否保存当前场景
 |  | ||||||
| 	if (getInstance()->m_pCurrentScene) |  | ||||||
| 	{ |  | ||||||
| 		getInstance()->m_pCurrentScene->m_bWillSave = saveCurrentScene; |  | ||||||
| 	} |  | ||||||
| 	// 设置切换场景动画
 |  | ||||||
| 	if (transition) |  | ||||||
| 	{ |  | ||||||
| 		getInstance()->m_pTransition = transition; |  | ||||||
| 		transition->retain(); |  | ||||||
| 		transition->_setTarget( |  | ||||||
| 			getInstance()->m_pCurrentScene,  |  | ||||||
| 			getInstance()->m_pNextScene |  | ||||||
| 		); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::backScene(ETransition * transition /* = nullptr */) |  | ||||||
| { |  | ||||||
| 	// 栈为空时,调用返回场景函数失败
 |  | ||||||
| 	WARN_IF(s_SceneStack.size() == 0, "Scene stack now is empty!"); |  | ||||||
| 	if (s_SceneStack.size() == 0) return; |  | ||||||
| 
 |  | ||||||
| 	// 从栈顶取出场景指针,作为下一场景
 |  | ||||||
| 	getInstance()->m_pNextScene = s_SceneStack.top(); |  | ||||||
| 	s_SceneStack.pop(); |  | ||||||
| 
 |  | ||||||
| 	// 返回上一场景时,不保存当前场景
 |  | ||||||
| 	if (getInstance()->m_pCurrentScene) |  | ||||||
| 	{ |  | ||||||
| 		getInstance()->m_pCurrentScene->m_bWillSave = false; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// 设置切换场景动画
 |  | ||||||
| 	if (transition) |  | ||||||
| 	{ |  | ||||||
| 		getInstance()->m_pTransition = transition; |  | ||||||
| 		transition->retain(); |  | ||||||
| 		transition->_setTarget( |  | ||||||
| 			getInstance()->m_pCurrentScene,  |  | ||||||
| 			getInstance()->m_pNextScene |  | ||||||
| 		); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::clearScene() |  | ||||||
| { |  | ||||||
| 	// 清空场景栈
 |  | ||||||
| 	while (s_SceneStack.size()) |  | ||||||
| 	{ |  | ||||||
| 		auto temp = s_SceneStack.top(); |  | ||||||
| 		SafeRelease(&temp); |  | ||||||
| 		s_SceneStack.pop(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::setFPS(UINT32 fps) |  | ||||||
| { |  | ||||||
| 	fps = min(max(fps, 30), 120); |  | ||||||
| 
 |  | ||||||
| 	// 获取时钟频率
 |  | ||||||
| 	LARGE_INTEGER tFreq; |  | ||||||
| 	QueryPerformanceFrequency(&tFreq); |  | ||||||
| 	EApp::getInstance()->m_nAnimationInterval.QuadPart = static_cast<LONGLONG>(1.0 / fps * tFreq.QuadPart); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EScene * e2d::EApp::getCurrentScene() |  | ||||||
| { |  | ||||||
| 	return getInstance()->m_pCurrentScene; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::setAppName(const EString &appname) |  | ||||||
| { |  | ||||||
| 	getInstance()->m_sAppName = appname; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EString e2d::EApp::getAppName() |  | ||||||
| { |  | ||||||
| 	if (getInstance()->m_sAppName.isEmpty()) |  | ||||||
| 		getInstance()->m_sAppName = getInstance()->m_sTitle; |  | ||||||
| 	return getInstance()->m_sAppName; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::setBkColor(UINT32 color) |  | ||||||
| { |  | ||||||
| 	getInstance()->m_ClearColor = color; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::setKeyboardLayoutEnable(bool value) |  | ||||||
| { |  | ||||||
| 	static HIMC hImc = NULL; |  | ||||||
| 
 |  | ||||||
| 	if (value) |  | ||||||
| 	{ |  | ||||||
| 		if (hImc != NULL) |  | ||||||
| 		{ |  | ||||||
| 			ImmAssociateContext(GetHWnd(), hImc); |  | ||||||
| 			hImc = NULL; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 		if (hImc == NULL) |  | ||||||
| 		{ |  | ||||||
| 			hImc = ImmAssociateContext(GetHWnd(), NULL); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| HWND e2d::EApp::getHWnd() |  | ||||||
| { |  | ||||||
| 	return GetHWnd(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EWindowStyle e2d::EApp::getWindowStyle() |  | ||||||
| { |  | ||||||
| 	return getInstance()->m_WindowStyle; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| LONGLONG e2d::EApp::getTotalDurationFromStart() |  | ||||||
| { |  | ||||||
| 	return (s_tStart.QuadPart - GetNow().QuadPart) * 1000LL / GetFreq().QuadPart; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::hideWindow() |  | ||||||
| { |  | ||||||
| 	ShowWindow(GetHWnd(), SW_HIDE); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::showWindow() |  | ||||||
| { |  | ||||||
| 	ShowWindow(GetHWnd(), SW_SHOWNORMAL); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::_enterNextScene() |  | ||||||
| { |  | ||||||
| 	if (m_pNextScene == nullptr) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	// 执行当前场景的 onCloseWindow 函数
 |  | ||||||
| 	if (m_pCurrentScene) |  | ||||||
| 	{ |  | ||||||
| 		m_pCurrentScene->onExit(); |  | ||||||
| 
 |  | ||||||
| 		if (m_pCurrentScene->m_bWillSave) |  | ||||||
| 		{ |  | ||||||
| 			// 若要保存当前场景,把它放入栈中
 |  | ||||||
| 			s_SceneStack.push(m_pCurrentScene); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			SafeRelease(&m_pCurrentScene); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// 执行下一场景的 onEnter 函数
 |  | ||||||
| 	m_pNextScene->onEnter(); |  | ||||||
| 
 |  | ||||||
| 	m_pCurrentScene = m_pNextScene;		// 切换场景
 |  | ||||||
| 	m_pNextScene = nullptr;				// 下一场景置空
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EApp::_updateTime() |  | ||||||
| { |  | ||||||
| 	// 刷新当前时间
 |  | ||||||
| 	QueryPerformanceCounter(&GetNow()); |  | ||||||
| 	// 重置动画和定时器
 |  | ||||||
| 	EActionManager::_resetAllActions(); |  | ||||||
| 	ETimerManager::_resetAllTimers(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) |  | ||||||
| { |  | ||||||
| 	if (s_pInstance == nullptr) |  | ||||||
| 	{ |  | ||||||
| 		return DefWindowProc(hWnd, message, wParam, lParam); |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 		LRESULT result = 0; |  | ||||||
| 
 |  | ||||||
| 		switch (message) |  | ||||||
| 		{ |  | ||||||
| 		// 处理鼠标消息
 |  | ||||||
| 		case WM_LBUTTONUP: |  | ||||||
| 		case WM_LBUTTONDOWN: |  | ||||||
| 		case WM_LBUTTONDBLCLK: |  | ||||||
| 		case WM_MBUTTONUP: |  | ||||||
| 		case WM_MBUTTONDOWN: |  | ||||||
| 		case WM_MBUTTONDBLCLK: |  | ||||||
| 		case WM_RBUTTONUP: |  | ||||||
| 		case WM_RBUTTONDOWN: |  | ||||||
| 		case WM_RBUTTONDBLCLK: |  | ||||||
| 		case WM_MOUSEMOVE: |  | ||||||
| 		case WM_MOUSEWHEEL: |  | ||||||
| 		{ |  | ||||||
| 			// 执行场景切换时屏蔽按键和鼠标消息
 |  | ||||||
| 			if (!s_pInstance->m_pTransition && !s_pInstance->m_pNextScene) |  | ||||||
| 			{ |  | ||||||
| 				EMsgManager::MouseProc(message, wParam, lParam); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		result = 0; |  | ||||||
| 		break; |  | ||||||
| 
 |  | ||||||
| 		// 处理按键消息
 |  | ||||||
| 		case WM_KEYDOWN: |  | ||||||
| 		case WM_KEYUP: |  | ||||||
| 		{ |  | ||||||
| 			// 执行场景切换时屏蔽按键和鼠标消息
 |  | ||||||
| 			if (!s_pInstance->m_pTransition && !s_pInstance->m_pNextScene) |  | ||||||
| 			{ |  | ||||||
| 				EMsgManager::KeyboardProc(message, wParam, lParam); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		result = 0; |  | ||||||
| 		break; |  | ||||||
| 
 |  | ||||||
| 		// 处理窗口大小变化消息
 |  | ||||||
| 		case WM_SIZE: |  | ||||||
| 		{ |  | ||||||
| 			UINT width = LOWORD(lParam); |  | ||||||
| 			UINT height = HIWORD(lParam); |  | ||||||
| 			// 如果程序接收到一个 WM_SIZE 消息,这个方法将调整渲染
 |  | ||||||
| 			// 目标适当。它可能会调用失败,但是这里可以忽略有可能的
 |  | ||||||
| 			// 错误,因为这个错误将在下一次调用 EndDraw 时产生
 |  | ||||||
| 			GetRenderTarget()->Resize(D2D1::SizeU(width, height)); |  | ||||||
| 		} |  | ||||||
| 		break; |  | ||||||
| 
 |  | ||||||
| 		// 处理分辨率变化消息
 |  | ||||||
| 		case WM_DISPLAYCHANGE: |  | ||||||
| 		{ |  | ||||||
| 			// 重绘客户区
 |  | ||||||
| 			InvalidateRect(hWnd, NULL, FALSE); |  | ||||||
| 		} |  | ||||||
| 		result = 0; |  | ||||||
| 		break; |  | ||||||
| 
 |  | ||||||
| 		// 重绘窗口
 |  | ||||||
| 		case WM_PAINT: |  | ||||||
| 		{ |  | ||||||
| 			s_pInstance->_render(); |  | ||||||
| 			ValidateRect(hWnd, NULL); |  | ||||||
| 		} |  | ||||||
| 		result = 0; |  | ||||||
| 		break; |  | ||||||
| 
 |  | ||||||
| 		// 窗口激活消息
 |  | ||||||
| 		case WM_ACTIVATE: |  | ||||||
| 		{ |  | ||||||
| 			EScene * pCurrentScene = s_pInstance->getCurrentScene(); |  | ||||||
| 
 |  | ||||||
| 			if (LOWORD(wParam) == WA_INACTIVE) |  | ||||||
| 			{ |  | ||||||
| 				if (pCurrentScene && |  | ||||||
| 					pCurrentScene->onInactive() && |  | ||||||
| 					s_pInstance->onInactive()) |  | ||||||
| 				{ |  | ||||||
| 					s_pInstance->m_bPaused = true; |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			else if (s_pInstance->m_bPaused) |  | ||||||
| 			{ |  | ||||||
| 				if (pCurrentScene && |  | ||||||
| 					pCurrentScene->onActivate() && |  | ||||||
| 					s_pInstance->onActivate()) |  | ||||||
| 				{ |  | ||||||
| 					s_pInstance->m_bPaused = false; |  | ||||||
| 					if (!s_pInstance->m_bManualPaused) |  | ||||||
| 					{ |  | ||||||
| 						s_pInstance->_updateTime(); |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		result = 1; |  | ||||||
| 		break; |  | ||||||
| 
 |  | ||||||
| 		// 窗口关闭消息
 |  | ||||||
| 		case WM_CLOSE: |  | ||||||
| 		{ |  | ||||||
| 			EScene * pCurrentScene = s_pInstance->getCurrentScene(); |  | ||||||
| 
 |  | ||||||
| 			if (pCurrentScene) |  | ||||||
| 			{ |  | ||||||
| 				if (pCurrentScene->onCloseWindow() &&  |  | ||||||
| 					s_pInstance->onCloseWindow()) |  | ||||||
| 				{ |  | ||||||
| 					DestroyWindow(hWnd); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			else  |  | ||||||
| 			{ |  | ||||||
| 				if (s_pInstance->onCloseWindow()) |  | ||||||
| 				{ |  | ||||||
| 					DestroyWindow(hWnd); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		result = 1; |  | ||||||
| 		break; |  | ||||||
| 
 |  | ||||||
| 		// 窗口被销毁
 |  | ||||||
| 		case WM_DESTROY: |  | ||||||
| 		{ |  | ||||||
| 			// 退出程序
 |  | ||||||
| 			s_pInstance->quit(); |  | ||||||
| 			// 发送退出消息
 |  | ||||||
| 			PostQuitMessage(0); |  | ||||||
| 		} |  | ||||||
| 		result = 1; |  | ||||||
| 		break; |  | ||||||
| 
 |  | ||||||
| 		default: |  | ||||||
| 			result = DefWindowProc(hWnd, message, wParam, lParam); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		return result; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -0,0 +1,166 @@ | ||||||
|  | #include "..\ebase.h" | ||||||
|  | #include "..\emanagers.h" | ||||||
|  | #include "..\enodes.h" | ||||||
|  | #include "..\etransitions.h" | ||||||
|  | #include "..\etools.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // 控制游戏终止
 | ||||||
|  | static bool s_bEndGame = false; | ||||||
|  | // 控制游戏暂停
 | ||||||
|  | static bool s_bPaused = false; | ||||||
|  | // 是否进行过初始化
 | ||||||
|  | static bool s_bInitialized = false; | ||||||
|  | // AppName
 | ||||||
|  | static e2d::EString s_sAppName; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | bool e2d::EGame::init(LPCTSTR sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR pIconID, bool bNoClose, bool bNoMiniSize, bool bTopMost) | ||||||
|  | { | ||||||
|  | 	if (s_bInitialized) | ||||||
|  | 	{ | ||||||
|  | 		WARN_IF(true, "The game has been initialized!"); | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 初始化 COM 组件
 | ||||||
|  | 	if (SUCCEEDED(CoInitialize(NULL))) | ||||||
|  | 	{ | ||||||
|  | 		// 创建设备无关资源
 | ||||||
|  | 		if (ERenderer::__createDeviceIndependentResources()) | ||||||
|  | 		{ | ||||||
|  | 			// 初始化窗口
 | ||||||
|  | 			if (EWindow::__init(sTitle, nWidth, nHeight, pIconID, bNoClose, bNoMiniSize, bTopMost)) | ||||||
|  | 			{ | ||||||
|  | 				// 创建设备相关资源
 | ||||||
|  | 				if (ERenderer::__createDeviceResources()) | ||||||
|  | 				{ | ||||||
|  | 					// 重设 Client 大小
 | ||||||
|  | 					EWindow::setSize(nWidth, nHeight); | ||||||
|  | 					// 设置默认 AppName
 | ||||||
|  | 					if (s_sAppName.isEmpty()) | ||||||
|  | 						s_sAppName = EWindow::getTitle(); | ||||||
|  | 					// 标志初始化成功
 | ||||||
|  | 					s_bInitialized = true; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return s_bInitialized; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int e2d::EGame::run() | ||||||
|  | { | ||||||
|  | 	if (!s_bInitialized) | ||||||
|  | 	{ | ||||||
|  | 		ASSERT(false, "You must initialize EGame first!"); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 初始化 DirectInput
 | ||||||
|  | 	EInput::__init(); | ||||||
|  | 	// 初始化计时操作
 | ||||||
|  | 	ETime::__init(); | ||||||
|  | 	// 进入第一个场景
 | ||||||
|  | 	ESceneManager::__enterNextScene(); | ||||||
|  | 	// 显示窗口
 | ||||||
|  | 	EWindow::showWindow(); | ||||||
|  | 	// 刷新窗口内容
 | ||||||
|  | 	::UpdateWindow(EWindow::getHWnd()); | ||||||
|  | 	// 处理窗口消息
 | ||||||
|  | 	EWindow::__poll(); | ||||||
|  | 	// 刷新时间信息
 | ||||||
|  | 	ETime::__updateNow(); | ||||||
|  | 	ETime::__updateLast(); | ||||||
|  | 
 | ||||||
|  | 	// 挂起时长
 | ||||||
|  | 	int nWaitMS = 0; | ||||||
|  | 
 | ||||||
|  | 	while (!s_bEndGame) | ||||||
|  | 	{ | ||||||
|  | 		// 处理窗口消息
 | ||||||
|  | 		EWindow::__poll(); | ||||||
|  | 		// 刷新时间信息
 | ||||||
|  | 		ETime::__updateNow(); | ||||||
|  | 
 | ||||||
|  | 		// 判断是否达到了刷新状态
 | ||||||
|  | 		if (ETime::getDeltaTime() >= 17) | ||||||
|  | 		{ | ||||||
|  | 			ETime::__updateLast(); | ||||||
|  | 			EGame::__update(); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			// 挂起线程
 | ||||||
|  | 			ETime::__sleep(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EGame::pause() | ||||||
|  | { | ||||||
|  | 	s_bPaused = true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EGame::resume() | ||||||
|  | { | ||||||
|  | 	if (isPaused()) | ||||||
|  | 	{ | ||||||
|  | 		s_bPaused = false; | ||||||
|  | 		// 刷新当前时间
 | ||||||
|  | 		ETime::__updateLast(); | ||||||
|  | 		// 重置动画和定时器
 | ||||||
|  | 		EActionManager::__resetAllActions(); | ||||||
|  | 		ETimerManager::__resetAllTimers(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool e2d::EGame::isPaused() | ||||||
|  | { | ||||||
|  | 	return s_bPaused; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EGame::quit() | ||||||
|  | { | ||||||
|  | 	s_bEndGame = true;	// 这个变量将控制游戏是否结束
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EGame::uninit() | ||||||
|  | { | ||||||
|  | 	// 重置窗口属性
 | ||||||
|  | 	EWindow::__uninit(); | ||||||
|  | 	// 关闭输入
 | ||||||
|  | 	EInput::__uninit(); | ||||||
|  | 	// 恢复计时操作
 | ||||||
|  | 	ETime::__uninit(); | ||||||
|  | 	// 删除渲染相关资源
 | ||||||
|  | 	ERenderer::__discardResources(); | ||||||
|  | 
 | ||||||
|  | 	CoUninitialize(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EGame::__update() | ||||||
|  | { | ||||||
|  | 	EInput::__updateDeviceState();		// 获取用户输入
 | ||||||
|  | 
 | ||||||
|  | 	if (!s_bPaused) | ||||||
|  | 	{ | ||||||
|  | 		ETimerManager::__update();		// 定时器管理器执行程序
 | ||||||
|  | 		EActionManager::__update();		// 动作管理器执行程序
 | ||||||
|  | 		ESceneManager::__update();		// 更新游戏内容
 | ||||||
|  | 		ERenderer::__render();			// 渲染游戏画面
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EGame::setAppName(const EString &appname) | ||||||
|  | { | ||||||
|  | 	s_sAppName = appname; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EString e2d::EGame::getAppName() | ||||||
|  | { | ||||||
|  | 	return s_sAppName; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,255 @@ | ||||||
|  | #include "..\ebase.h" | ||||||
|  | 
 | ||||||
|  | #pragma comment(lib, "dinput8.lib") | ||||||
|  | #pragma comment(lib, "dxguid.lib") | ||||||
|  | 
 | ||||||
|  | using namespace e2d; | ||||||
|  | 
 | ||||||
|  | static IDirectInput8* s_pDirectInput = nullptr;			// DirectInput 接口对象
 | ||||||
|  | static IDirectInputDevice8* s_KeyboardDevice = nullptr;	// 键盘设备接口
 | ||||||
|  | static char s_KeyBuffer[256] = { 0 };					// 用于保存键盘按键信息缓冲区
 | ||||||
|  | static char s_KeySecBuffer[256] = { 0 };				// 键盘消息二级缓冲区
 | ||||||
|  | 
 | ||||||
|  | static IDirectInputDevice8* s_MouseDevice = nullptr;	// 鼠标设备接口
 | ||||||
|  | static DIMOUSESTATE s_MouseState;						// 鼠标信息存储结构体
 | ||||||
|  | static DIMOUSESTATE s_MouseSecState;					// 鼠标信息二级缓冲
 | ||||||
|  | static POINT s_MousePosition;							// 鼠标位置存储结构体
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void EInput::__uninit() | ||||||
|  | { | ||||||
|  | 	if (s_KeyboardDevice) | ||||||
|  | 		s_KeyboardDevice->Unacquire(); | ||||||
|  | 	if (s_MouseDevice) | ||||||
|  | 		s_MouseDevice->Unacquire(); | ||||||
|  | 
 | ||||||
|  | 	SafeReleaseInterface(&s_MouseDevice); | ||||||
|  | 	SafeReleaseInterface(&s_KeyboardDevice); | ||||||
|  | 	SafeReleaseInterface(&s_pDirectInput); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | HRESULT EInput::__init() | ||||||
|  | { | ||||||
|  | 	ZeroMemory(s_KeyBuffer, sizeof(s_KeyBuffer)); | ||||||
|  | 	ZeroMemory(s_KeySecBuffer, sizeof(s_KeySecBuffer)); | ||||||
|  | 	ZeroMemory(&s_MouseState, sizeof(s_MouseState)); | ||||||
|  | 	ZeroMemory(&s_MouseSecState, sizeof(s_MouseSecState)); | ||||||
|  | 
 | ||||||
|  | 	// 初始化接口对象
 | ||||||
|  | 	HRESULT hr = DirectInput8Create( | ||||||
|  | 		HINST_THISCOMPONENT, | ||||||
|  | 		DIRECTINPUT_VERSION, | ||||||
|  | 		IID_IDirectInput8, | ||||||
|  | 		(void**)&s_pDirectInput, | ||||||
|  | 		NULL | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	if (SUCCEEDED(hr)) | ||||||
|  | 	{ | ||||||
|  | 		// 初始化键盘设备
 | ||||||
|  | 		hr = s_pDirectInput->CreateDevice( | ||||||
|  | 			GUID_SysKeyboard, | ||||||
|  | 			&s_KeyboardDevice, | ||||||
|  | 			NULL | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		if (SUCCEEDED(hr)) | ||||||
|  | 		{ | ||||||
|  | 			s_KeyboardDevice->SetCooperativeLevel( | ||||||
|  | 				EWindow::getHWnd(), | ||||||
|  | 				DISCL_FOREGROUND | DISCL_NONEXCLUSIVE | ||||||
|  | 			); | ||||||
|  | 			s_KeyboardDevice->SetDataFormat( | ||||||
|  | 				&c_dfDIKeyboard); | ||||||
|  | 			s_KeyboardDevice->Acquire(); | ||||||
|  | 			s_KeyboardDevice->Poll(); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			MessageBox(nullptr, L"Keyboard not found. The game will now exit.", | ||||||
|  | 				L"Error", | ||||||
|  | 				MB_ICONERROR | MB_OK); | ||||||
|  | 			EGame::quit(); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (SUCCEEDED(hr)) | ||||||
|  | 	{ | ||||||
|  | 		// 初始化鼠标设备
 | ||||||
|  | 		hr = s_pDirectInput->CreateDevice(GUID_SysMouse, &s_MouseDevice, NULL); | ||||||
|  | 
 | ||||||
|  | 		if (SUCCEEDED(hr)) | ||||||
|  | 		{ | ||||||
|  | 			s_MouseDevice->SetCooperativeLevel(EWindow::getHWnd(), DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); | ||||||
|  | 			s_MouseDevice->SetDataFormat(&c_dfDIMouse); | ||||||
|  | 			s_MouseDevice->Acquire(); | ||||||
|  | 			s_MouseDevice->Poll(); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			MessageBox(nullptr, L"Mouse not found. The game will now exit.", | ||||||
|  | 				L"Error", | ||||||
|  | 				MB_ICONERROR | MB_OK); | ||||||
|  | 			EGame::quit(); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return SUCCEEDED(hr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void EInput::__updateDeviceState() | ||||||
|  | { | ||||||
|  | 	if (s_KeyboardDevice) | ||||||
|  | 	{ | ||||||
|  | 		HRESULT hr = s_KeyboardDevice->Poll(); | ||||||
|  | 		if (FAILED(hr)) | ||||||
|  | 		{ | ||||||
|  | 			hr = s_KeyboardDevice->Acquire(); | ||||||
|  | 			while (hr == DIERR_INPUTLOST) | ||||||
|  | 				hr = s_KeyboardDevice->Acquire(); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			for (int i = 0; i < 256; i++) | ||||||
|  | 				s_KeySecBuffer[i] = s_KeyBuffer[i]; | ||||||
|  | 
 | ||||||
|  | 			s_KeyboardDevice->GetDeviceState(sizeof(s_KeyBuffer), (void**)&s_KeyBuffer); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (s_MouseDevice) | ||||||
|  | 	{ | ||||||
|  | 		HRESULT hr = s_MouseDevice->Poll(); | ||||||
|  | 		if (FAILED(hr)) | ||||||
|  | 		{ | ||||||
|  | 			hr = s_MouseDevice->Acquire(); | ||||||
|  | 			while (hr == DIERR_INPUTLOST) | ||||||
|  | 				hr = s_MouseDevice->Acquire(); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			s_MouseSecState = s_MouseState; | ||||||
|  | 			s_MouseDevice->GetDeviceState(sizeof(s_MouseState), (void**)&s_MouseState); | ||||||
|  | 		} | ||||||
|  | 		DIK_0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	GetCursorPos(&s_MousePosition); | ||||||
|  | 	ScreenToClient(EWindow::getHWnd(), &s_MousePosition); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isKeyDown(int nKeyCode) | ||||||
|  | { | ||||||
|  | 	if (s_KeyBuffer[nKeyCode] & 0x80) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isKeyPress(int nKeyCode) | ||||||
|  | { | ||||||
|  | 	if ((s_KeyBuffer[nKeyCode] & 0x80) && !(s_KeySecBuffer[nKeyCode] & 0x80)) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isKeyRelease(int nKeyCode) | ||||||
|  | { | ||||||
|  | 	if (!(s_KeyBuffer[nKeyCode] & 0x80) && (s_KeySecBuffer[nKeyCode] & 0x80)) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isMouseLButtonDown() | ||||||
|  | { | ||||||
|  | 	if (s_MouseState.rgbButtons[0] & 0x80) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isMouseRButtonDown() | ||||||
|  | { | ||||||
|  | 	if (s_MouseState.rgbButtons[1] & 0x80) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isMouseMButtonDown() | ||||||
|  | { | ||||||
|  | 	if (s_MouseState.rgbButtons[2] & 0x80) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isMouseLButtonPress() | ||||||
|  | { | ||||||
|  | 	if ((s_MouseState.rgbButtons[0] & 0x80) && !(s_MouseSecState.rgbButtons[0] & 0x80)) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isMouseRButtonPress() | ||||||
|  | { | ||||||
|  | 	if ((s_MouseState.rgbButtons[1] & 0x80) && !(s_MouseSecState.rgbButtons[1] & 0x80)) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isMouseMButtonPress() | ||||||
|  | { | ||||||
|  | 	if ((s_MouseState.rgbButtons[2] & 0x80) && !(s_MouseSecState.rgbButtons[2] & 0x80)) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isMouseLButtonRelease() | ||||||
|  | { | ||||||
|  | 	if (!(s_MouseState.rgbButtons[0] & 0x80) && (s_MouseSecState.rgbButtons[0] & 0x80)) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isMouseRButtonRelease() | ||||||
|  | { | ||||||
|  | 	if (!(s_MouseState.rgbButtons[1] & 0x80) && (s_MouseSecState.rgbButtons[1] & 0x80)) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool EInput::isMouseMButtonRelease() | ||||||
|  | { | ||||||
|  | 	if (!(s_MouseState.rgbButtons[2] & 0x80) && (s_MouseSecState.rgbButtons[2] & 0x80)) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float EInput::getMouseX() | ||||||
|  | { | ||||||
|  | 	return (float)s_MousePosition.x; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float EInput::getMouseY() | ||||||
|  | { | ||||||
|  | 	return (float)s_MousePosition.y; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | EPoint EInput::getMousePos() | ||||||
|  | { | ||||||
|  | 	return EPoint((float)s_MousePosition.x, (float)s_MousePosition.y); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float EInput::getMouseDeltaX() | ||||||
|  | { | ||||||
|  | 	return (float)s_MouseState.lX; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float EInput::getMouseDeltaY() | ||||||
|  | { | ||||||
|  | 	return (float)s_MouseState.lY; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float EInput::getMouseDeltaZ() | ||||||
|  | { | ||||||
|  | 	return (float)s_MouseState.lZ; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,169 @@ | ||||||
|  | #include "..\ebase.h" | ||||||
|  | #include "..\emanagers.h" | ||||||
|  | 
 | ||||||
|  | static ID2D1Factory * s_pDirect2dFactory = nullptr; | ||||||
|  | static ID2D1HwndRenderTarget * s_pRenderTarget = nullptr; | ||||||
|  | static ID2D1SolidColorBrush * s_pSolidBrush = nullptr; | ||||||
|  | static IWICImagingFactory * s_pIWICFactory = nullptr; | ||||||
|  | static IDWriteFactory * s_pDWriteFactory = nullptr; | ||||||
|  | static D2D1_COLOR_F s_nClearColor = D2D1::ColorF(D2D1::ColorF::Black); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | bool e2d::ERenderer::__createDeviceIndependentResources() | ||||||
|  | { | ||||||
|  | 	// 创建设备无关资源,它们的生命周期和程序的时长相同
 | ||||||
|  | 	HRESULT hr = D2D1CreateFactory( | ||||||
|  | 		D2D1_FACTORY_TYPE_SINGLE_THREADED,  | ||||||
|  | 		&s_pDirect2dFactory | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	ASSERT(SUCCEEDED(hr), "Create Device Independent Resources Failed!"); | ||||||
|  | 
 | ||||||
|  | 	if (SUCCEEDED(hr)) | ||||||
|  | 	{ | ||||||
|  | 		// 创建 WIC 绘图工厂,用于统一处理各种格式的图片
 | ||||||
|  | 		hr = CoCreateInstance( | ||||||
|  | 			CLSID_WICImagingFactory, | ||||||
|  | 			NULL, | ||||||
|  | 			CLSCTX_INPROC_SERVER, | ||||||
|  | 			IID_IWICImagingFactory, | ||||||
|  | 			reinterpret_cast<void**>(&s_pIWICFactory) | ||||||
|  | 		); | ||||||
|  | 		ASSERT(SUCCEEDED(hr), "Create WICImagingFactory Failed!"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (SUCCEEDED(hr)) | ||||||
|  | 	{ | ||||||
|  | 		// 创建 DirectWrite 工厂
 | ||||||
|  | 		hr = DWriteCreateFactory( | ||||||
|  | 			DWRITE_FACTORY_TYPE_SHARED, | ||||||
|  | 			__uuidof(IDWriteFactory), | ||||||
|  | 			reinterpret_cast<IUnknown**>(&s_pDWriteFactory) | ||||||
|  | 		); | ||||||
|  | 		ASSERT(SUCCEEDED(hr), "Create DirectWrite Factory Failed!"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return SUCCEEDED(hr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool e2d::ERenderer::__createDeviceResources() | ||||||
|  | { | ||||||
|  | 	HRESULT hr = S_OK; | ||||||
|  | 	 | ||||||
|  | 	if (!s_pRenderTarget) | ||||||
|  | 	{ | ||||||
|  | 		HWND hWnd = EWindow::getHWnd(); | ||||||
|  | 
 | ||||||
|  | 		// 创建设备相关资源。这些资源应在 Direct3D 设备消失时重建,
 | ||||||
|  | 		// 比如当 isVisiable 被修改,等等
 | ||||||
|  | 		RECT rc; | ||||||
|  | 		GetClientRect(hWnd, &rc); | ||||||
|  | 
 | ||||||
|  | 		D2D1_SIZE_U size = D2D1::SizeU( | ||||||
|  | 			rc.right - rc.left, | ||||||
|  | 			rc.bottom - rc.top | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		// 创建一个 Direct2D 渲染目标
 | ||||||
|  | 		hr = s_pDirect2dFactory->CreateHwndRenderTarget( | ||||||
|  | 			D2D1::RenderTargetProperties(), | ||||||
|  | 			D2D1::HwndRenderTargetProperties( | ||||||
|  | 				hWnd, | ||||||
|  | 				size), | ||||||
|  | 			&s_pRenderTarget | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		ASSERT(SUCCEEDED(hr), "Create Render Target Failed!"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (SUCCEEDED(hr)) | ||||||
|  | 	{ | ||||||
|  | 		// 创建画刷
 | ||||||
|  | 		hr = s_pRenderTarget->CreateSolidColorBrush( | ||||||
|  | 			D2D1::ColorF(D2D1::ColorF::White), | ||||||
|  | 			&s_pSolidBrush | ||||||
|  | 		); | ||||||
|  | 		ASSERT(SUCCEEDED(hr), "Create Solid Color Brush Failed!"); | ||||||
|  | 	} | ||||||
|  | 	return SUCCEEDED(hr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ERenderer::__discardDeviceResources() | ||||||
|  | { | ||||||
|  | 	SafeReleaseInterface(&s_pRenderTarget); | ||||||
|  | 	SafeReleaseInterface(&s_pSolidBrush); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ERenderer::__discardResources() | ||||||
|  | { | ||||||
|  | 	SafeReleaseInterface(&s_pDirect2dFactory); | ||||||
|  | 	SafeReleaseInterface(&s_pRenderTarget); | ||||||
|  | 	SafeReleaseInterface(&s_pSolidBrush); | ||||||
|  | 	SafeReleaseInterface(&s_pIWICFactory); | ||||||
|  | 	SafeReleaseInterface(&s_pDWriteFactory); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ERenderer::__render() | ||||||
|  | { | ||||||
|  | 	HRESULT hr = S_OK; | ||||||
|  | 
 | ||||||
|  | 	// 创建设备相关资源
 | ||||||
|  | 	ERenderer::__createDeviceResources(); | ||||||
|  | 
 | ||||||
|  | 	// 开始渲染
 | ||||||
|  | 	s_pRenderTarget->BeginDraw(); | ||||||
|  | 	// 使用背景色清空屏幕
 | ||||||
|  | 	s_pRenderTarget->Clear(s_nClearColor); | ||||||
|  | 
 | ||||||
|  | 	// 渲染场景
 | ||||||
|  | 	ESceneManager::__render(); | ||||||
|  | 
 | ||||||
|  | 	// 终止渲染
 | ||||||
|  | 	hr = s_pRenderTarget->EndDraw(); | ||||||
|  | 
 | ||||||
|  | 	if (hr == D2DERR_RECREATE_TARGET) | ||||||
|  | 	{ | ||||||
|  | 		// 如果 Direct3D 设备在执行过程中消失,将丢弃当前的设备相关资源
 | ||||||
|  | 		// 并在下一次调用时重建资源
 | ||||||
|  | 		hr = S_OK; | ||||||
|  | 		ERenderer::__discardDeviceResources(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (FAILED(hr)) | ||||||
|  | 	{ | ||||||
|  | 		// 渲染时产生了未知的错误,退出游戏
 | ||||||
|  | 		ASSERT(false, L"Renderer error!"); | ||||||
|  | 		EGame::quit(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void e2d::ERenderer::setBackgroundColor(UINT32 color) | ||||||
|  | { | ||||||
|  | 	s_nClearColor = D2D1::ColorF(color); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ID2D1Factory * e2d::ERenderer::getID2D1Factory() | ||||||
|  | { | ||||||
|  | 	return s_pDirect2dFactory; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ID2D1HwndRenderTarget * e2d::ERenderer::getRenderTarget() | ||||||
|  | { | ||||||
|  | 	return s_pRenderTarget; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ID2D1SolidColorBrush * e2d::ERenderer::getSolidColorBrush() | ||||||
|  | { | ||||||
|  | 	return s_pSolidBrush; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | IWICImagingFactory * e2d::ERenderer::getIWICImagingFactory() | ||||||
|  | { | ||||||
|  | 	return s_pIWICFactory; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | IDWriteFactory * e2d::ERenderer::getIDWriteFactory() | ||||||
|  | { | ||||||
|  | 	return s_pDWriteFactory; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,123 @@ | ||||||
|  | #include "..\ebase.h" | ||||||
|  | 
 | ||||||
|  | // 上一帧与当前帧的时间间隔
 | ||||||
|  | static int s_nInterval = 0; | ||||||
|  | // 游戏开始时长
 | ||||||
|  | static float s_fTotalTime = 0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | float e2d::ETime::getTotalTime() | ||||||
|  | { | ||||||
|  | 	return s_fTotalTime; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int e2d::ETime::getDeltaTime() | ||||||
|  | { | ||||||
|  | 	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; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void e2d::ETime::__init() | ||||||
|  | { | ||||||
|  | 	s_tStart = s_tLast = s_tNow = steady_clock::now(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ETime::__uninit() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ETime::__updateNow() | ||||||
|  | { | ||||||
|  | 	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() | ||||||
|  | { | ||||||
|  | 	s_tLast = s_tNow; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ETime::__sleep() | ||||||
|  | { | ||||||
|  | 	// 计算挂起时长
 | ||||||
|  | 	int nWaitMS = 16 - s_nInterval; | ||||||
|  | 	// 挂起线程,释放 CPU 占用
 | ||||||
|  | 	if (nWaitMS > 1) | ||||||
|  | 	{ | ||||||
|  | 		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; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void e2d::ETime::__init() | ||||||
|  | { | ||||||
|  | 	::timeBeginPeriod(1);					// 修改时间精度
 | ||||||
|  | 	::QueryPerformanceFrequency(&s_tFreq);	// 获取时钟频率
 | ||||||
|  | 	::QueryPerformanceCounter(&s_tNow);		// 刷新当前时间
 | ||||||
|  | 	s_tStart = s_tLast = s_tNow; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 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
 | ||||||
|  | @ -0,0 +1,328 @@ | ||||||
|  | #include "..\ebase.h" | ||||||
|  | #include "..\emanagers.h" | ||||||
|  | #include <imm.h> | ||||||
|  | #pragma comment (lib ,"imm32.lib") | ||||||
|  | 
 | ||||||
|  | // 窗口句柄
 | ||||||
|  | static HWND s_HWnd = nullptr; | ||||||
|  | // 是否打开控制台
 | ||||||
|  | static bool s_bShowConsole = false; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | bool e2d::EWindow::__init(LPCTSTR sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR pIconID /*= nullptr*/, bool bNoClose /*= false*/, bool bNoMiniSize /*= false*/, bool bTopMost /*= false*/) | ||||||
|  | { | ||||||
|  | 	// 注册窗口类
 | ||||||
|  | 	WNDCLASSEX wcex = { sizeof(WNDCLASSEX) }; | ||||||
|  | 	wcex.style = CS_HREDRAW | CS_VREDRAW; | ||||||
|  | 	wcex.lpfnWndProc = EWindow::WndProc; | ||||||
|  | 	wcex.cbClsExtra = 0; | ||||||
|  | 	wcex.cbWndExtra = sizeof(LONG_PTR); | ||||||
|  | 	wcex.hInstance = HINST_THISCOMPONENT; | ||||||
|  | 	wcex.hbrBackground = NULL; | ||||||
|  | 	wcex.lpszMenuName = NULL; | ||||||
|  | 	wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION); | ||||||
|  | 	wcex.lpszClassName = L"Easy2DApp"; | ||||||
|  | 	// 设置窗口是否有关闭按钮
 | ||||||
|  | 	if (bNoClose) | ||||||
|  | 	{ | ||||||
|  | 		wcex.style |= CS_NOCLOSE; | ||||||
|  | 	} | ||||||
|  | 	// 设置程序图标
 | ||||||
|  | 	if (pIconID) | ||||||
|  | 	{ | ||||||
|  | 		wcex.hIcon = (HICON)::LoadImage( | ||||||
|  | 			GetModuleHandle(NULL), | ||||||
|  | 			pIconID, | ||||||
|  | 			IMAGE_ICON, | ||||||
|  | 			0, | ||||||
|  | 			0, | ||||||
|  | 			LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	RegisterClassEx(&wcex); | ||||||
|  | 
 | ||||||
|  | 	// 因为 CreateWindow 函数使用的是像素大小,获取系统的 DPI 以使它
 | ||||||
|  | 	// 适应窗口缩放
 | ||||||
|  | 	FLOAT dpiX, dpiY; | ||||||
|  | 
 | ||||||
|  | 	// 工厂将返回当前的系统 DPI,这个值也将用来创建窗口
 | ||||||
|  | 	ERenderer::getID2D1Factory()->GetDesktopDpi(&dpiX, &dpiY); | ||||||
|  | 
 | ||||||
|  | 	nWidth = static_cast<UINT>(ceil(nWidth * dpiX / 96.f)); | ||||||
|  | 	nHeight = static_cast<UINT>(ceil(nHeight * dpiY / 96.f)); | ||||||
|  | 
 | ||||||
|  | 	// 获取屏幕分辨率
 | ||||||
|  | 	UINT screenWidth = static_cast<UINT>(::GetSystemMetrics(SM_CXSCREEN)); | ||||||
|  | 	UINT screenHeight = static_cast<UINT>(::GetSystemMetrics(SM_CYSCREEN)); | ||||||
|  | 	// 当输入的窗口大小比分辨率大时,给出警告
 | ||||||
|  | 	WARN_IF(screenWidth < nWidth || screenHeight < nHeight, "The window is larger than screen!"); | ||||||
|  | 	// 取最小值
 | ||||||
|  | 	nWidth = min(nWidth, screenWidth); | ||||||
|  | 	nHeight = min(nHeight, screenHeight); | ||||||
|  | 
 | ||||||
|  | 	// 创建窗口样式
 | ||||||
|  | 	DWORD dwStyle = WS_OVERLAPPED | WS_SYSMENU; | ||||||
|  | 	if (!bNoMiniSize) | ||||||
|  | 	{ | ||||||
|  | 		dwStyle |= WS_MINIMIZEBOX; | ||||||
|  | 	} | ||||||
|  | 	// 创建窗口
 | ||||||
|  | 	s_HWnd = CreateWindow( | ||||||
|  | 		L"Easy2DApp", | ||||||
|  | 		sTitle, | ||||||
|  | 		dwStyle, | ||||||
|  | 		0, 0, nWidth, nHeight, | ||||||
|  | 		NULL, | ||||||
|  | 		NULL, | ||||||
|  | 		HINST_THISCOMPONENT, | ||||||
|  | 		NULL | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	HRESULT hr = s_HWnd ? S_OK : E_FAIL; | ||||||
|  | 
 | ||||||
|  | 	if (SUCCEEDED(hr)) | ||||||
|  | 	{ | ||||||
|  | 		// 禁用输入法
 | ||||||
|  | 		EWindow::setTypewritingEnable(false); | ||||||
|  | 		// 设置窗口置顶
 | ||||||
|  | 		if (bTopMost) | ||||||
|  | 		{ | ||||||
|  | 			::SetWindowPos(s_HWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); | ||||||
|  | 		} | ||||||
|  | 		// 查找是否存在控制台
 | ||||||
|  | 		HWND hwnd = ::GetConsoleWindow(); | ||||||
|  | 		if (hwnd) | ||||||
|  | 		{ | ||||||
|  | 			// 禁用控制台关闭按钮
 | ||||||
|  | 			HMENU hmenu = ::GetSystemMenu(hwnd, FALSE); | ||||||
|  | 			::RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND); | ||||||
|  | 			// 默认隐藏控制台
 | ||||||
|  | 			if (!s_bShowConsole) | ||||||
|  | 			{ | ||||||
|  | 				::ShowWindow(hwnd, SW_HIDE); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		UnregisterClass(L"Easy2DApp", HINST_THISCOMPONENT); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (FAILED(hr)) | ||||||
|  | 	{ | ||||||
|  | 		MessageBox(nullptr, L"Create Window Failed!", L"Error", MB_OK); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return SUCCEEDED(hr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EWindow::__uninit() | ||||||
|  | { | ||||||
|  | 	if (::GetConsoleWindow()) | ||||||
|  | 	{ | ||||||
|  | 		::FreeConsole(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EWindow::__poll() | ||||||
|  | { | ||||||
|  | 	static MSG msg; | ||||||
|  | 
 | ||||||
|  | 	while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) | ||||||
|  | 	{ | ||||||
|  | 		::TranslateMessage(&msg); | ||||||
|  | 		::DispatchMessage(&msg); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float e2d::EWindow::getWidth() | ||||||
|  | { | ||||||
|  | 	return ERenderer::getRenderTarget()->GetSize().width; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float e2d::EWindow::getHeight() | ||||||
|  | { | ||||||
|  | 	return ERenderer::getRenderTarget()->GetSize().height; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::ESize e2d::EWindow::getSize() | ||||||
|  | { | ||||||
|  | 	D2D1_SIZE_F size = ERenderer::getRenderTarget()->GetSize(); | ||||||
|  | 	return ESize(size.width, size.height); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | HWND e2d::EWindow::getHWnd() | ||||||
|  | { | ||||||
|  | 	return s_HWnd; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EWindow::setSize(UINT32 width, UINT32 height) | ||||||
|  | { | ||||||
|  | 	// 获取屏幕分辨率
 | ||||||
|  | 	int screenWidth = ::GetSystemMetrics(SM_CXSCREEN); | ||||||
|  | 	int screenHeight = ::GetSystemMetrics(SM_CYSCREEN); | ||||||
|  | 	// 获取窗口大小(包含菜单栏)
 | ||||||
|  | 	tagRECT rcWindow; | ||||||
|  | 	::GetWindowRect(s_HWnd, &rcWindow); | ||||||
|  | 	// 获取客户区大小
 | ||||||
|  | 	tagRECT rcClient; | ||||||
|  | 	::GetClientRect(s_HWnd, &rcClient); | ||||||
|  | 	// 计算边框大小
 | ||||||
|  | 	width += (rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left); | ||||||
|  | 	height += (rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top); | ||||||
|  | 	// 修改窗口大小,并设置窗口在屏幕居中
 | ||||||
|  | 	::MoveWindow(s_HWnd, (screenWidth - width) / 2, (screenHeight - height) / 2, width, height, TRUE); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EWindow::setTitle(const EString &title) | ||||||
|  | { | ||||||
|  | 	// 设置窗口标题
 | ||||||
|  | 	SetWindowText(s_HWnd, title); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EString e2d::EWindow::getTitle() | ||||||
|  | { | ||||||
|  | 	wchar_t wszTitle[MAX_PATH] = { 0 }; | ||||||
|  | 	::GetWindowText(s_HWnd, wszTitle, MAX_PATH); | ||||||
|  | 	return wszTitle; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EWindow::showConsole(bool show /* = true */) | ||||||
|  | { | ||||||
|  | 	s_bShowConsole = show; | ||||||
|  | 	// 查找已存在的控制台句柄
 | ||||||
|  | 	HWND hwnd = ::GetConsoleWindow(); | ||||||
|  | 	// 关闭控制台
 | ||||||
|  | 	if (show) | ||||||
|  | 	{ | ||||||
|  | 		if (hwnd) | ||||||
|  | 		{ | ||||||
|  | 			::ShowWindow(hwnd, SW_SHOWNORMAL); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			// 显示一个新控制台
 | ||||||
|  | 			if (::AllocConsole()) | ||||||
|  | 			{ | ||||||
|  | 				hwnd = ::GetConsoleWindow(); | ||||||
|  | 				// 重定向输入输出
 | ||||||
|  | 				FILE * stdoutStream, * stdinStream, * stderrStream; | ||||||
|  | 				freopen_s(&stdoutStream, "conout$", "w+t", stdout); | ||||||
|  | 				freopen_s(&stdinStream, "conin$", "r+t", stdin); | ||||||
|  | 				freopen_s(&stderrStream, "conerr$", "w+t", stderr); | ||||||
|  | 				// 禁用控制台关闭按钮
 | ||||||
|  | 				HMENU hmenu = ::GetSystemMenu(hwnd, FALSE); | ||||||
|  | 				::RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				MessageBox(nullptr, L"Alloc Console Failed!", L"Error", MB_OK); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else  | ||||||
|  | 	{ | ||||||
|  | 		if (hwnd) | ||||||
|  | 		{ | ||||||
|  | 			::ShowWindow(hwnd, SW_HIDE); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EWindow::hideWindow() | ||||||
|  | { | ||||||
|  | 	::ShowWindow(s_HWnd, SW_HIDE); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EWindow::showWindow() | ||||||
|  | { | ||||||
|  | 	::ShowWindow(s_HWnd, SW_SHOWNORMAL); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EWindow::setTypewritingEnable(bool bEnable) | ||||||
|  | { | ||||||
|  | 	static HIMC hImc = nullptr; | ||||||
|  | 
 | ||||||
|  | 	if (bEnable) | ||||||
|  | 	{ | ||||||
|  | 		if (hImc != nullptr) | ||||||
|  | 		{ | ||||||
|  | 			::ImmAssociateContext(EWindow::getHWnd(), hImc); | ||||||
|  | 			hImc = nullptr; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		if (hImc == nullptr) | ||||||
|  | 		{ | ||||||
|  | 			hImc = ::ImmAssociateContext(EWindow::getHWnd(), nullptr); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | LRESULT e2d::EWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | ||||||
|  | { | ||||||
|  | 	LRESULT result = 0; | ||||||
|  | 
 | ||||||
|  | 	switch (message) | ||||||
|  | 	{ | ||||||
|  | 	// 处理窗口大小变化消息
 | ||||||
|  | 	case WM_SIZE: | ||||||
|  | 	{ | ||||||
|  | 		UINT width = LOWORD(lParam); | ||||||
|  | 		UINT height = HIWORD(lParam); | ||||||
|  | 		// 如果程序接收到一个 WM_SIZE 消息,这个方法将调整渲染
 | ||||||
|  | 		// 目标适当。它可能会调用失败,但是这里可以忽略有可能的
 | ||||||
|  | 		// 错误,因为这个错误将在下一次调用 EndDraw 时产生
 | ||||||
|  | 		ERenderer::getRenderTarget()->Resize(D2D1::SizeU(width, height)); | ||||||
|  | 	} | ||||||
|  | 	break; | ||||||
|  | 
 | ||||||
|  | 	// 处理分辨率变化消息
 | ||||||
|  | 	case WM_DISPLAYCHANGE: | ||||||
|  | 	{ | ||||||
|  | 		// 重绘客户区
 | ||||||
|  | 		InvalidateRect(hWnd, NULL, FALSE); | ||||||
|  | 	} | ||||||
|  | 	result = 0; | ||||||
|  | 	break; | ||||||
|  | 
 | ||||||
|  | 	// 重绘窗口
 | ||||||
|  | 	case WM_PAINT: | ||||||
|  | 	{ | ||||||
|  | 		e2d::ERenderer::__render(); | ||||||
|  | 		ValidateRect(hWnd, NULL); | ||||||
|  | 	} | ||||||
|  | 	result = 0; | ||||||
|  | 	break; | ||||||
|  | 
 | ||||||
|  | 	// 窗口关闭消息
 | ||||||
|  | 	case WM_CLOSE: | ||||||
|  | 	{ | ||||||
|  | 		e2d::EScene * pCurrentScene = e2d::ESceneManager::getCurrentScene(); | ||||||
|  | 		if (!pCurrentScene || pCurrentScene->onCloseWindow()) | ||||||
|  | 		{ | ||||||
|  | 			e2d::EGame::quit(); | ||||||
|  | 			DestroyWindow(hWnd); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	result = 0; | ||||||
|  | 	break; | ||||||
|  | 
 | ||||||
|  | 	case WM_DESTROY: | ||||||
|  | 	{ | ||||||
|  | 		PostQuitMessage(0); | ||||||
|  | 	} | ||||||
|  | 	result = 1; | ||||||
|  | 	break; | ||||||
|  | 
 | ||||||
|  | 	default: | ||||||
|  | 	{ | ||||||
|  | 		result = DefWindowProc(hWnd, message, wParam, lParam); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return result; | ||||||
|  | } | ||||||
|  | @ -1,118 +0,0 @@ | ||||||
| #include "..\ecommon.h" |  | ||||||
| 
 |  | ||||||
| e2d::ESpriteFrame::ESpriteFrame() |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_fSourceClipWidth(0) |  | ||||||
| 	, m_fSourceClipHeight(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESpriteFrame::ESpriteFrame(ETexture * texture) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_fSourceClipWidth(0) |  | ||||||
| 	, m_fSourceClipHeight(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	_setTexture(texture); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESpriteFrame::ESpriteFrame(const EString & imageFileName) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_fSourceClipWidth(0) |  | ||||||
| 	, m_fSourceClipHeight(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	_setTexture(new ETexture(imageFileName)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESpriteFrame::ESpriteFrame(LPCTSTR resourceName, LPCTSTR resourceType) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_fSourceClipWidth(0) |  | ||||||
| 	, m_fSourceClipHeight(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	_setTexture(new ETexture(resourceName, resourceType)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESpriteFrame::ESpriteFrame(ETexture * texture, float x, float y, float width, float height) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_fSourceClipWidth(0) |  | ||||||
| 	, m_fSourceClipHeight(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	_setTexture(texture); |  | ||||||
| 	_clipTexture(x, y, width, height); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESpriteFrame::ESpriteFrame(const EString & imageFileName, float x, float y, float width, float height) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_fSourceClipWidth(0) |  | ||||||
| 	, m_fSourceClipHeight(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	_setTexture(new ETexture(imageFileName)); |  | ||||||
| 	_clipTexture(x, y, width, height); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESpriteFrame::ESpriteFrame(LPCTSTR resourceName, LPCTSTR resourceType, float x, float y, float width, float height) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_fSourceClipWidth(0) |  | ||||||
| 	, m_fSourceClipHeight(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	_setTexture(new ETexture(resourceName, resourceType)); |  | ||||||
| 	_clipTexture(x, y, width, height); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESpriteFrame::~ESpriteFrame() |  | ||||||
| { |  | ||||||
| 	SafeRelease(&m_pTexture); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| float e2d::ESpriteFrame::getWidth() const |  | ||||||
| { |  | ||||||
| 	return m_fSourceClipWidth; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| float e2d::ESpriteFrame::getHeight() const |  | ||||||
| { |  | ||||||
| 	return m_fSourceClipHeight; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ETexture * e2d::ESpriteFrame::getTexture() const |  | ||||||
| { |  | ||||||
| 	return m_pTexture; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ESpriteFrame::_setTexture(ETexture * texture) |  | ||||||
| { |  | ||||||
| 	if (texture) |  | ||||||
| 	{ |  | ||||||
| 		SafeRelease(&m_pTexture); |  | ||||||
| 		m_pTexture = texture; |  | ||||||
| 		m_pTexture->retain(); |  | ||||||
| 		m_fSourceClipX = 0; |  | ||||||
| 		m_fSourceClipY = 0; |  | ||||||
| 		m_fSourceClipWidth = texture->getSourceWidth(); |  | ||||||
| 		m_fSourceClipHeight = texture->getSourceHeight(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ESpriteFrame::_clipTexture(float x, float y, float width, float height) |  | ||||||
| { |  | ||||||
| 	if (m_pTexture) |  | ||||||
| 	{ |  | ||||||
| 		m_fSourceClipX = min(max(x, 0), m_pTexture->getSourceWidth()); |  | ||||||
| 		m_fSourceClipY = min(max(y, 0), m_pTexture->getSourceHeight()); |  | ||||||
| 		m_fSourceClipWidth = min(max(width, 0), m_pTexture->getSourceWidth() - m_fSourceClipX); |  | ||||||
| 		m_fSourceClipHeight = min(max(height, 0), m_pTexture->getSourceHeight() - m_fSourceClipY); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::EFont::EFont() | e2d::EFont::EFont() | ||||||
| 	: m_pTextFormat(nullptr) | 	: m_pTextFormat(nullptr) | ||||||
|  | @ -84,7 +83,7 @@ void e2d::EFont::_initTextFormat() | ||||||
| { | { | ||||||
| 	SafeReleaseInterface(&m_pTextFormat); | 	SafeReleaseInterface(&m_pTextFormat); | ||||||
| 
 | 
 | ||||||
| 	HRESULT hr = GetDirectWriteFactory()->CreateTextFormat( | 	HRESULT hr = ERenderer::getIDWriteFactory()->CreateTextFormat( | ||||||
| 		m_sFontFamily, | 		m_sFontFamily, | ||||||
| 		NULL, | 		NULL, | ||||||
| 		DWRITE_FONT_WEIGHT(m_FontWeight), | 		DWRITE_FONT_WEIGHT(m_FontWeight), | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| #include <map> | #include <map> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -25,51 +24,51 @@ static std::map<size_t, ID2D1Bitmap*> s_mBitmapsFromFile; | ||||||
| static std::map<ResKey, ID2D1Bitmap*> s_mBitmapsFromResource; | static std::map<ResKey, ID2D1Bitmap*> s_mBitmapsFromResource; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| e2d::ETexture::ETexture() | e2d::EImage::EImage() | ||||||
| 	: m_pBitmap(nullptr) | 	: m_pBitmap(nullptr) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ETexture::ETexture(const EString & fileName) | e2d::EImage::EImage(LPCTSTR fileName) | ||||||
| { | { | ||||||
| 	this->loadFromFile(fileName); | 	this->loadFromFile(fileName); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ETexture::ETexture(LPCTSTR resourceName, LPCTSTR resourceType) | e2d::EImage::EImage(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
| { | { | ||||||
| 	this->loadFromResource(resourceName, resourceType); | 	this->loadFromResource(resourceName, resourceType); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ETexture::~ETexture() | e2d::EImage::~EImage() | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETexture::loadFromFile(const EString & fileName) | void e2d::EImage::loadFromFile(const EString & fileName) | ||||||
| { | { | ||||||
| 	WARN_IF(fileName.isEmpty(), "ETexture cannot load bitmap from NULL file name."); | 	WARN_IF(fileName.isEmpty(), "EImage cannot load bitmap from NULL file name."); | ||||||
| 
 | 
 | ||||||
| 	if (fileName.isEmpty()) | 	if (fileName.isEmpty()) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (!e2d::ETexture::preload(fileName)) | 	if (!e2d::EImage::preload(fileName)) | ||||||
| 	{ | 	{ | ||||||
| 		WARN_IF(true, "Load ETexture from file failed!"); | 		WARN_IF(true, "Load EImage from file failed!"); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	m_pBitmap = s_mBitmapsFromFile.at(fileName.hash()); | 	m_pBitmap = s_mBitmapsFromFile.at(fileName.hash()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETexture::loadFromResource(LPCTSTR resourceName, LPCTSTR resourceType) | void e2d::EImage::loadFromResource(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
| { | { | ||||||
| 	WARN_IF(!resourceName || !resourceType, "ETexture cannot load bitmap from NULL resource."); | 	WARN_IF(!resourceName || !resourceType, "EImage cannot load bitmap from NULL resource."); | ||||||
| 
 | 
 | ||||||
| 	if (!resourceName || !resourceType) | 	if (!resourceName || !resourceType) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (!e2d::ETexture::preload(resourceName, resourceType)) | 	if (!e2d::EImage::preload(resourceName, resourceType)) | ||||||
| 	{ | 	{ | ||||||
| 		WARN_IF(true, "Load ETexture from resource failed!"); | 		WARN_IF(true, "Load EImage from resource failed!"); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -81,7 +80,7 @@ void e2d::ETexture::loadFromResource(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
| 	m_pBitmap = s_mBitmapsFromResource.at(key); | 	m_pBitmap = s_mBitmapsFromResource.at(key); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| float e2d::ETexture::getSourceWidth() const | float e2d::EImage::getSourceWidth() const | ||||||
| { | { | ||||||
| 	if (m_pBitmap) | 	if (m_pBitmap) | ||||||
| 	{ | 	{ | ||||||
|  | @ -93,7 +92,7 @@ float e2d::ETexture::getSourceWidth() const | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| float e2d::ETexture::getSourceHeight() const | float e2d::EImage::getSourceHeight() const | ||||||
| { | { | ||||||
| 	if (m_pBitmap) | 	if (m_pBitmap) | ||||||
| 	{ | 	{ | ||||||
|  | @ -105,7 +104,7 @@ float e2d::ETexture::getSourceHeight() const | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ESize e2d::ETexture::getSourceSize() const | e2d::ESize e2d::EImage::getSourceSize() const | ||||||
| { | { | ||||||
| 	if (m_pBitmap) | 	if (m_pBitmap) | ||||||
| 	{ | 	{ | ||||||
|  | @ -117,7 +116,7 @@ e2d::ESize e2d::ETexture::getSourceSize() const | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::ETexture::preload(const EString & fileName) | bool e2d::EImage::preload(const EString & fileName) | ||||||
| { | { | ||||||
| 	if (s_mBitmapsFromFile.find(fileName.hash()) != s_mBitmapsFromFile.end()) | 	if (s_mBitmapsFromFile.find(fileName.hash()) != s_mBitmapsFromFile.end()) | ||||||
| 	{ | 	{ | ||||||
|  | @ -133,7 +132,7 @@ bool e2d::ETexture::preload(const EString & fileName) | ||||||
| 	ID2D1Bitmap *pBitmap = nullptr; | 	ID2D1Bitmap *pBitmap = nullptr; | ||||||
| 
 | 
 | ||||||
| 	// 创建解码器
 | 	// 创建解码器
 | ||||||
| 	hr = GetImagingFactory()->CreateDecoderFromFilename( | 	hr = ERenderer::getIWICImagingFactory()->CreateDecoderFromFilename( | ||||||
| 		fileName, | 		fileName, | ||||||
| 		NULL, | 		NULL, | ||||||
| 		GENERIC_READ, | 		GENERIC_READ, | ||||||
|  | @ -151,7 +150,7 @@ bool e2d::ETexture::preload(const EString & fileName) | ||||||
| 	{ | 	{ | ||||||
| 		// 创建图片格式转换器
 | 		// 创建图片格式转换器
 | ||||||
| 		// (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED).
 | 		// (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED).
 | ||||||
| 		hr = GetImagingFactory()->CreateFormatConverter(&pConverter); | 		hr = ERenderer::getIWICImagingFactory()->CreateFormatConverter(&pConverter); | ||||||
| 	} | 	} | ||||||
| 	if (SUCCEEDED(hr)) | 	if (SUCCEEDED(hr)) | ||||||
| 	{ | 	{ | ||||||
|  | @ -168,7 +167,7 @@ bool e2d::ETexture::preload(const EString & fileName) | ||||||
| 	if (SUCCEEDED(hr)) | 	if (SUCCEEDED(hr)) | ||||||
| 	{ | 	{ | ||||||
| 		// 从 WIC 位图创建一个 Direct2D 位图
 | 		// 从 WIC 位图创建一个 Direct2D 位图
 | ||||||
| 		hr = GetRenderTarget()->CreateBitmapFromWicBitmap( | 		hr = ERenderer::getRenderTarget()->CreateBitmapFromWicBitmap( | ||||||
| 			pConverter, | 			pConverter, | ||||||
| 			NULL, | 			NULL, | ||||||
| 			&pBitmap | 			&pBitmap | ||||||
|  | @ -193,7 +192,7 @@ bool e2d::ETexture::preload(const EString & fileName) | ||||||
| 	return SUCCEEDED(hr); | 	return SUCCEEDED(hr); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::ETexture::preload(LPCTSTR resourceName, LPCTSTR resourceType) | bool e2d::EImage::preload(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
| { | { | ||||||
| 	std::hash<LPCTSTR> h; | 	std::hash<LPCTSTR> h; | ||||||
| 
 | 
 | ||||||
|  | @ -251,7 +250,7 @@ bool e2d::ETexture::preload(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
| 	if (SUCCEEDED(hr)) | 	if (SUCCEEDED(hr)) | ||||||
| 	{ | 	{ | ||||||
| 		// 创建 WIC 流
 | 		// 创建 WIC 流
 | ||||||
| 		hr = GetImagingFactory()->CreateStream(&pStream); | 		hr = ERenderer::getIWICImagingFactory()->CreateStream(&pStream); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (SUCCEEDED(hr)) | 	if (SUCCEEDED(hr)) | ||||||
|  | @ -266,7 +265,7 @@ bool e2d::ETexture::preload(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
| 	if (SUCCEEDED(hr)) | 	if (SUCCEEDED(hr)) | ||||||
| 	{ | 	{ | ||||||
| 		// 创建流的解码器
 | 		// 创建流的解码器
 | ||||||
| 		hr = GetImagingFactory()->CreateDecoderFromStream( | 		hr = ERenderer::getIWICImagingFactory()->CreateDecoderFromStream( | ||||||
| 			pStream, | 			pStream, | ||||||
| 			NULL, | 			NULL, | ||||||
| 			WICDecodeMetadataCacheOnLoad, | 			WICDecodeMetadataCacheOnLoad, | ||||||
|  | @ -284,7 +283,7 @@ bool e2d::ETexture::preload(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
| 	{ | 	{ | ||||||
| 		// 创建图片格式转换器
 | 		// 创建图片格式转换器
 | ||||||
| 		// (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED).
 | 		// (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED).
 | ||||||
| 		hr = GetImagingFactory()->CreateFormatConverter(&pConverter); | 		hr = ERenderer::getIWICImagingFactory()->CreateFormatConverter(&pConverter); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (SUCCEEDED(hr)) | 	if (SUCCEEDED(hr)) | ||||||
|  | @ -303,7 +302,7 @@ bool e2d::ETexture::preload(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
| 	if (SUCCEEDED(hr)) | 	if (SUCCEEDED(hr)) | ||||||
| 	{ | 	{ | ||||||
| 		// 从 WIC 位图创建一个 Direct2D 位图
 | 		// 从 WIC 位图创建一个 Direct2D 位图
 | ||||||
| 		hr = GetRenderTarget()->CreateBitmapFromWicBitmap( | 		hr = ERenderer::getRenderTarget()->CreateBitmapFromWicBitmap( | ||||||
| 			pConverter, | 			pConverter, | ||||||
| 			NULL, | 			NULL, | ||||||
| 			&pBitmap | 			&pBitmap | ||||||
|  | @ -335,7 +334,7 @@ bool e2d::ETexture::preload(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
| 	return SUCCEEDED(hr); | 	return SUCCEEDED(hr); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETexture::clearCache() | void e2d::EImage::clearCache() | ||||||
| { | { | ||||||
| 	for (auto child = s_mBitmapsFromFile.begin(); child != s_mBitmapsFromFile.end(); child++) | 	for (auto child = s_mBitmapsFromFile.begin(); child != s_mBitmapsFromFile.end(); child++) | ||||||
| 	{ | 	{ | ||||||
|  | @ -349,7 +348,7 @@ void e2d::ETexture::clearCache() | ||||||
| 	s_mBitmapsFromResource.clear(); | 	s_mBitmapsFromResource.clear(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ID2D1Bitmap * e2d::ETexture::_getBitmap() | ID2D1Bitmap * e2d::EImage::_getBitmap() | ||||||
| { | { | ||||||
| 	return m_pBitmap; | 	return m_pBitmap; | ||||||
| } | } | ||||||
|  | @ -0,0 +1,118 @@ | ||||||
|  | #include "..\ecommon.h" | ||||||
|  | 
 | ||||||
|  | e2d::EKeyframe::EKeyframe() | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_fSourceClipWidth(0) | ||||||
|  | 	, m_fSourceClipHeight(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EKeyframe::EKeyframe(EImage * texture) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_fSourceClipWidth(0) | ||||||
|  | 	, m_fSourceClipHeight(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	_setImage(texture); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EKeyframe::EKeyframe(const EString & imageFileName) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_fSourceClipWidth(0) | ||||||
|  | 	, m_fSourceClipHeight(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	_setImage(new EImage(imageFileName)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EKeyframe::EKeyframe(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_fSourceClipWidth(0) | ||||||
|  | 	, m_fSourceClipHeight(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	_setImage(new EImage(resourceName, resourceType)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EKeyframe::EKeyframe(EImage * texture, float x, float y, float width, float height) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_fSourceClipWidth(0) | ||||||
|  | 	, m_fSourceClipHeight(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	_setImage(texture); | ||||||
|  | 	_clipTexture(x, y, width, height); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EKeyframe::EKeyframe(const EString & imageFileName, float x, float y, float width, float height) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_fSourceClipWidth(0) | ||||||
|  | 	, m_fSourceClipHeight(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	_setImage(new EImage(imageFileName)); | ||||||
|  | 	_clipTexture(x, y, width, height); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EKeyframe::EKeyframe(LPCTSTR resourceName, LPCTSTR resourceType, float x, float y, float width, float height) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_fSourceClipWidth(0) | ||||||
|  | 	, m_fSourceClipHeight(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	_setImage(new EImage(resourceName, resourceType)); | ||||||
|  | 	_clipTexture(x, y, width, height); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EKeyframe::~EKeyframe() | ||||||
|  | { | ||||||
|  | 	SafeRelease(&m_pImage); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float e2d::EKeyframe::getWidth() const | ||||||
|  | { | ||||||
|  | 	return m_fSourceClipWidth; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float e2d::EKeyframe::getHeight() const | ||||||
|  | { | ||||||
|  | 	return m_fSourceClipHeight; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EImage * e2d::EKeyframe::getImage() const | ||||||
|  | { | ||||||
|  | 	return m_pImage; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EKeyframe::_setImage(EImage * texture) | ||||||
|  | { | ||||||
|  | 	if (texture) | ||||||
|  | 	{ | ||||||
|  | 		SafeRelease(&m_pImage); | ||||||
|  | 		m_pImage = texture; | ||||||
|  | 		m_pImage->retain(); | ||||||
|  | 		m_fSourceClipX = 0; | ||||||
|  | 		m_fSourceClipY = 0; | ||||||
|  | 		m_fSourceClipWidth = texture->getSourceWidth(); | ||||||
|  | 		m_fSourceClipHeight = texture->getSourceHeight(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EKeyframe::_clipTexture(float x, float y, float width, float height) | ||||||
|  | { | ||||||
|  | 	if (m_pImage) | ||||||
|  | 	{ | ||||||
|  | 		m_fSourceClipX = min(max(x, 0), m_pImage->getSourceWidth()); | ||||||
|  | 		m_fSourceClipY = min(max(y, 0), m_pImage->getSourceHeight()); | ||||||
|  | 		m_fSourceClipWidth = min(max(width, 0), m_pImage->getSourceWidth() - m_fSourceClipX); | ||||||
|  | 		m_fSourceClipHeight = min(max(height, 0), m_pImage->getSourceHeight() - m_fSourceClipY); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -3,7 +3,6 @@ | ||||||
| #include "..\emanagers.h" | #include "..\emanagers.h" | ||||||
| #include "..\etools.h" | #include "..\etools.h" | ||||||
| #include "..\eactions.h" | #include "..\eactions.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| 
 | 
 | ||||||
| e2d::EScene::EScene() | e2d::EScene::EScene() | ||||||
|  | @ -16,7 +15,7 @@ e2d::EScene::EScene() | ||||||
| 	m_pRoot->_onEnter(); | 	m_pRoot->_onEnter(); | ||||||
| 	m_pRoot->_setParentScene(this); | 	m_pRoot->_setParentScene(this); | ||||||
| 	m_pRoot->setPivot(0, 0); | 	m_pRoot->setPivot(0, 0); | ||||||
| 	m_pRoot->_setSize(EApp::getWidth(), EApp::getHeight()); | 	m_pRoot->_setSize(EWindow::getWidth(), EWindow::getHeight()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EScene::~EScene() | e2d::EScene::~EScene() | ||||||
|  | @ -24,43 +23,27 @@ e2d::EScene::~EScene() | ||||||
| 	SafeRelease(&m_pRoot); | 	SafeRelease(&m_pRoot); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EScene::onEnter() |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EScene::onExit() |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EScene::onActivate() |  | ||||||
| { |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EScene::onInactive() |  | ||||||
| { |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EScene::onCloseWindow() |  | ||||||
| { |  | ||||||
| 	return true; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EScene::_render() | void e2d::EScene::_render() | ||||||
| { | { | ||||||
| 	// ·ÃÎʸù½Úµã
 | 	m_pRoot->_render(); | ||||||
| 	m_pRoot->_update(); |  | ||||||
| 
 | 
 | ||||||
| 	if (m_bGeometryVisiable) | 	if (m_bGeometryVisiable) | ||||||
| 	{ | 	{ | ||||||
| 		// 恢复矩阵转换
 | 		// 恢复矩阵转换
 | ||||||
| 		GetRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); | 		ERenderer::getRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); | ||||||
| 		// 绘制所有几何图形
 | 		// 绘制所有几何图形
 | ||||||
| 		m_pRoot->_drawGeometry(); | 		m_pRoot->_drawGeometry(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void e2d::EScene::_update() | ||||||
|  | { | ||||||
|  | 	// 执行 onUpdate 函数
 | ||||||
|  | 	this->onUpdate(); | ||||||
|  | 	// 更新根节点
 | ||||||
|  | 	m_pRoot->_update(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void e2d::EScene::add(ENode * child, int order /* = 0 */) | void e2d::EScene::add(ENode * child, int order /* = 0 */) | ||||||
| { | { | ||||||
| 	m_pRoot->addChild(child, order); | 	m_pRoot->addChild(child, order); | ||||||
|  | @ -76,7 +59,7 @@ void e2d::EScene::remove(const EString &childName) | ||||||
| 	return m_pRoot->removeChild(childName); | 	return m_pRoot->removeChild(childName); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::vector<e2d::ENode*>& e2d::EScene::getChildren() | std::vector<e2d::ENode*> e2d::EScene::getChildren() | ||||||
| { | { | ||||||
| 	return m_pRoot->m_vChildren; | 	return m_pRoot->m_vChildren; | ||||||
| } | } | ||||||
|  | @ -22,7 +22,7 @@ EString::EString(const wchar_t *str) | ||||||
| { | { | ||||||
| 	if (str) | 	if (str) | ||||||
| 	{ | 	{ | ||||||
| 		_size = wcslen(str); | 		_size = static_cast<int>(wcslen(str)); | ||||||
| 		_string = new wchar_t[_size + 1]; | 		_string = new wchar_t[_size + 1]; | ||||||
| 		wcscpy_s(_string, _size + 1, str); | 		wcscpy_s(_string, _size + 1, str); | ||||||
| 	} | 	} | ||||||
|  | @ -80,7 +80,7 @@ EString &EString::operator=(const wchar_t *str) | ||||||
| 	if (str) | 	if (str) | ||||||
| 	{ | 	{ | ||||||
| 		delete[] _string; | 		delete[] _string; | ||||||
| 		_size = wcslen(str); | 		_size = static_cast<int>(wcslen(str)); | ||||||
| 		_string = new wchar_t[_size + 1]; | 		_string = new wchar_t[_size + 1]; | ||||||
| 		wcscpy_s(_string, _size + 1, str); | 		wcscpy_s(_string, _size + 1, str); | ||||||
| 	} | 	} | ||||||
|  | @ -214,7 +214,7 @@ EString &EString::operator+=(const wchar_t *str) | ||||||
| { | { | ||||||
| 	if (!str) return *this; | 	if (!str) return *this; | ||||||
| 
 | 
 | ||||||
| 	int d_size = wcslen(str); | 	int d_size = static_cast<int>(wcslen(str)); | ||||||
| 	if (d_size == 0) return *this; | 	if (d_size == 0) return *this; | ||||||
| 
 | 
 | ||||||
| 	wchar_t *str_temp = new wchar_t[_size + d_size + 1]; | 	wchar_t *str_temp = new wchar_t[_size + d_size + 1]; | ||||||
|  | @ -326,7 +326,7 @@ std::wistream & e2d::operator>>(std::wistream &cin, EString &str) | ||||||
| 	str._string = new wchar_t[limit_string_size]; | 	str._string = new wchar_t[limit_string_size]; | ||||||
| 
 | 
 | ||||||
| 	cin >> std::setw(limit_string_size) >> str._string; | 	cin >> std::setw(limit_string_size) >> str._string; | ||||||
| 	str._size = wcslen(str._string); | 	str._size = static_cast<int>(wcslen(str._string)); | ||||||
| 	return cin; | 	return cin; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | #include "..\ecommon.h" | ||||||
|  | 
 | ||||||
|  | e2d::EPhysicsEvent::INTERSECT_RELATION e2d::EPhysicsEvent::s_nRelation = e2d::EPhysicsEvent::UNKNOWN; | ||||||
|  | e2d::EGeometry * e2d::EPhysicsEvent::s_pActiveGeometry = nullptr; | ||||||
|  | e2d::EGeometry * e2d::EPhysicsEvent::s_pPassiveGeometry = nullptr; | ||||||
|  | 
 | ||||||
|  | e2d::EPhysicsEvent::INTERSECT_RELATION e2d::EPhysicsEvent::getMsg() | ||||||
|  | { | ||||||
|  | 	return EPhysicsEvent::s_nRelation; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EGeometry * e2d::EPhysicsEvent::getActiveGeometry() | ||||||
|  | { | ||||||
|  | 	return EPhysicsEvent::s_pActiveGeometry; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EGeometry * e2d::EPhysicsEvent::getPassiveGeometry() | ||||||
|  | { | ||||||
|  | 	return EPhysicsEvent::s_pPassiveGeometry; | ||||||
|  | } | ||||||
|  | @ -1,6 +1,5 @@ | ||||||
| #include "..\egeometry.h" | #include "..\egeometry.h" | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::ECircle::ECircle() | e2d::ECircle::ECircle() | ||||||
| 	: m_pD2dCircle(nullptr) | 	: m_pD2dCircle(nullptr) | ||||||
|  | @ -35,7 +34,7 @@ void e2d::ECircle::_setCircle(EPoint center, float radius) | ||||||
| { | { | ||||||
| 	SafeReleaseInterface(&m_pD2dCircle); | 	SafeReleaseInterface(&m_pD2dCircle); | ||||||
| 
 | 
 | ||||||
| 	GetFactory()->CreateEllipseGeometry( | 	ERenderer::getID2D1Factory()->CreateEllipseGeometry( | ||||||
| 		D2D1::Ellipse( | 		D2D1::Ellipse( | ||||||
| 			D2D1::Point2F( | 			D2D1::Point2F( | ||||||
| 				center.x,  | 				center.x,  | ||||||
|  | @ -1,6 +1,5 @@ | ||||||
| #include "..\egeometry.h" | #include "..\egeometry.h" | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::EEllipse::EEllipse() | e2d::EEllipse::EEllipse() | ||||||
| 	: m_pD2dEllipse(nullptr) | 	: m_pD2dEllipse(nullptr) | ||||||
|  | @ -35,7 +34,7 @@ void e2d::EEllipse::_setEllipse(EPoint center, float radiusX, float radiusY) | ||||||
| { | { | ||||||
| 	SafeReleaseInterface(&m_pD2dEllipse); | 	SafeReleaseInterface(&m_pD2dEllipse); | ||||||
| 
 | 
 | ||||||
| 	GetFactory()->CreateEllipseGeometry( | 	ERenderer::getID2D1Factory()->CreateEllipseGeometry( | ||||||
| 		D2D1::Ellipse( | 		D2D1::Ellipse( | ||||||
| 			D2D1::Point2F( | 			D2D1::Point2F( | ||||||
| 				center.x, | 				center.x, | ||||||
|  | @ -1,7 +1,6 @@ | ||||||
| #include "..\egeometry.h" | #include "..\egeometry.h" | ||||||
| #include "..\emanagers.h" | #include "..\emanagers.h" | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::EGeometry::EGeometry() | e2d::EGeometry::EGeometry() | ||||||
| 	: m_nCategoryBitmask(0) | 	: m_nCategoryBitmask(0) | ||||||
|  | @ -63,21 +62,20 @@ void e2d::EGeometry::_render() | ||||||
| { | { | ||||||
| 	if (m_pTransformedGeometry) | 	if (m_pTransformedGeometry) | ||||||
| 	{ | 	{ | ||||||
|  | 		ID2D1SolidColorBrush * pBrush = ERenderer::getSolidColorBrush(); | ||||||
| 		// 눼쉔뺌岬
 | 		// 눼쉔뺌岬
 | ||||||
| 		GetRenderTarget()->CreateSolidColorBrush( | 		ERenderer::getRenderTarget()->CreateSolidColorBrush( | ||||||
| 			D2D1::ColorF( | 			D2D1::ColorF( | ||||||
| 				m_nColor, | 				m_nColor, | ||||||
| 				m_fOpacity), | 				m_fOpacity), | ||||||
| 			&GetSolidColorBrush() | 			&pBrush | ||||||
| 		); | 		); | ||||||
| 		// 삥齡섯부近榴
 | 		// 삥齡섯부近榴
 | ||||||
| 		GetRenderTarget()->DrawGeometry(m_pTransformedGeometry, GetSolidColorBrush()); | 		ERenderer::getRenderTarget()->DrawGeometry(m_pTransformedGeometry, pBrush); | ||||||
| 		// 释放临时资源
 |  | ||||||
| 		SafeReleaseInterface(&GetSolidColorBrush()); |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EPhysicsMsg::INTERSECT_RELATION e2d::EGeometry::_intersectWith(EGeometry * pGeometry) | e2d::EPhysicsEvent::INTERSECT_RELATION e2d::EGeometry::_intersectWith(EGeometry * pGeometry) | ||||||
| { | { | ||||||
| 	if (m_pTransformedGeometry && pGeometry->m_pTransformedGeometry) | 	if (m_pTransformedGeometry && pGeometry->m_pTransformedGeometry) | ||||||
| 	{ | 	{ | ||||||
|  | @ -89,9 +87,9 @@ e2d::EPhysicsMsg::INTERSECT_RELATION e2d::EGeometry::_intersectWith(EGeometry * | ||||||
| 			&relation | 			&relation | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		return EPhysicsMsg::INTERSECT_RELATION(relation); | 		return EPhysicsEvent::INTERSECT_RELATION(relation); | ||||||
| 	} | 	} | ||||||
| 	return EPhysicsMsg::UNKNOWN; | 	return EPhysicsEvent::UNKNOWN; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EGeometry::_transform() | void e2d::EGeometry::_transform() | ||||||
|  | @ -102,7 +100,7 @@ void e2d::EGeometry::_transform() | ||||||
| 		SafeReleaseInterface(&m_pTransformedGeometry); | 		SafeReleaseInterface(&m_pTransformedGeometry); | ||||||
| 
 | 
 | ||||||
| 		// 몽앴만쌘듐瘻뻣섯부暠近
 | 		// 몽앴만쌘듐瘻뻣섯부暠近
 | ||||||
| 		GetFactory()->CreateTransformedGeometry( | 		ERenderer::getID2D1Factory()->CreateTransformedGeometry( | ||||||
| 			_getD2dGeometry(), | 			_getD2dGeometry(), | ||||||
| 			m_pParentNode->m_MatriFinal, | 			m_pParentNode->m_MatriFinal, | ||||||
| 			&m_pTransformedGeometry | 			&m_pTransformedGeometry | ||||||
|  | @ -1,6 +1,5 @@ | ||||||
| #include "..\egeometry.h" | #include "..\egeometry.h" | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::ERectangle::ERectangle() | e2d::ERectangle::ERectangle() | ||||||
| 	: m_pD2dRectangle(nullptr) | 	: m_pD2dRectangle(nullptr) | ||||||
|  | @ -33,7 +32,7 @@ void e2d::ERectangle::_setRect(float left, float top, float right, float bottom) | ||||||
| { | { | ||||||
| 	SafeReleaseInterface(&m_pD2dRectangle); | 	SafeReleaseInterface(&m_pD2dRectangle); | ||||||
| 
 | 
 | ||||||
| 	GetFactory()->CreateRectangleGeometry( | 	ERenderer::getID2D1Factory()->CreateRectangleGeometry( | ||||||
| 		D2D1::RectF(left, top, right, bottom), | 		D2D1::RectF(left, top, right, bottom), | ||||||
| 		&m_pD2dRectangle | 		&m_pD2dRectangle | ||||||
| 	); | 	); | ||||||
|  | @ -1,59 +0,0 @@ | ||||||
| #include "..\elisteners.h" |  | ||||||
| #include "..\emanagers.h" |  | ||||||
| 
 |  | ||||||
| e2d::EListenerKeyboard::EListenerKeyboard() |  | ||||||
| 	: EListener() |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerKeyboard::EListenerKeyboard(const EString & name) |  | ||||||
| 	: EListener(name) |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerKeyboard::EListenerKeyboard(const KEY_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListener() |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerKeyboard::EListenerKeyboard(const EString & name, const KEY_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListener(name) |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerKeyboard::_callOn() |  | ||||||
| { |  | ||||||
| 	if (m_Callback) |  | ||||||
| 	{ |  | ||||||
| 		m_Callback(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerKeyboard::setCallback(const KEY_LISTENER_CALLBACK & callback) |  | ||||||
| { |  | ||||||
| 	m_Callback = callback; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerKeyboard::bindWith(EScene * pParentScene) |  | ||||||
| { |  | ||||||
| 	WARN_IF(m_pParentNode != nullptr, "A listener cannot bind with two object."); |  | ||||||
| 
 |  | ||||||
| 	if (pParentScene) |  | ||||||
| 	{ |  | ||||||
| 		EMsgManager::bindListener(this, pParentScene); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerKeyboard::bindWith(ENode * pParentNode) |  | ||||||
| { |  | ||||||
| 	WARN_IF(m_pParentNode != nullptr, "A listener cannot bind with two object."); |  | ||||||
| 
 |  | ||||||
| 	if (pParentNode) |  | ||||||
| 	{ |  | ||||||
| 		EMsgManager::bindListener(this, pParentNode); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -1,32 +0,0 @@ | ||||||
| #include "..\elisteners.h" |  | ||||||
| 
 |  | ||||||
| e2d::EListenerKeyboardPress::EListenerKeyboardPress() |  | ||||||
| 	: EListenerKeyboard() |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerKeyboardPress::EListenerKeyboardPress(const EString & name) |  | ||||||
| 	: EListenerKeyboard(name) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerKeyboardPress::EListenerKeyboardPress(const KEY_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListenerKeyboard(callback) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerKeyboardPress::EListenerKeyboardPress(const EString & name, const KEY_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListenerKeyboard(name, callback) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerKeyboardPress::_callOn() |  | ||||||
| { |  | ||||||
| 	if (EKeyboardMsg::getMsg() == EKeyboardMsg::KEY_DOWN) |  | ||||||
| 	{ |  | ||||||
| 		if (m_Callback) |  | ||||||
| 		{ |  | ||||||
| 			m_Callback(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -1,59 +0,0 @@ | ||||||
| #include "..\elisteners.h" |  | ||||||
| #include "..\emanagers.h" |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouse::EListenerMouse() |  | ||||||
| 	: EListener() |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouse::EListenerMouse(const EString & name) |  | ||||||
| 	: EListener(name) |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouse::EListenerMouse(const MOUSE_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListener() |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouse::EListenerMouse(const EString & name, const MOUSE_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListener(name) |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMouse::_callOn() |  | ||||||
| { |  | ||||||
| 	if (m_Callback) |  | ||||||
| 	{ |  | ||||||
| 		m_Callback(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMouse::setCallback(const MOUSE_LISTENER_CALLBACK & callback) |  | ||||||
| { |  | ||||||
| 	m_Callback = callback; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMouse::bindWith(EScene * pParentScene) |  | ||||||
| { |  | ||||||
| 	WARN_IF(m_pParentNode != nullptr, "A listener cannot bind with two object."); |  | ||||||
| 
 |  | ||||||
| 	if (pParentScene) |  | ||||||
| 	{ |  | ||||||
| 		EMsgManager::bindListener(this, pParentScene); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMouse::bindWith(ENode * pParentNode) |  | ||||||
| { |  | ||||||
| 	WARN_IF(m_pParentNode != nullptr, "A listener cannot bind with two object."); |  | ||||||
| 
 |  | ||||||
| 	if (pParentNode != nullptr) |  | ||||||
| 	{ |  | ||||||
| 		EMsgManager::bindListener(this, pParentNode); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -1,51 +0,0 @@ | ||||||
| #include "..\elisteners.h" |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseClick::EListenerMouseClick() |  | ||||||
| 	: EListenerMouse() |  | ||||||
| 	, m_bPressed(false) |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseClick::EListenerMouseClick(const EString & name) |  | ||||||
| 	: EListenerMouse(name) |  | ||||||
| 	, m_bPressed(false) |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseClick::EListenerMouseClick(const MOUSE_CLICK_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListenerMouse() |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| 	, m_bPressed(false) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseClick::EListenerMouseClick(const EString & name, const MOUSE_CLICK_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListenerMouse(name) |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| 	, m_bPressed(false) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMouseClick::_callOn() |  | ||||||
| { |  | ||||||
| 	if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN || |  | ||||||
| 		EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DBLCLK) |  | ||||||
| 	{ |  | ||||||
| 		m_bPressed = true; |  | ||||||
| 	} |  | ||||||
| 	else if (m_bPressed && EMouseMsg::getMsg() == EMouseMsg::LBUTTON_UP) |  | ||||||
| 	{ |  | ||||||
| 		if (m_Callback) |  | ||||||
| 		{ |  | ||||||
| 			m_Callback(EMouseMsg::getPos()); |  | ||||||
| 		} |  | ||||||
| 		m_bPressed = false; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMouseClick::setCallback(const MOUSE_CLICK_LISTENER_CALLBACK & callback) |  | ||||||
| { |  | ||||||
| 	m_Callback = callback; |  | ||||||
| } |  | ||||||
|  | @ -1,54 +0,0 @@ | ||||||
| #include "..\elisteners.h" |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseDoubleClick::EListenerMouseDoubleClick() |  | ||||||
| 	: EListenerMouse() |  | ||||||
| 	, m_bPressed(false) |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseDoubleClick::EListenerMouseDoubleClick(const EString & name) |  | ||||||
| 	: EListenerMouse(name) |  | ||||||
| 	, m_bPressed(false) |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseDoubleClick::EListenerMouseDoubleClick(const MOUSE_DBLCLK_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListenerMouse() |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| 	, m_bPressed(false) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseDoubleClick::EListenerMouseDoubleClick(const EString & name, const MOUSE_DBLCLK_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListenerMouse(name) |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| 	, m_bPressed(false) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMouseDoubleClick::_callOn() |  | ||||||
| { |  | ||||||
| 	if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN) |  | ||||||
| 	{ |  | ||||||
| 		m_bPressed = false; |  | ||||||
| 	} |  | ||||||
| 	else if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DBLCLK) |  | ||||||
| 	{ |  | ||||||
| 		m_bPressed = true; |  | ||||||
| 	} |  | ||||||
| 	else if (m_bPressed && EMouseMsg::getMsg() == EMouseMsg::LBUTTON_UP) |  | ||||||
| 	{ |  | ||||||
| 		if (m_Callback) |  | ||||||
| 		{ |  | ||||||
| 			m_Callback(EMouseMsg::getPos()); |  | ||||||
| 		} |  | ||||||
| 		m_bPressed = false; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMouseDoubleClick::setCallback(const MOUSE_DBLCLK_LISTENER_CALLBACK & callback) |  | ||||||
| { |  | ||||||
| 	m_Callback = callback; |  | ||||||
| } |  | ||||||
|  | @ -1,46 +0,0 @@ | ||||||
| #include "..\elisteners.h" |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseDrag::EListenerMouseDrag() |  | ||||||
| 	: EListenerMouse() |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseDrag::EListenerMouseDrag(const EString & name) |  | ||||||
| 	: EListenerMouse(name) |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseDrag::EListenerMouseDrag(const MOUSE_DRAG_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListenerMouse() |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMouseDrag::EListenerMouseDrag(const EString & name, const MOUSE_DRAG_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListenerMouse(name) |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMouseDrag::_callOn() |  | ||||||
| { |  | ||||||
| 	if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN || |  | ||||||
| 		EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DBLCLK) |  | ||||||
| 	{ |  | ||||||
| 		m_Begin = EMouseMsg::getPos(); |  | ||||||
| 	} |  | ||||||
| 	else if (EMouseMsg::isLButtonDown() && EMouseMsg::getMsg() == EMouseMsg::MOVE) |  | ||||||
| 	{ |  | ||||||
| 		if (m_Callback) |  | ||||||
| 		{ |  | ||||||
| 			m_Callback(m_Begin, EMouseMsg::getPos()); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMouseDrag::setCallback(const MOUSE_DRAG_LISTENER_CALLBACK & callback) |  | ||||||
| { |  | ||||||
| 	m_Callback = callback; |  | ||||||
| } |  | ||||||
|  | @ -1,42 +0,0 @@ | ||||||
| #include "..\elisteners.h" |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMousePress::EListenerMousePress() |  | ||||||
| 	: EListenerMouse() |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMousePress::EListenerMousePress(const EString & name) |  | ||||||
| 	: EListenerMouse(name) |  | ||||||
| 	, m_Callback(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMousePress::EListenerMousePress(const MOUSE_PRESS_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListenerMouse() |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EListenerMousePress::EListenerMousePress(const EString & name, const MOUSE_PRESS_LISTENER_CALLBACK & callback) |  | ||||||
| 	: EListenerMouse(name) |  | ||||||
| 	, m_Callback(callback) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMousePress::_callOn() |  | ||||||
| { |  | ||||||
| 	if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN || |  | ||||||
| 		EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DBLCLK) |  | ||||||
| 	{ |  | ||||||
| 		if (m_Callback) |  | ||||||
| 		{ |  | ||||||
| 			m_Callback(EMouseMsg::getPos()); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EListenerMousePress::setCallback(const MOUSE_PRESS_LISTENER_CALLBACK & callback) |  | ||||||
| { |  | ||||||
| 	m_Callback = callback; |  | ||||||
| } |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| #include "..\elisteners.h" | #include "..\elisteners.h" | ||||||
|  | #include "..\emanagers.h" | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| 
 | 
 | ||||||
| e2d::EListener::EListener() | e2d::EListener::EListener() | ||||||
|  | @ -62,9 +63,9 @@ bool e2d::EListener::_isReady() const | ||||||
| { | { | ||||||
| 	if (m_bRunning && m_pParentNode) | 	if (m_bRunning && m_pParentNode) | ||||||
| 	{ | 	{ | ||||||
| 		if (m_pParentNode->getParentScene() == EApp::getCurrentScene()) | 		if (m_pParentNode->getParentScene() == ESceneManager::getCurrentScene()) | ||||||
| 		{ | 		{ | ||||||
| 			if (!EApp::isPaused() || m_bAlways) | 			if (!EGame::isPaused() || m_bAlways) | ||||||
| 				return true; | 				return true; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -14,13 +14,13 @@ e2d::EListenerPhysics::EListenerPhysics(const EString & name) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EListenerPhysics::EListenerPhysics(const PHYSICS_LISTENER_CALLBACK & callback) | e2d::EListenerPhysics::EListenerPhysics(const PhysLsnrCallback & callback) | ||||||
| 	: EListener() | 	: EListener() | ||||||
| 	, m_Callback(callback) | 	, m_Callback(callback) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EListenerPhysics::EListenerPhysics(const EString & name, const PHYSICS_LISTENER_CALLBACK & callback) | e2d::EListenerPhysics::EListenerPhysics(const EString & name, const PhysLsnrCallback & callback) | ||||||
| 	: EListener(name) | 	: EListener(name) | ||||||
| 	, m_Callback(callback) | 	, m_Callback(callback) | ||||||
| { | { | ||||||
|  | @ -34,7 +34,7 @@ void e2d::EListenerPhysics::_callOn() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EListenerPhysics::setCallback(const PHYSICS_LISTENER_CALLBACK & callback) | void e2d::EListenerPhysics::setCallback(const PhysLsnrCallback & callback) | ||||||
| { | { | ||||||
| 	m_Callback = callback; | 	m_Callback = callback; | ||||||
| } | } | ||||||
|  | @ -13,13 +13,13 @@ e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const EString & name) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const COLLISION_LISTENER_CALLBACK & callback) | e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const ClsLsnrCallback & callback) | ||||||
| 	: EListenerPhysics() | 	: EListenerPhysics() | ||||||
| 	, m_Callback(callback) | 	, m_Callback(callback) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const EString & name, const COLLISION_LISTENER_CALLBACK & callback) | e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const EString & name, const ClsLsnrCallback & callback) | ||||||
| 	: EListenerPhysics(name) | 	: EListenerPhysics(name) | ||||||
| 	, m_Callback(callback) | 	, m_Callback(callback) | ||||||
| { | { | ||||||
|  | @ -27,9 +27,9 @@ e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const EString & name, | ||||||
| 
 | 
 | ||||||
| void e2d::EListenerPhysicsCollision::_callOn() | void e2d::EListenerPhysicsCollision::_callOn() | ||||||
| { | { | ||||||
| 	if (EPhysicsMsg::getMsg() == EPhysicsMsg::OVERLAP || | 	if (EPhysicsEvent::getMsg() == EPhysicsEvent::OVERLAP || | ||||||
| 		EPhysicsMsg::getMsg() == EPhysicsMsg::CONTAINS ||  | 		EPhysicsEvent::getMsg() == EPhysicsEvent::CONTAINS ||  | ||||||
| 		EPhysicsMsg::getMsg() == EPhysicsMsg::IS_CONTAINED) | 		EPhysicsEvent::getMsg() == EPhysicsEvent::IS_CONTAINED) | ||||||
| 	{ | 	{ | ||||||
| 		if (m_Callback) | 		if (m_Callback) | ||||||
| 		{ | 		{ | ||||||
|  | @ -1,6 +1,5 @@ | ||||||
| #include "..\emanagers.h" | #include "..\emanagers.h" | ||||||
| #include "..\eactions.h" | #include "..\eactions.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| static std::vector<e2d::EAction*> s_vActions; | static std::vector<e2d::EAction*> s_vActions; | ||||||
| 
 | 
 | ||||||
|  | @ -17,7 +16,7 @@ void e2d::EActionManager::addAction(EAction * action) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionManager::startAllActionsBindedWith(ENode * pTargetNode) | void e2d::EActionManager::resumeAllActionsBindedWith(ENode * pTargetNode) | ||||||
| { | { | ||||||
| 	if (pTargetNode) | 	if (pTargetNode) | ||||||
| 	{ | 	{ | ||||||
|  | @ -30,7 +29,7 @@ void e2d::EActionManager::startAllActionsBindedWith(ENode * pTargetNode) | ||||||
| 		} | 		} | ||||||
| 		for (auto child = pTargetNode->getChildren().begin(); child != pTargetNode->getChildren().end(); child++) | 		for (auto child = pTargetNode->getChildren().begin(); child != pTargetNode->getChildren().end(); child++) | ||||||
| 		{ | 		{ | ||||||
| 			EActionManager::startAllActionsBindedWith((*child)); | 			EActionManager::resumeAllActionsBindedWith((*child)); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -71,7 +70,7 @@ void e2d::EActionManager::stopAllActionsBindedWith(ENode * pTargetNode) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionManager::_clearAllActionsBindedWith(ENode * pTargetNode) | void e2d::EActionManager::__clearAllActionsBindedWith(ENode * pTargetNode) | ||||||
| { | { | ||||||
| 	if (pTargetNode) | 	if (pTargetNode) | ||||||
| 	{ | 	{ | ||||||
|  | @ -91,17 +90,17 @@ void e2d::EActionManager::_clearAllActionsBindedWith(ENode * pTargetNode) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionManager::startAllActions() | void e2d::EActionManager::resumeAllActions() | ||||||
| { | { | ||||||
| 	for (auto child = EApp::getCurrentScene()->getChildren().begin(); child != EApp::getCurrentScene()->getChildren().end(); child++) | 	for (auto child = ESceneManager::getCurrentScene()->getChildren().begin(); child != ESceneManager::getCurrentScene()->getChildren().end(); child++) | ||||||
| 	{ | 	{ | ||||||
| 		EActionManager::startAllActionsBindedWith((*child)); | 		EActionManager::resumeAllActionsBindedWith((*child)); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionManager::pauseAllActions() | void e2d::EActionManager::pauseAllActions() | ||||||
| { | { | ||||||
| 	for (auto child = EApp::getCurrentScene()->getChildren().begin(); child != EApp::getCurrentScene()->getChildren().end(); child++) | 	for (auto child = ESceneManager::getCurrentScene()->getChildren().begin(); child != ESceneManager::getCurrentScene()->getChildren().end(); child++) | ||||||
| 	{ | 	{ | ||||||
| 		EActionManager::pauseAllActionsBindedWith((*child)); | 		EActionManager::pauseAllActionsBindedWith((*child)); | ||||||
| 	} | 	} | ||||||
|  | @ -109,18 +108,13 @@ void e2d::EActionManager::pauseAllActions() | ||||||
| 
 | 
 | ||||||
| void e2d::EActionManager::stopAllActions() | void e2d::EActionManager::stopAllActions() | ||||||
| { | { | ||||||
| 	for (auto child = EApp::getCurrentScene()->getChildren().begin(); child != EApp::getCurrentScene()->getChildren().end(); child++) | 	for (auto child = ESceneManager::getCurrentScene()->getChildren().begin(); child != ESceneManager::getCurrentScene()->getChildren().end(); child++) | ||||||
| 	{ | 	{ | ||||||
| 		EActionManager::stopAllActionsBindedWith((*child)); | 		EActionManager::stopAllActionsBindedWith((*child)); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionManager::_clearManager() | void e2d::EActionManager::__resetAllActions() | ||||||
| { |  | ||||||
| 	s_vActions.clear(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EActionManager::_resetAllActions() |  | ||||||
| { | { | ||||||
| 	for (auto action = s_vActions.begin(); action != s_vActions.end(); action++) | 	for (auto action = s_vActions.begin(); action != s_vActions.end(); action++) | ||||||
| 	{ | 	{ | ||||||
|  | @ -128,7 +122,7 @@ void e2d::EActionManager::_resetAllActions() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EActionManager::ActionProc() | void e2d::EActionManager::__update() | ||||||
| { | { | ||||||
| 	if (s_vActions.empty()) | 	if (s_vActions.empty()) | ||||||
| 		return; | 		return; | ||||||
|  | @ -139,7 +133,7 @@ void e2d::EActionManager::ActionProc() | ||||||
| 		auto &action = s_vActions[i]; | 		auto &action = s_vActions[i]; | ||||||
| 		// »ñÈ¡¶¯×÷ÔËÐÐ״̬
 | 		// »ñÈ¡¶¯×÷ÔËÐÐ״̬
 | ||||||
| 		if (action->isRunning() || | 		if (action->isRunning() || | ||||||
| 			(action->getTarget() && action->getTarget()->getParentScene() == EApp::getCurrentScene())) | 			(action->getTarget() && action->getTarget()->getParentScene() == ESceneManager::getCurrentScene())) | ||||||
| 		{ | 		{ | ||||||
| 			if (action->_isEnding()) | 			if (action->_isEnding()) | ||||||
| 			{ | 			{ | ||||||
|  | @ -1,331 +0,0 @@ | ||||||
| #include "..\emanagers.h" |  | ||||||
| #include "..\elisteners.h" |  | ||||||
| #include "..\enodes.h" |  | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 鼠标消息监听器
 |  | ||||||
| std::vector<e2d::EListenerMouse*> s_vMouseListeners; |  | ||||||
| // 按键消息监听器
 |  | ||||||
| std::vector<e2d::EListenerKeyboard*> s_vKeyboardListeners; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::MouseProc(UINT message, WPARAM wParam, LPARAM lParam) |  | ||||||
| { |  | ||||||
| 	// 保存鼠标消息
 |  | ||||||
| 	EMouseMsg::s_nMsg = message; |  | ||||||
| 	EMouseMsg::s_wParam = wParam; |  | ||||||
| 	EMouseMsg::s_lParam = lParam; |  | ||||||
| 
 |  | ||||||
| 	if (s_vMouseListeners.empty()) return; |  | ||||||
| 
 |  | ||||||
| 	// 执行鼠标消息监听函数
 |  | ||||||
| 	size_t i = s_vMouseListeners.size(); |  | ||||||
| 
 |  | ||||||
| 	do |  | ||||||
| 	{ |  | ||||||
| 		auto mlistener = s_vMouseListeners[--i]; |  | ||||||
| 
 |  | ||||||
| 		if (mlistener->_isReady()) |  | ||||||
| 		{ |  | ||||||
| 			mlistener->_callOn(); |  | ||||||
| 			if (mlistener->m_bSwallow) |  | ||||||
| 				break; |  | ||||||
| 		} |  | ||||||
| 	} while (i != 0); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::KeyboardProc(UINT message, WPARAM wParam, LPARAM lParam) |  | ||||||
| { |  | ||||||
| 	// 保存按键消息
 |  | ||||||
| 	EKeyboardMsg::s_nMsg = message; |  | ||||||
| 	EKeyboardMsg::s_wParam = wParam; |  | ||||||
| 	EKeyboardMsg::s_lParam = lParam; |  | ||||||
| 
 |  | ||||||
| 	if (s_vKeyboardListeners.empty()) return; |  | ||||||
| 
 |  | ||||||
| 	// 执行按键消息监听函数
 |  | ||||||
| 	size_t i = s_vKeyboardListeners.size(); |  | ||||||
| 
 |  | ||||||
| 	do |  | ||||||
| 	{ |  | ||||||
| 		auto klistener = s_vKeyboardListeners[--i]; |  | ||||||
| 
 |  | ||||||
| 		if (klistener->_isReady()) |  | ||||||
| 		{ |  | ||||||
| 			klistener->_callOn(); |  | ||||||
| 			if (klistener->m_bSwallow) |  | ||||||
| 				break; |  | ||||||
| 		} |  | ||||||
| 	} while (i != 0); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::bindListener(e2d::EListenerMouse * listener, EScene * pParentScene) |  | ||||||
| { |  | ||||||
| 	EMsgManager::bindListener(listener, pParentScene->getRoot()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::bindListener(EListenerKeyboard * listener, EScene * pParentScene) |  | ||||||
| { |  | ||||||
| 	EMsgManager::bindListener(listener, pParentScene->getRoot()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::bindListener(EListenerMouse * listener, ENode * pParentNode) |  | ||||||
| { |  | ||||||
| 	WARN_IF(listener == nullptr, "EListenerMouse NULL pointer exception!"); |  | ||||||
| 	WARN_IF(pParentNode == nullptr, "Bind EListenerMouse with a NULL ENode pointer!"); |  | ||||||
| 
 |  | ||||||
| 	if (listener && pParentNode) |  | ||||||
| 	{ |  | ||||||
| 		ASSERT( |  | ||||||
| 			!listener->m_pParentNode, |  | ||||||
| 			"The listener is already binded, it cannot bind again!" |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		listener->start(); |  | ||||||
| 		listener->retain(); |  | ||||||
| 		listener->m_pParentNode = pParentNode; |  | ||||||
| 		s_vMouseListeners.push_back(listener); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::bindListener(EListenerKeyboard * listener, ENode * pParentNode) |  | ||||||
| { |  | ||||||
| 	WARN_IF(listener == nullptr, "EListenerKeyboard NULL pointer exception!"); |  | ||||||
| 	WARN_IF(pParentNode == nullptr, "Bind EListenerKeyboard with a NULL ENode pointer!"); |  | ||||||
| 
 |  | ||||||
| 	if (listener && pParentNode) |  | ||||||
| 	{ |  | ||||||
| 		ASSERT( |  | ||||||
| 			!listener->m_pParentNode, |  | ||||||
| 			"The listener is already binded, it cannot bind again!" |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		listener->start(); |  | ||||||
| 		listener->retain(); |  | ||||||
| 		listener->m_pParentNode = pParentNode; |  | ||||||
| 		s_vKeyboardListeners.push_back(listener); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::startMouseListeners(const EString & name) |  | ||||||
| { |  | ||||||
| 	for (auto l = s_vMouseListeners.begin(); l != s_vMouseListeners.end(); l++) |  | ||||||
| 	{ |  | ||||||
| 		if ((*l)->getName() == name) |  | ||||||
| 		{ |  | ||||||
| 			(*l)->start(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::stopMouseListeners(const EString & name) |  | ||||||
| { |  | ||||||
| 	for (auto l = s_vMouseListeners.begin(); l != s_vMouseListeners.end(); l++) |  | ||||||
| 	{ |  | ||||||
| 		if ((*l)->getName() == name) |  | ||||||
| 		{ |  | ||||||
| 			(*l)->stop(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::delMouseListeners(const EString & name) |  | ||||||
| { |  | ||||||
| 	// 删除鼠标消息监听器
 |  | ||||||
| 	std::vector<EListenerMouse*>::iterator mIter; |  | ||||||
| 	for (mIter = s_vMouseListeners.begin(); mIter != s_vMouseListeners.end();) |  | ||||||
| 	{ |  | ||||||
| 		if ((*mIter)->getName() == name) |  | ||||||
| 		{ |  | ||||||
| 			SafeRelease(&(*mIter)); |  | ||||||
| 			mIter = s_vMouseListeners.erase(mIter); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			mIter++; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::startKeyboardListeners(const EString & name) |  | ||||||
| { |  | ||||||
| 	// 启动按键消息监听器
 |  | ||||||
| 	for (auto l = s_vKeyboardListeners.begin(); l != s_vKeyboardListeners.end(); l++) |  | ||||||
| 	{ |  | ||||||
| 		if ((*l)->getName() == name) |  | ||||||
| 		{ |  | ||||||
| 			(*l)->start(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::stopKeyboardListeners(const EString & name) |  | ||||||
| { |  | ||||||
| 	// 停止按键消息监听器
 |  | ||||||
| 	for (auto l = s_vKeyboardListeners.begin(); l != s_vKeyboardListeners.end(); l++) |  | ||||||
| 	{ |  | ||||||
| 		if ((*l)->getName() == name) |  | ||||||
| 		{ |  | ||||||
| 			(*l)->stop(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::delKeyboardListeners(const EString & name) |  | ||||||
| { |  | ||||||
| 	// 删除按键消息监听器
 |  | ||||||
| 	std::vector<EListenerKeyboard*>::iterator kIter; |  | ||||||
| 	for (kIter = s_vKeyboardListeners.begin(); kIter != s_vKeyboardListeners.end();) |  | ||||||
| 	{ |  | ||||||
| 		if ((*kIter)->getName() == name) |  | ||||||
| 		{ |  | ||||||
| 			SafeRelease(&(*kIter)); |  | ||||||
| 			kIter = s_vKeyboardListeners.erase(kIter); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			kIter++; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::startAllMouseListenersBindedWith(EScene * pParentScene) |  | ||||||
| { |  | ||||||
| 	EMsgManager::startAllMouseListenersBindedWith(pParentScene->getRoot()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::stopAllMouseListenersBindedWith(EScene * pParentScene) |  | ||||||
| { |  | ||||||
| 	EMsgManager::stopAllMouseListenersBindedWith(pParentScene->getRoot()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::startAllMouseListenersBindedWith(ENode * pParentNode) |  | ||||||
| { |  | ||||||
| 	for (auto l = s_vMouseListeners.begin(); l != s_vMouseListeners.end(); l++) |  | ||||||
| 	{ |  | ||||||
| 		if ((*l)->getParentNode() == pParentNode) |  | ||||||
| 		{ |  | ||||||
| 			(*l)->start(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	for (auto child = pParentNode->getChildren().begin(); child != pParentNode->getChildren().end(); child++) |  | ||||||
| 	{ |  | ||||||
| 		EMsgManager::startAllMouseListenersBindedWith((*child)); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::stopAllMouseListenersBindedWith(ENode * pParentNode) |  | ||||||
| { |  | ||||||
| 	for (auto l = s_vMouseListeners.begin(); l != s_vMouseListeners.end(); l++) |  | ||||||
| 	{ |  | ||||||
| 		if ((*l)->getParentNode() == pParentNode) |  | ||||||
| 		{ |  | ||||||
| 			(*l)->stop(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	for (auto child = pParentNode->getChildren().begin(); child != pParentNode->getChildren().end(); child++) |  | ||||||
| 	{ |  | ||||||
| 		EMsgManager::stopAllMouseListenersBindedWith((*child)); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::startAllKeyboardListenersBindedWith(EScene * pParentScene) |  | ||||||
| { |  | ||||||
| 	EMsgManager::startAllKeyboardListenersBindedWith(pParentScene->getRoot()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::stopAllKeyboardListenersBindedWith(EScene * pParentScene) |  | ||||||
| { |  | ||||||
| 	EMsgManager::stopAllKeyboardListenersBindedWith(pParentScene->getRoot()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::startAllKeyboardListenersBindedWith(ENode * pParentNode) |  | ||||||
| { |  | ||||||
| 	for (auto l = s_vKeyboardListeners.begin(); l != s_vKeyboardListeners.end(); l++) |  | ||||||
| 	{ |  | ||||||
| 		if ((*l)->getParentNode() == pParentNode) |  | ||||||
| 		{ |  | ||||||
| 			(*l)->start(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	for (auto child = pParentNode->getChildren().begin(); child != pParentNode->getChildren().end(); child++) |  | ||||||
| 	{ |  | ||||||
| 		EMsgManager::startAllKeyboardListenersBindedWith((*child)); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::stopAllKeyboardListenersBindedWith(ENode * pParentNode) |  | ||||||
| { |  | ||||||
| 	for (auto l = s_vKeyboardListeners.begin(); l != s_vKeyboardListeners.end(); l++) |  | ||||||
| 	{ |  | ||||||
| 		if ((*l)->getParentNode() == pParentNode) |  | ||||||
| 		{ |  | ||||||
| 			(*l)->stop(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	for (auto child = pParentNode->getChildren().begin(); child != pParentNode->getChildren().end(); child++) |  | ||||||
| 	{ |  | ||||||
| 		EMsgManager::stopAllKeyboardListenersBindedWith((*child)); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::_clearAllMouseListenersBindedWith(ENode * pParentNode) |  | ||||||
| { |  | ||||||
| 	for (size_t i = 0; i < s_vMouseListeners.size();) |  | ||||||
| 	{ |  | ||||||
| 		auto t = s_vMouseListeners[i]; |  | ||||||
| 		if (t->getParentNode() == pParentNode) |  | ||||||
| 		{ |  | ||||||
| 			SafeRelease(&t); |  | ||||||
| 			s_vMouseListeners.erase(s_vMouseListeners.begin() + i); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			i++; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::_clearAllKeyboardListenersBindedWith(ENode * pParentNode) |  | ||||||
| { |  | ||||||
| 	for (size_t i = 0; i < s_vKeyboardListeners.size();) |  | ||||||
| 	{ |  | ||||||
| 		auto t = s_vKeyboardListeners[i]; |  | ||||||
| 		if (t->getParentNode() == pParentNode) |  | ||||||
| 		{ |  | ||||||
| 			SafeRelease(&t); |  | ||||||
| 			s_vKeyboardListeners.erase(s_vKeyboardListeners.begin() + i); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			i++; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::_clearManager() |  | ||||||
| { |  | ||||||
| 	s_vMouseListeners.clear(); |  | ||||||
| 	s_vKeyboardListeners.clear(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::startAllMouseListeners() |  | ||||||
| { |  | ||||||
| 	EMsgManager::startAllMouseListenersBindedWith(EApp::getCurrentScene()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::stopAllMouseListeners() |  | ||||||
| { |  | ||||||
| 	EMsgManager::stopAllMouseListenersBindedWith(EApp::getCurrentScene()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::startAllKeyboardListeners() |  | ||||||
| { |  | ||||||
| 	EMsgManager::startAllKeyboardListenersBindedWith(EApp::getCurrentScene()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMsgManager::stopAllKeyboardListeners() |  | ||||||
| { |  | ||||||
| 	EMsgManager::stopAllKeyboardListenersBindedWith(EApp::getCurrentScene()); |  | ||||||
| } |  | ||||||
|  | @ -11,18 +11,18 @@ std::vector<e2d::EGeometry*> s_vGeometries; | ||||||
| 
 | 
 | ||||||
| void e2d::EPhysicsManager::PhysicsGeometryProc(EGeometry * pActiveGeometry) | void e2d::EPhysicsManager::PhysicsGeometryProc(EGeometry * pActiveGeometry) | ||||||
| { | { | ||||||
| 	if (s_vListeners.empty() || s_vGeometries.empty() || EApp::isPaused()) | 	if (s_vListeners.empty() || s_vGeometries.empty() || EGame::isPaused()) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	// pActiveGeometry 为主动方
 | 	// pActiveGeometry 为主动方
 | ||||||
| 	EPhysicsMsg::s_pActiveGeometry = pActiveGeometry; | 	EPhysicsEvent::s_pActiveGeometry = pActiveGeometry; | ||||||
| 	// 判断变化后的状态
 | 	// 判断变化后的状态
 | ||||||
| 	for (UINT i = 0; i < s_vGeometries.size(); i++) | 	for (UINT i = 0; i < s_vGeometries.size(); i++) | ||||||
| 	{ | 	{ | ||||||
| 		auto pPassiveGeometry = s_vGeometries[i]; | 		auto pPassiveGeometry = s_vGeometries[i]; | ||||||
| 		// 不与其他场景的物体判断
 | 		// 不与其他场景的物体判断
 | ||||||
| 		if (!pPassiveGeometry->getParentNode() ||  | 		if (!pPassiveGeometry->getParentNode() ||  | ||||||
| 			(pPassiveGeometry->getParentNode()->getParentScene() != EApp::getCurrentScene())) | 			(pPassiveGeometry->getParentNode()->getParentScene() != ESceneManager::getCurrentScene())) | ||||||
| 			continue; | 			continue; | ||||||
| 
 | 
 | ||||||
| 		if (pActiveGeometry != pPassiveGeometry) | 		if (pActiveGeometry != pPassiveGeometry) | ||||||
|  | @ -31,12 +31,12 @@ void e2d::EPhysicsManager::PhysicsGeometryProc(EGeometry * pActiveGeometry) | ||||||
| 			if (pActiveGeometry->m_nCollisionBitmask & pPassiveGeometry->m_nCategoryBitmask) | 			if (pActiveGeometry->m_nCollisionBitmask & pPassiveGeometry->m_nCategoryBitmask) | ||||||
| 			{ | 			{ | ||||||
| 				// pPassiveGeometry 为被动方
 | 				// pPassiveGeometry 为被动方
 | ||||||
| 				EPhysicsMsg::s_pPassiveGeometry = pPassiveGeometry; | 				EPhysicsEvent::s_pPassiveGeometry = pPassiveGeometry; | ||||||
| 				// 获取两方的关系
 | 				// 获取两方的关系
 | ||||||
| 				EPhysicsMsg::s_nRelation = pActiveGeometry->_intersectWith(pPassiveGeometry); | 				EPhysicsEvent::s_nRelation = pActiveGeometry->_intersectWith(pPassiveGeometry); | ||||||
| 				// 如果关系不为未知或无交集,响应监听器
 | 				// 如果关系不为未知或无交集,响应监听器
 | ||||||
| 				if (EPhysicsMsg::s_nRelation != EPhysicsMsg::UNKNOWN && | 				if (EPhysicsEvent::s_nRelation != EPhysicsEvent::UNKNOWN && | ||||||
| 					EPhysicsMsg::s_nRelation != EPhysicsMsg::DISJOINT) | 					EPhysicsEvent::s_nRelation != EPhysicsEvent::DISJOINT) | ||||||
| 				{ | 				{ | ||||||
| 					// 执行监听器
 | 					// 执行监听器
 | ||||||
| 					PhysicsListenerProc(); | 					PhysicsListenerProc(); | ||||||
|  | @ -194,12 +194,12 @@ void e2d::EPhysicsManager::stopAllListenersBindedWith(ENode * pParentNode) | ||||||
| 
 | 
 | ||||||
| void e2d::EPhysicsManager::startAllListeners() | void e2d::EPhysicsManager::startAllListeners() | ||||||
| { | { | ||||||
| 	EPhysicsManager::startAllListenersBindedWith(EApp::getCurrentScene()); | 	EPhysicsManager::startAllListenersBindedWith(ESceneManager::getCurrentScene()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EPhysicsManager::stopAllListeners() | void e2d::EPhysicsManager::stopAllListeners() | ||||||
| { | { | ||||||
| 	EPhysicsManager::stopAllListenersBindedWith(EApp::getCurrentScene()); | 	EPhysicsManager::stopAllListenersBindedWith(ESceneManager::getCurrentScene()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EPhysicsManager::_clearManager() | void e2d::EPhysicsManager::_clearManager() | ||||||
|  | @ -0,0 +1,148 @@ | ||||||
|  | #include "..\emanagers.h" | ||||||
|  | #include "..\ebase.h" | ||||||
|  | #include "..\etransitions.h" | ||||||
|  | #include <stack> | ||||||
|  | 
 | ||||||
|  | static e2d::EScene * s_pCurrentScene = nullptr; | ||||||
|  | static e2d::EScene * s_pNextScene = nullptr; | ||||||
|  | static e2d::ETransition * s_pTransition = nullptr; | ||||||
|  | static std::stack<e2d::EScene*> s_SceneStack; | ||||||
|  | 
 | ||||||
|  | void e2d::ESceneManager::enterScene(EScene * scene, ETransition * transition /* = nullptr */, bool saveCurrentScene /* = true */) | ||||||
|  | { | ||||||
|  | 	ASSERT(scene != nullptr, "Next scene NULL pointer exception!"); | ||||||
|  | 	scene->retain(); | ||||||
|  | 
 | ||||||
|  | 	// 保存下一场景的指针
 | ||||||
|  | 	s_pNextScene = scene; | ||||||
|  | 	 | ||||||
|  | 	// 设置切换场景动画
 | ||||||
|  | 	if (transition) | ||||||
|  | 	{ | ||||||
|  | 		s_pTransition = transition; | ||||||
|  | 		transition->retain(); | ||||||
|  | 		transition->_setTarget( | ||||||
|  | 			s_pCurrentScene, | ||||||
|  | 			s_pNextScene | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (s_pCurrentScene) | ||||||
|  | 	{ | ||||||
|  | 		s_pCurrentScene->m_bWillSave = saveCurrentScene; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESceneManager::backScene(ETransition * transition /* = nullptr */) | ||||||
|  | { | ||||||
|  | 	// 栈为空时,调用返回场景函数失败
 | ||||||
|  | 	WARN_IF(s_SceneStack.size() == 0, "Scene stack now is empty!"); | ||||||
|  | 	if (s_SceneStack.size() == 0) return; | ||||||
|  | 
 | ||||||
|  | 	// 从栈顶取出场景指针,作为下一场景
 | ||||||
|  | 	s_pNextScene = s_SceneStack.top(); | ||||||
|  | 	s_SceneStack.pop(); | ||||||
|  | 
 | ||||||
|  | 	// 返回上一场景时,不保存当前场景
 | ||||||
|  | 	if (s_pCurrentScene) | ||||||
|  | 	{ | ||||||
|  | 		s_pCurrentScene->m_bWillSave = false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 设置切换场景动画
 | ||||||
|  | 	if (transition) | ||||||
|  | 	{ | ||||||
|  | 		s_pTransition = transition; | ||||||
|  | 		transition->retain(); | ||||||
|  | 		transition->_setTarget( | ||||||
|  | 			s_pCurrentScene, | ||||||
|  | 			s_pNextScene | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESceneManager::clearScene() | ||||||
|  | { | ||||||
|  | 	// 清空场景栈
 | ||||||
|  | 	while (s_SceneStack.size()) | ||||||
|  | 	{ | ||||||
|  | 		auto temp = s_SceneStack.top(); | ||||||
|  | 		SafeRelease(&temp); | ||||||
|  | 		s_SceneStack.pop(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EScene * e2d::ESceneManager::getCurrentScene() | ||||||
|  | { | ||||||
|  | 	return s_pCurrentScene; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESceneManager::__update() | ||||||
|  | { | ||||||
|  | 	// 正在切换场景时,执行场景切换动画
 | ||||||
|  | 	if (s_pTransition) | ||||||
|  | 	{ | ||||||
|  | 		s_pTransition->_update(); | ||||||
|  | 		if (s_pTransition->isEnding()) | ||||||
|  | 		{ | ||||||
|  | 			s_pTransition->release(); | ||||||
|  | 			s_pTransition = nullptr; | ||||||
|  | 		} | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 下一场景指针不为空时,切换场景
 | ||||||
|  | 	if (s_pNextScene) | ||||||
|  | 	{ | ||||||
|  | 		// 进入下一场景
 | ||||||
|  | 		__enterNextScene(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 断言当前场景非空
 | ||||||
|  | 	ASSERT(s_pCurrentScene != nullptr, "Current scene NULL pointer exception."); | ||||||
|  | 
 | ||||||
|  | 	// 更新场景内容
 | ||||||
|  | 	s_pCurrentScene->_update(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESceneManager::__render() | ||||||
|  | { | ||||||
|  | 	// 绘制当前场景
 | ||||||
|  | 	if (s_pCurrentScene) | ||||||
|  | 	{ | ||||||
|  | 		s_pCurrentScene->_render(); | ||||||
|  | 	} | ||||||
|  | 	// 切换场景时,同时绘制两场景
 | ||||||
|  | 	if (s_pTransition && s_pNextScene) | ||||||
|  | 	{ | ||||||
|  | 		s_pNextScene->_render(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESceneManager::__enterNextScene() | ||||||
|  | { | ||||||
|  | 	if (s_pNextScene == nullptr) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	// 执行当前场景的 onCloseWindow 函数
 | ||||||
|  | 	if (s_pCurrentScene) | ||||||
|  | 	{ | ||||||
|  | 		s_pCurrentScene->onExit(); | ||||||
|  | 
 | ||||||
|  | 		if (s_pCurrentScene->m_bWillSave) | ||||||
|  | 		{ | ||||||
|  | 			// 若要保存当前场景,把它放入栈中
 | ||||||
|  | 			s_SceneStack.push(s_pCurrentScene); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			SafeRelease(&s_pCurrentScene); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 执行下一场景的 onEnter 函数
 | ||||||
|  | 	s_pNextScene->onEnter(); | ||||||
|  | 
 | ||||||
|  | 	s_pCurrentScene = s_pNextScene;		// 切换场景
 | ||||||
|  | 	s_pNextScene = nullptr;				// 下一场景置空
 | ||||||
|  | } | ||||||
|  | @ -1,12 +1,11 @@ | ||||||
| #include "..\emanagers.h" | #include "..\emanagers.h" | ||||||
| #include "..\etools.h" | #include "..\etools.h" | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| static std::vector<e2d::ETimer*> s_vTimers; | static std::vector<e2d::ETimer*> s_vTimers; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void e2d::ETimerManager::TimerProc() | void e2d::ETimerManager::__update() | ||||||
| { | { | ||||||
| 	if (s_vTimers.empty()) | 	if (s_vTimers.empty()) | ||||||
| 		return; | 		return; | ||||||
|  | @ -124,7 +123,7 @@ void e2d::ETimerManager::stopAllTimersBindedWith(ENode * pParentNode) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETimerManager::_clearAllTimersBindedWith(ENode * pParentNode) | void e2d::ETimerManager::__clearAllTimersBindedWith(ENode * pParentNode) | ||||||
| { | { | ||||||
| 	for (size_t i = 0; i < s_vTimers.size();) | 	for (size_t i = 0; i < s_vTimers.size();) | ||||||
| 	{ | 	{ | ||||||
|  | @ -141,25 +140,20 @@ void e2d::ETimerManager::_clearAllTimersBindedWith(ENode * pParentNode) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETimerManager::_clearManager() | void e2d::ETimerManager::__resetAllTimers() | ||||||
| { |  | ||||||
| 	s_vTimers.clear(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ETimerManager::_resetAllTimers() |  | ||||||
| { | { | ||||||
| 	for (auto timer = s_vTimers.begin(); timer != s_vTimers.end(); timer++) | 	for (auto timer = s_vTimers.begin(); timer != s_vTimers.end(); timer++) | ||||||
| 	{ | 	{ | ||||||
| 		(*timer)->m_tLast = GetNow(); | 		(*timer)->m_fLast = ETime::getTotalTime(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETimerManager::startAllTimers() | void e2d::ETimerManager::startAllTimers() | ||||||
| { | { | ||||||
| 	ETimerManager::startAllTimersBindedWith(EApp::getCurrentScene()); | 	ETimerManager::startAllTimersBindedWith(ESceneManager::getCurrentScene()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETimerManager::stopAllTimers() | void e2d::ETimerManager::stopAllTimers() | ||||||
| { | { | ||||||
| 	ETimerManager::stopAllTimersBindedWith(EApp::getCurrentScene()); | 	ETimerManager::stopAllTimersBindedWith(ESceneManager::getCurrentScene()); | ||||||
| } | } | ||||||
|  | @ -1,56 +0,0 @@ | ||||||
| #include "..\ecommon.h" |  | ||||||
| 
 |  | ||||||
| UINT e2d::EKeyboardMsg::s_nMsg = 0; |  | ||||||
| WPARAM e2d::EKeyboardMsg::s_wParam = 0; |  | ||||||
| LPARAM e2d::EKeyboardMsg::s_lParam = 0; |  | ||||||
| 
 |  | ||||||
| e2d::EKeyboardMsg::KEYBOARD_MSG e2d::EKeyboardMsg::getMsg() |  | ||||||
| { |  | ||||||
| 	return KEYBOARD_MSG(EKeyboardMsg::s_nMsg); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EKeyboardMsg::KEY e2d::EKeyboardMsg::getKeyValue() |  | ||||||
| { |  | ||||||
| 	return KEY(EKeyboardMsg::s_wParam); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| DWORD e2d::EKeyboardMsg::getCount() |  | ||||||
| { |  | ||||||
| 	return (((DWORD)EKeyboardMsg::s_lParam) & 0x0000FFFF); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EKeyboardMsg::isKeyDown(KEY key) |  | ||||||
| { |  | ||||||
| 	if (::GetAsyncKeyState((int)key) & 0x8000) |  | ||||||
| 	{ |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EKeyboardMsg::isCapitalLockOn() |  | ||||||
| { |  | ||||||
| 	if (::GetKeyState(VK_CAPITAL) & 0x0001) |  | ||||||
| 	{ |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EKeyboardMsg::isNumpadLockOn() |  | ||||||
| { |  | ||||||
| 	if (::GetKeyState(VK_NUMLOCK) & 0x0001) |  | ||||||
| 	{ |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EKeyboardMsg::isScrollLockOn() |  | ||||||
| { |  | ||||||
| 	if (::GetKeyState(VK_SCROLL) & 0x0001) |  | ||||||
| 	{ |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
|  | @ -1,55 +0,0 @@ | ||||||
| #include "..\ecommon.h" |  | ||||||
| 
 |  | ||||||
| UINT e2d::EMouseMsg::s_nMsg = 0; |  | ||||||
| WPARAM e2d::EMouseMsg::s_wParam = 0; |  | ||||||
| LPARAM e2d::EMouseMsg::s_lParam = 0; |  | ||||||
| 
 |  | ||||||
| DWORD e2d::EMouseMsg::getPosX() |  | ||||||
| { |  | ||||||
| 	return LOWORD(EMouseMsg::s_lParam); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| DWORD e2d::EMouseMsg::getPosY() |  | ||||||
| { |  | ||||||
| 	return HIWORD(EMouseMsg::s_lParam); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EPoint e2d::EMouseMsg::getPos() |  | ||||||
| { |  | ||||||
| 	return EPoint(LOWORD(EMouseMsg::s_lParam), HIWORD(EMouseMsg::s_lParam)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMouseMsg::isLButtonDown() |  | ||||||
| { |  | ||||||
| 	return GET_KEYSTATE_WPARAM(EMouseMsg::s_wParam) == MK_LBUTTON; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMouseMsg::isMButtonDown() |  | ||||||
| { |  | ||||||
| 	return GET_KEYSTATE_WPARAM(EMouseMsg::s_wParam) == MK_MBUTTON; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMouseMsg::isRButtonDown() |  | ||||||
| { |  | ||||||
| 	return GET_KEYSTATE_WPARAM(EMouseMsg::s_wParam) == MK_RBUTTON; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMouseMsg::isShiftDown() |  | ||||||
| { |  | ||||||
| 	return GET_KEYSTATE_WPARAM(EMouseMsg::s_wParam) == MK_SHIFT; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMouseMsg::isCtrlDown() |  | ||||||
| { |  | ||||||
| 	return GET_KEYSTATE_WPARAM(EMouseMsg::s_wParam) == MK_CONTROL; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| DWORD e2d::EMouseMsg::getWheelDelta() |  | ||||||
| { |  | ||||||
| 	return GET_WHEEL_DELTA_WPARAM(EMouseMsg::s_wParam); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EMouseMsg::MOUSE_MSG e2d::EMouseMsg::getMsg() |  | ||||||
| { |  | ||||||
| 	return MOUSE_MSG(EMouseMsg::s_nMsg); |  | ||||||
| } |  | ||||||
|  | @ -1,20 +0,0 @@ | ||||||
| #include "..\ecommon.h" |  | ||||||
| 
 |  | ||||||
| e2d::EPhysicsMsg::INTERSECT_RELATION e2d::EPhysicsMsg::s_nRelation = e2d::EPhysicsMsg::UNKNOWN; |  | ||||||
| e2d::EGeometry * e2d::EPhysicsMsg::s_pActiveGeometry = nullptr; |  | ||||||
| e2d::EGeometry * e2d::EPhysicsMsg::s_pPassiveGeometry = nullptr; |  | ||||||
| 
 |  | ||||||
| e2d::EPhysicsMsg::INTERSECT_RELATION e2d::EPhysicsMsg::getMsg() |  | ||||||
| { |  | ||||||
| 	return EPhysicsMsg::s_nRelation; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EGeometry * e2d::EPhysicsMsg::getActiveGeometry() |  | ||||||
| { |  | ||||||
| 	return EPhysicsMsg::s_pActiveGeometry; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EGeometry * e2d::EPhysicsMsg::getPassiveGeometry() |  | ||||||
| { |  | ||||||
| 	return EPhysicsMsg::s_pPassiveGeometry; |  | ||||||
| } |  | ||||||
|  | @ -1,10 +1,9 @@ | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\elisteners.h" | #include "..\elisteners.h" | ||||||
| #include "..\emanagers.h" | #include "..\emanagers.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::EButton::EButton() | e2d::EButton::EButton() | ||||||
| 	: m_Callback((const BUTTON_CLICK_CALLBACK &)nullptr) | 	: m_Callback((const BtnClkCallback &)nullptr) | ||||||
| 	, m_eStatus(EButton::NORMAL) | 	, m_eStatus(EButton::NORMAL) | ||||||
| 	, m_bEnable(true) | 	, m_bEnable(true) | ||||||
| 	, m_bIsSelected(false) | 	, m_bIsSelected(false) | ||||||
|  | @ -12,13 +11,11 @@ e2d::EButton::EButton() | ||||||
| 	, m_pMouseover(nullptr) | 	, m_pMouseover(nullptr) | ||||||
| 	, m_pSelected(nullptr) | 	, m_pSelected(nullptr) | ||||||
| 	, m_pDisabled(nullptr) | 	, m_pDisabled(nullptr) | ||||||
| 	, m_pListener(nullptr) |  | ||||||
| { | { | ||||||
| 	this->_init(); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EButton::EButton(ENode * normal, const BUTTON_CLICK_CALLBACK & callback) | e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback) | ||||||
| 	: m_Callback((const BUTTON_CLICK_CALLBACK &)nullptr) | 	: m_Callback((const BtnClkCallback &)nullptr) | ||||||
| 	, m_eStatus(EButton::NORMAL) | 	, m_eStatus(EButton::NORMAL) | ||||||
| 	, m_bEnable(true) | 	, m_bEnable(true) | ||||||
| 	, m_bIsSelected(false) | 	, m_bIsSelected(false) | ||||||
|  | @ -26,15 +23,13 @@ e2d::EButton::EButton(ENode * normal, const BUTTON_CLICK_CALLBACK & callback) | ||||||
| 	, m_pMouseover(nullptr) | 	, m_pMouseover(nullptr) | ||||||
| 	, m_pSelected(nullptr) | 	, m_pSelected(nullptr) | ||||||
| 	, m_pDisabled(nullptr) | 	, m_pDisabled(nullptr) | ||||||
| 	, m_pListener(nullptr) |  | ||||||
| { | { | ||||||
| 	this->_init(); |  | ||||||
| 	this->setNormal(normal); | 	this->setNormal(normal); | ||||||
| 	this->setCallback(callback); | 	this->setCallback(callback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EButton::EButton(ENode * normal, ENode * selected, const BUTTON_CLICK_CALLBACK & callback) | e2d::EButton::EButton(ENode * normal, ENode * selected, const BtnClkCallback & callback) | ||||||
| 	: m_Callback((const BUTTON_CLICK_CALLBACK &)nullptr) | 	: m_Callback((const BtnClkCallback &)nullptr) | ||||||
| 	, m_eStatus(EButton::NORMAL) | 	, m_eStatus(EButton::NORMAL) | ||||||
| 	, m_bEnable(true) | 	, m_bEnable(true) | ||||||
| 	, m_bIsSelected(false) | 	, m_bIsSelected(false) | ||||||
|  | @ -42,16 +37,14 @@ e2d::EButton::EButton(ENode * normal, ENode * selected, const BUTTON_CLICK_CALLB | ||||||
| 	, m_pMouseover(nullptr) | 	, m_pMouseover(nullptr) | ||||||
| 	, m_pSelected(nullptr) | 	, m_pSelected(nullptr) | ||||||
| 	, m_pDisabled(nullptr) | 	, m_pDisabled(nullptr) | ||||||
| 	, m_pListener(nullptr) |  | ||||||
| { | { | ||||||
| 	this->_init(); |  | ||||||
| 	this->setNormal(normal); | 	this->setNormal(normal); | ||||||
| 	this->setSelected(selected); | 	this->setSelected(selected); | ||||||
| 	this->setCallback(callback); | 	this->setCallback(callback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const BUTTON_CLICK_CALLBACK & callback) | e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const BtnClkCallback & callback) | ||||||
| 	: m_Callback((const BUTTON_CLICK_CALLBACK &)nullptr) | 	: m_Callback((const BtnClkCallback &)nullptr) | ||||||
| 	, m_eStatus(EButton::NORMAL) | 	, m_eStatus(EButton::NORMAL) | ||||||
| 	, m_bEnable(true) | 	, m_bEnable(true) | ||||||
| 	, m_bIsSelected(false) | 	, m_bIsSelected(false) | ||||||
|  | @ -59,17 +52,15 @@ e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const | ||||||
| 	, m_pMouseover(nullptr) | 	, m_pMouseover(nullptr) | ||||||
| 	, m_pSelected(nullptr) | 	, m_pSelected(nullptr) | ||||||
| 	, m_pDisabled(nullptr) | 	, m_pDisabled(nullptr) | ||||||
| 	, m_pListener(nullptr) |  | ||||||
| { | { | ||||||
| 	this->_init(); |  | ||||||
| 	this->setNormal(normal); | 	this->setNormal(normal); | ||||||
| 	this->setMouseOver(mouseover); | 	this->setMouseOver(mouseover); | ||||||
| 	this->setSelected(selected); | 	this->setSelected(selected); | ||||||
| 	this->setCallback(callback); | 	this->setCallback(callback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, ENode * disabled, const BUTTON_CLICK_CALLBACK & callback) | e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, ENode * disabled, const BtnClkCallback & callback) | ||||||
| 	: m_Callback((const BUTTON_CLICK_CALLBACK &)nullptr) | 	: m_Callback((const BtnClkCallback &)nullptr) | ||||||
| 	, m_eStatus(EButton::NORMAL) | 	, m_eStatus(EButton::NORMAL) | ||||||
| 	, m_bEnable(true) | 	, m_bEnable(true) | ||||||
| 	, m_bIsSelected(false) | 	, m_bIsSelected(false) | ||||||
|  | @ -77,9 +68,7 @@ e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, ENode | ||||||
| 	, m_pMouseover(nullptr) | 	, m_pMouseover(nullptr) | ||||||
| 	, m_pSelected(nullptr) | 	, m_pSelected(nullptr) | ||||||
| 	, m_pDisabled(nullptr) | 	, m_pDisabled(nullptr) | ||||||
| 	, m_pListener(nullptr) |  | ||||||
| { | { | ||||||
| 	this->_init(); |  | ||||||
| 	this->setNormal(normal); | 	this->setNormal(normal); | ||||||
| 	this->setMouseOver(mouseover); | 	this->setMouseOver(mouseover); | ||||||
| 	this->setSelected(selected); | 	this->setSelected(selected); | ||||||
|  | @ -179,13 +168,12 @@ void e2d::EButton::setEnable(bool bEnable) | ||||||
| 	{ | 	{ | ||||||
| 		m_bEnable = bEnable; | 		m_bEnable = bEnable; | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 		_updateStatus(); |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EButton::setCallback(const BUTTON_CLICK_CALLBACK & callback) | void e2d::EButton::setCallback(const BtnClkCallback & callback) | ||||||
| { | { | ||||||
| 	WARN_IF(m_pNormal == nullptr, "EButton cannot work without something to show. Please set its normal displayed."); | 	WARN_IF(m_pNormal == nullptr, "EButton cannot work without anything to show. Please set its normal displayed."); | ||||||
| 	 | 	 | ||||||
| 	m_Callback = callback; | 	m_Callback = callback; | ||||||
| } | } | ||||||
|  | @ -217,11 +205,52 @@ void e2d::EButton::setPivot(float pivotX, float pivotY) | ||||||
| 	if (m_pDisabled) m_pDisabled->setPivot(pivotX, pivotY); | 	if (m_pDisabled) m_pDisabled->setPivot(pivotX, pivotY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EButton::_init() | void e2d::EButton::onUpdate() | ||||||
| { | { | ||||||
| 	m_pListener = new EListenerMouse(std::bind(&EButton::_updateStatus, this)); | 	if (m_bEnable && m_pNormal) | ||||||
| 	m_pListener->setAlwaysWorking(true); | 	{ | ||||||
| 	EMsgManager::bindListener(m_pListener, this); | 		ENode * pMouseover = m_pMouseover ? m_pMouseover : m_pNormal; | ||||||
|  | 		ENode * pSelected = m_pSelected ? m_pSelected : m_pNormal; | ||||||
|  | 
 | ||||||
|  | 		if (EInput::isMouseLButtonRelease()) | ||||||
|  | 		{ | ||||||
|  | 			// 鼠标左键抬起时,判断鼠标坐标是否在按钮内部
 | ||||||
|  | 			if (m_bIsSelected && | ||||||
|  | 				pSelected->isPointIn(EInput::getMousePos())) | ||||||
|  | 			{ | ||||||
|  | 				_runCallback(); | ||||||
|  | 			} | ||||||
|  | 			// 标记 m_bIsSelected 为 false
 | ||||||
|  | 			m_bIsSelected = false; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (EInput::isMouseLButtonPress()) | ||||||
|  | 		{ | ||||||
|  | 			if (pMouseover->isPointIn(EInput::getMousePos())) | ||||||
|  | 			{ | ||||||
|  | 				// 鼠标左键按下,且位于按钮内时,标记 m_bIsSelected 为 true
 | ||||||
|  | 				m_bIsSelected = true; | ||||||
|  | 				_setStatus(EButton::SELECTED); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (m_bIsSelected && EInput::isMouseLButtonDown()) | ||||||
|  | 		{ | ||||||
|  | 			if (pSelected->isPointIn(EInput::getMousePos())) | ||||||
|  | 			{ | ||||||
|  | 				_setStatus(EButton::SELECTED); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else if (m_pNormal->isPointIn(EInput::getMousePos())) | ||||||
|  | 		{ | ||||||
|  | 			_setStatus(EButton::MOUSEOVER); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		_setStatus(EButton::NORMAL); | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EButton::_setStatus(STATUS status) | void e2d::EButton::_setStatus(STATUS status) | ||||||
|  | @ -233,12 +262,6 @@ void e2d::EButton::_setStatus(STATUS status) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EButton::_updateTransform() |  | ||||||
| { |  | ||||||
| 	ENode::_updateTransform(); |  | ||||||
| 	_updateStatus(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EButton::_updateVisiable() | void e2d::EButton::_updateVisiable() | ||||||
| { | { | ||||||
| 	if (m_pNormal) m_pNormal->setVisiable(false); | 	if (m_pNormal) m_pNormal->setVisiable(false); | ||||||
|  | @ -274,54 +297,6 @@ void e2d::EButton::_updateVisiable() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EButton::_updateStatus() |  | ||||||
| { |  | ||||||
| 	if (m_bEnable && m_pNormal) |  | ||||||
| 	{ |  | ||||||
| 		ENode * pMouseover = m_pMouseover ? m_pMouseover : m_pNormal; |  | ||||||
| 		ENode * pSelected = m_pSelected ? m_pSelected : m_pNormal; |  | ||||||
| 
 |  | ||||||
| 		if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_UP) |  | ||||||
| 		{ |  | ||||||
| 			// 鼠标左键抬起时,判断鼠标坐标是否在按钮内部
 |  | ||||||
| 			if (m_bIsSelected && |  | ||||||
| 				pSelected->isPointIn(EMouseMsg::getPos())) |  | ||||||
| 			{ |  | ||||||
| 				_runCallback(); |  | ||||||
| 			} |  | ||||||
| 			// 标记 m_bIsSelected 为 false
 |  | ||||||
| 			m_bIsSelected = false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN) |  | ||||||
| 		{ |  | ||||||
| 			if (pMouseover->isPointIn(EMouseMsg::getPos())) |  | ||||||
| 			{ |  | ||||||
| 				// 鼠标左键按下,且位于按钮内时,标记 m_bIsSelected 为 true
 |  | ||||||
| 				m_bIsSelected = true; |  | ||||||
| 				_setStatus(EButton::SELECTED); |  | ||||||
| 				return; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if (m_bIsSelected && EMouseMsg::isLButtonDown()) |  | ||||||
| 		{ |  | ||||||
| 			if (pSelected->isPointIn(EMouseMsg::getPos())) |  | ||||||
| 			{ |  | ||||||
| 				_setStatus(EButton::SELECTED); |  | ||||||
| 				return; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		else if (m_pNormal->isPointIn(EMouseMsg::getPos())) |  | ||||||
| 		{ |  | ||||||
| 			_setStatus(EButton::MOUSEOVER); |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		_setStatus(EButton::NORMAL); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EButton::_runCallback() | void e2d::EButton::_runCallback() | ||||||
| { | { | ||||||
| 	if (m_Callback) | 	if (m_Callback) | ||||||
|  | @ -1,7 +1,6 @@ | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\elisteners.h" | #include "..\elisteners.h" | ||||||
| #include "..\emanagers.h" | #include "..\emanagers.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::EButtonToggle::EButtonToggle() | e2d::EButtonToggle::EButtonToggle() | ||||||
| 	: EButton() | 	: EButton() | ||||||
|  | @ -17,7 +16,7 @@ e2d::EButtonToggle::EButtonToggle() | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, const BUTTON_CLICK_CALLBACK & callback) | e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, const BtnClkCallback & callback) | ||||||
| 	: EButton() | 	: EButton() | ||||||
| 	, m_bToggle(true) | 	, m_bToggle(true) | ||||||
| 	, m_pNormalOn(nullptr) | 	, m_pNormalOn(nullptr) | ||||||
|  | @ -34,7 +33,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma | ||||||
| 	this->setCallback(callback); | 	this->setCallback(callback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnSelected, ENode * toggleOffSelected, const BUTTON_CLICK_CALLBACK & callback) | e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback) | ||||||
| 	: EButton() | 	: EButton() | ||||||
| 	, m_bToggle(true) | 	, m_bToggle(true) | ||||||
| 	, m_pNormalOn(nullptr) | 	, m_pNormalOn(nullptr) | ||||||
|  | @ -53,7 +52,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma | ||||||
| 	this->setCallback(callback); | 	this->setCallback(callback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, const BUTTON_CLICK_CALLBACK & 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_bToggle(true) | ||||||
| 	, m_pNormalOn(nullptr) | 	, m_pNormalOn(nullptr) | ||||||
|  | @ -74,7 +73,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma | ||||||
| 	this->setCallback(callback); | 	this->setCallback(callback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, ENode * toggleOnDisabled, ENode * toggleOffDisabled, const BUTTON_CLICK_CALLBACK & 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_bToggle(true) | ||||||
| 	, m_pNormalOn(nullptr) | 	, m_pNormalOn(nullptr) | ||||||
|  | @ -1,132 +0,0 @@ | ||||||
| #include "..\enodes.h" |  | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| e2d::ESprite::ESprite() |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESprite::ESprite(ETexture * texture) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	loadFrom(texture); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESprite::ESprite(ESpriteFrame * spriteFrame) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	loadFrom(spriteFrame); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESprite::ESprite(const EString & imageFileName) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	loadFrom(imageFileName); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESprite::ESprite(const EString & imageFileName, float x, float y, float width, float height) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	loadFrom(imageFileName); |  | ||||||
| 	clip(x, y, width, height); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESprite::ESprite(LPCTSTR resourceName, LPCTSTR resourceType) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	loadFrom(resourceName, resourceType); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESprite::ESprite(LPCTSTR resourceName, LPCTSTR resourceType, float x, float y, float width, float height) |  | ||||||
| 	: m_fSourceClipX(0) |  | ||||||
| 	, m_fSourceClipY(0) |  | ||||||
| 	, m_pTexture(nullptr) |  | ||||||
| { |  | ||||||
| 	loadFrom(resourceName, resourceType); |  | ||||||
| 	clip(x, y, width, height); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::ESprite::~ESprite() |  | ||||||
| { |  | ||||||
| 	SafeRelease(&m_pTexture); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ESprite::loadFrom(ETexture * texture) |  | ||||||
| { |  | ||||||
| 	if (texture) |  | ||||||
| 	{ |  | ||||||
| 		SafeRelease(&m_pTexture); |  | ||||||
| 		m_pTexture = texture; |  | ||||||
| 		m_pTexture->retain(); |  | ||||||
| 
 |  | ||||||
| 		m_fSourceClipX = m_fSourceClipY = 0; |  | ||||||
| 		ENode::_setWidth(m_pTexture->getSourceWidth()); |  | ||||||
| 		ENode::_setHeight(m_pTexture->getSourceHeight()); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ESprite::loadFrom(const EString & imageFileName) |  | ||||||
| { |  | ||||||
| 	loadFrom(new ETexture(imageFileName)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ESprite::loadFrom(LPCTSTR resourceName, LPCTSTR resourceType) |  | ||||||
| { |  | ||||||
| 	loadFrom(new ETexture(resourceName, resourceType)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ESprite::loadFrom(ETexture * texture, float x, float y, float width, float height) |  | ||||||
| { |  | ||||||
| 	loadFrom(texture); |  | ||||||
| 	clip(x, y, width, height); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ESprite::loadFrom(ESpriteFrame * frame) |  | ||||||
| { |  | ||||||
| 	if (frame) |  | ||||||
| 	{ |  | ||||||
| 		loadFrom(frame->m_pTexture); |  | ||||||
| 		clip(frame->m_fSourceClipX, frame->m_fSourceClipY, frame->m_fSourceClipWidth, frame->m_fSourceClipHeight); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ESprite::clip(float x, float y, float width, float height) |  | ||||||
| { |  | ||||||
| 	m_fSourceClipX = min(max(x, 0), m_pTexture->getSourceWidth()); |  | ||||||
| 	m_fSourceClipY = min(max(y, 0), m_pTexture->getSourceHeight()); |  | ||||||
| 	ENode::_setWidth(min(max(width, 0), m_pTexture->getSourceWidth() - m_fSourceClipX)); |  | ||||||
| 	ENode::_setHeight(min(max(height, 0), m_pTexture->getSourceHeight() - m_fSourceClipY)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ESprite::_render() |  | ||||||
| { |  | ||||||
| 	if (m_pTexture && m_pTexture->_getBitmap()) |  | ||||||
| 	{ |  | ||||||
| 		// Draw bitmap
 |  | ||||||
| 		GetRenderTarget()->DrawBitmap( |  | ||||||
| 			m_pTexture->_getBitmap(), |  | ||||||
| 			D2D1::RectF(0, 0, getRealWidth(), getRealHeight()), |  | ||||||
| 			m_fDisplayOpacity, |  | ||||||
| 			D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, |  | ||||||
| 			D2D1::RectF( |  | ||||||
| 				m_fSourceClipX,  |  | ||||||
| 				m_fSourceClipY,  |  | ||||||
| 				m_fSourceClipX + getRealWidth(),  |  | ||||||
| 				m_fSourceClipY + getRealHeight() |  | ||||||
| 			) |  | ||||||
| 		); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -37,14 +37,7 @@ void e2d::EMenu::setEnable(bool enable) | ||||||
| 
 | 
 | ||||||
| 		for (auto button = m_vButtons.begin(); button != m_vButtons.end(); button++) | 		for (auto button = m_vButtons.begin(); button != m_vButtons.end(); button++) | ||||||
| 		{ | 		{ | ||||||
| 			if (enable) | 			(*button)->setEnable(enable); | ||||||
| 			{ |  | ||||||
| 				(*button)->m_pListener->start(); |  | ||||||
| 			} |  | ||||||
| 			else |  | ||||||
| 			{ |  | ||||||
| 				(*button)->m_pListener->stop(); |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -55,15 +48,7 @@ void e2d::EMenu::addButton(EButton * button) | ||||||
| 	{ | 	{ | ||||||
| 		this->addChild(button); | 		this->addChild(button); | ||||||
| 		m_vButtons.push_back(button); | 		m_vButtons.push_back(button); | ||||||
| 
 | 		button->setEnable(m_bEnable); | ||||||
| 		if (m_bEnable) |  | ||||||
| 		{ |  | ||||||
| 			button->m_pListener->start(); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			button->m_pListener->stop(); |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -83,8 +68,8 @@ bool e2d::EMenu::removeButton(EButton * button) | ||||||
| 		{ | 		{ | ||||||
| 			if (m_vButtons[i] == button) | 			if (m_vButtons[i] == button) | ||||||
| 			{ | 			{ | ||||||
| 				// 移除按钮前,将它的监听器启用
 | 				// 移除按钮前,将它启用
 | ||||||
| 				button->m_pListener->start(); | 				button->setEnable(true); | ||||||
| 				m_vButtons.erase(m_vButtons.begin() + i); | 				m_vButtons.erase(m_vButtons.begin() + i); | ||||||
| 				return true; | 				return true; | ||||||
| 			} | 			} | ||||||
|  | @ -3,7 +3,6 @@ | ||||||
| #include "..\etools.h" | #include "..\etools.h" | ||||||
| #include "..\eactions.h" | #include "..\eactions.h" | ||||||
| #include "..\egeometry.h" | #include "..\egeometry.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| 
 | 
 | ||||||
| // 默认中心点位置
 | // 默认中心点位置
 | ||||||
|  | @ -61,10 +60,8 @@ e2d::ENode::ENode(const EString & name) | ||||||
| 
 | 
 | ||||||
| e2d::ENode::~ENode() | e2d::ENode::~ENode() | ||||||
| { | { | ||||||
| 	ETimerManager::_clearAllTimersBindedWith(this); | 	ETimerManager::__clearAllTimersBindedWith(this); | ||||||
| 	EMsgManager::_clearAllMouseListenersBindedWith(this); | 	EActionManager::__clearAllActionsBindedWith(this); | ||||||
| 	EMsgManager::_clearAllKeyboardListenersBindedWith(this); |  | ||||||
| 	EActionManager::_clearAllActionsBindedWith(this); |  | ||||||
| 	EPhysicsManager::_clearAllListenersBindedWith(this); | 	EPhysicsManager::_clearAllListenersBindedWith(this); | ||||||
| 	EPhysicsManager::_delGeometry(m_pGeometry); | 	EPhysicsManager::_delGeometry(m_pGeometry); | ||||||
| 	for (auto child = m_vChildren.begin(); child != m_vChildren.end(); child++) | 	for (auto child = m_vChildren.begin(); child != m_vChildren.end(); child++) | ||||||
|  | @ -73,14 +70,6 @@ e2d::ENode::~ENode() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::onEnter() |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ENode::onExit() |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ENode::_update() | void e2d::ENode::_update() | ||||||
| { | { | ||||||
| 	if (!m_bVisiable) | 	if (!m_bVisiable) | ||||||
|  | @ -113,9 +102,8 @@ void e2d::ENode::_update() | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		GetRenderTarget()->SetTransform(m_MatriFinal); | 		// 执行 onUpdate 函数
 | ||||||
| 		// äÖȾ×ÔÉí
 | 		this->onUpdate(); | ||||||
| 		this->_render(); |  | ||||||
| 
 | 
 | ||||||
| 		// 访问剩余节点
 | 		// 访问剩余节点
 | ||||||
| 		for (; i < size; i++) | 		for (; i < size; i++) | ||||||
|  | @ -123,14 +111,52 @@ void e2d::ENode::_update() | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		GetRenderTarget()->SetTransform(m_MatriFinal); | 		// 执行 onUpdate 函数
 | ||||||
| 		// äÖȾ×ÔÉí
 | 		this->onUpdate(); | ||||||
| 		this->_render(); |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::_render() | void e2d::ENode::_render() | ||||||
| { | { | ||||||
|  | 	if (!m_bVisiable) | ||||||
|  | 	{ | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (!m_vChildren.empty()) | ||||||
|  | 	{ | ||||||
|  | 		size_t size = m_vChildren.size(); | ||||||
|  | 		size_t i; | ||||||
|  | 		for (i = 0; i < size; i++) | ||||||
|  | 		{ | ||||||
|  | 			auto child = m_vChildren[i]; | ||||||
|  | 			// 访问 Order 小于零的节点
 | ||||||
|  | 			if (child->getOrder() < 0) | ||||||
|  | 			{ | ||||||
|  | 				child->_render(); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// 转换渲染器的二维矩阵
 | ||||||
|  | 		ERenderer::getRenderTarget()->SetTransform(m_MatriFinal); | ||||||
|  | 		// 渲染自身
 | ||||||
|  | 		this->onRender(); | ||||||
|  | 
 | ||||||
|  | 		// 访问剩余节点
 | ||||||
|  | 		for (; i < size; i++) | ||||||
|  | 			m_vChildren[i]->_render(); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		// 转换渲染器的二维矩阵
 | ||||||
|  | 		ERenderer::getRenderTarget()->SetTransform(m_MatriFinal); | ||||||
|  | 		// 渲染自身
 | ||||||
|  | 		this->onRender(); | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::_drawGeometry() | void e2d::ENode::_drawGeometry() | ||||||
|  | @ -410,7 +436,7 @@ void e2d::ENode::movePos(float x, float y) | ||||||
| 	this->setPos(m_Pos.x + x, m_Pos.y + y); | 	this->setPos(m_Pos.x + x, m_Pos.y + y); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::movePos(const EVec & v) | void e2d::ENode::movePos(const EVector2 & v) | ||||||
| { | { | ||||||
| 	this->movePos(v.x, v.y); | 	this->movePos(v.x, v.y); | ||||||
| } | } | ||||||
|  | @ -733,7 +759,7 @@ bool e2d::ENode::isPointIn(EPoint point) | ||||||
| 	} | 	} | ||||||
| 	// 为节点创建一个形状
 | 	// 为节点创建一个形状
 | ||||||
| 	ID2D1RectangleGeometry * rect; | 	ID2D1RectangleGeometry * rect; | ||||||
| 	GetFactory()->CreateRectangleGeometry( | 	ERenderer::getID2D1Factory()->CreateRectangleGeometry( | ||||||
| 		D2D1::RectF(0, 0, getRealWidth(), getRealHeight()), | 		D2D1::RectF(0, 0, getRealWidth(), getRealHeight()), | ||||||
| 		&rect | 		&rect | ||||||
| 	); | 	); | ||||||
|  | @ -773,9 +799,9 @@ void e2d::ENode::stopAction(EAction * action) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::startAllActions() | void e2d::ENode::resumeAllActions() | ||||||
| { | { | ||||||
| 	EActionManager::startAllActionsBindedWith(this); | 	EActionManager::resumeAllActionsBindedWith(this); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::pauseAllActions() | void e2d::ENode::pauseAllActions() | ||||||
|  | @ -0,0 +1,131 @@ | ||||||
|  | #include "..\enodes.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | e2d::ESprite::ESprite() | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::ESprite::ESprite(EImage * image) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	loadFrom(image); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::ESprite::ESprite(EKeyframe * spriteFrame) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	loadFrom(spriteFrame); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::ESprite::ESprite(LPCTSTR imageFileName) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	loadFrom(imageFileName); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::ESprite::ESprite(LPCTSTR imageFileName, float x, float y, float width, float height) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	loadFrom(imageFileName); | ||||||
|  | 	clip(x, y, width, height); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::ESprite::ESprite(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	loadFrom(resourceName, resourceType); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::ESprite::ESprite(LPCTSTR resourceName, LPCTSTR resourceType, float x, float y, float width, float height) | ||||||
|  | 	: m_fSourceClipX(0) | ||||||
|  | 	, m_fSourceClipY(0) | ||||||
|  | 	, m_pImage(nullptr) | ||||||
|  | { | ||||||
|  | 	loadFrom(resourceName, resourceType); | ||||||
|  | 	clip(x, y, width, height); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::ESprite::~ESprite() | ||||||
|  | { | ||||||
|  | 	SafeRelease(&m_pImage); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESprite::loadFrom(EImage * image) | ||||||
|  | { | ||||||
|  | 	if (image) | ||||||
|  | 	{ | ||||||
|  | 		SafeRelease(&m_pImage); | ||||||
|  | 		m_pImage = image; | ||||||
|  | 		m_pImage->retain(); | ||||||
|  | 
 | ||||||
|  | 		m_fSourceClipX = m_fSourceClipY = 0; | ||||||
|  | 		ENode::_setWidth(m_pImage->getSourceWidth()); | ||||||
|  | 		ENode::_setHeight(m_pImage->getSourceHeight()); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESprite::loadFrom(LPCTSTR imageFileName) | ||||||
|  | { | ||||||
|  | 	loadFrom(new EImage(imageFileName)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESprite::loadFrom(LPCTSTR resourceName, LPCTSTR resourceType) | ||||||
|  | { | ||||||
|  | 	loadFrom(new EImage(resourceName, resourceType)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESprite::loadFrom(EImage * image, float x, float y, float width, float height) | ||||||
|  | { | ||||||
|  | 	loadFrom(image); | ||||||
|  | 	clip(x, y, width, height); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESprite::loadFrom(EKeyframe * frame) | ||||||
|  | { | ||||||
|  | 	if (frame) | ||||||
|  | 	{ | ||||||
|  | 		loadFrom(frame->m_pImage); | ||||||
|  | 		clip(frame->m_fSourceClipX, frame->m_fSourceClipY, frame->m_fSourceClipWidth, frame->m_fSourceClipHeight); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESprite::clip(float x, float y, float width, float height) | ||||||
|  | { | ||||||
|  | 	m_fSourceClipX = min(max(x, 0), m_pImage->getSourceWidth()); | ||||||
|  | 	m_fSourceClipY = min(max(y, 0), m_pImage->getSourceHeight()); | ||||||
|  | 	ENode::_setWidth(min(max(width, 0), m_pImage->getSourceWidth() - m_fSourceClipX)); | ||||||
|  | 	ENode::_setHeight(min(max(height, 0), m_pImage->getSourceHeight() - m_fSourceClipY)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::ESprite::onRender() | ||||||
|  | { | ||||||
|  | 	if (m_pImage && m_pImage->_getBitmap()) | ||||||
|  | 	{ | ||||||
|  | 		// Draw bitmap
 | ||||||
|  | 		ERenderer::getRenderTarget()->DrawBitmap( | ||||||
|  | 			m_pImage->_getBitmap(), | ||||||
|  | 			D2D1::RectF(0, 0, getRealWidth(), getRealHeight()), | ||||||
|  | 			m_fDisplayOpacity, | ||||||
|  | 			D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, | ||||||
|  | 			D2D1::RectF( | ||||||
|  | 				m_fSourceClipX,  | ||||||
|  | 				m_fSourceClipY,  | ||||||
|  | 				m_fSourceClipX + getRealWidth(),  | ||||||
|  | 				m_fSourceClipY + getRealHeight() | ||||||
|  | 			) | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::EText::EText() | e2d::EText::EText() | ||||||
| 	: m_bWordWrapping(false) | 	: m_bWordWrapping(false) | ||||||
|  | @ -99,10 +98,10 @@ void e2d::EText::setWordWrappingWidth(float wordWrapWidth) | ||||||
| 	_initTextLayout(); | 	_initTextLayout(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EText::_render() | void e2d::EText::onRender() | ||||||
| { | { | ||||||
| 	GetSolidColorBrush()->SetColor(D2D1::ColorF(m_pFont->m_Color, m_fDisplayOpacity)); | 	ERenderer::getSolidColorBrush()->SetColor(D2D1::ColorF(m_pFont->m_Color, m_fDisplayOpacity)); | ||||||
| 	GetRenderTarget()->DrawTextW( | 	ERenderer::getRenderTarget()->DrawTextW( | ||||||
| 		m_sText, | 		m_sText, | ||||||
| 		UINT32(m_sText.length()), | 		UINT32(m_sText.length()), | ||||||
| 		m_pFont->_getTextFormat(), | 		m_pFont->_getTextFormat(), | ||||||
|  | @ -112,7 +111,7 @@ void e2d::EText::_render() | ||||||
| 			m_bWordWrapping ? m_fWordWrappingWidth : m_Size.width, | 			m_bWordWrapping ? m_fWordWrappingWidth : m_Size.width, | ||||||
| 			getRealHeight() | 			getRealHeight() | ||||||
| 		), | 		), | ||||||
| 		GetSolidColorBrush() | 		ERenderer::getSolidColorBrush() | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -139,7 +138,7 @@ void e2d::EText::_initTextLayout() | ||||||
| 	// »ñÈ¡ TextLayout
 | 	// »ñÈ¡ TextLayout
 | ||||||
| 	IDWriteTextLayout * pDWriteTextLayout = nullptr; | 	IDWriteTextLayout * pDWriteTextLayout = nullptr; | ||||||
| 
 | 
 | ||||||
| 	HRESULT hr = GetDirectWriteFactory()->CreateTextLayout( | 	HRESULT hr = ERenderer::getIDWriteFactory()->CreateTextLayout( | ||||||
| 		m_sText, | 		m_sText, | ||||||
| 		UINT32(m_sText.length()), | 		UINT32(m_sText.length()), | ||||||
| 		m_pFont->_getTextFormat(), | 		m_pFont->_getTextFormat(), | ||||||
|  | @ -0,0 +1,36 @@ | ||||||
|  | #include "..\etools.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void e2d::EData::saveInt(const EString & key, int value) | ||||||
|  | { | ||||||
|  | 	::WritePrivateProfileString(L"Default", key, EString::parse(value), EFile::getDefaultSavePath()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EData::saveFloat(const EString & key, float value) | ||||||
|  | { | ||||||
|  | 	::WritePrivateProfileString(L"Default", key, EString::parse(value), EFile::getDefaultSavePath()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EData::saveString(const EString & key, const EString & value) | ||||||
|  | { | ||||||
|  | 	::WritePrivateProfileString(L"Default", key, value, EFile::getDefaultSavePath()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int e2d::EData::getInt(const EString & key, int default) | ||||||
|  | { | ||||||
|  | 	return ::GetPrivateProfileInt(L"Default", key, default, EFile::getDefaultSavePath()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float e2d::EData::getFloat(const EString & key, float default) | ||||||
|  | { | ||||||
|  | 	wchar_t temp[32] = { 0 }; | ||||||
|  | 	::GetPrivateProfileString(L"Default", key, EString::parse(default), temp, 31, EFile::getDefaultSavePath()); | ||||||
|  | 	return std::stof(temp); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::EString e2d::EData::getString(const EString & key, const EString & default) | ||||||
|  | { | ||||||
|  | 	wchar_t temp[256] = { 0 }; | ||||||
|  | 	::GetPrivateProfileString(L"Default", key, default, temp, 255, EFile::getDefaultSavePath()); | ||||||
|  | 	return temp; | ||||||
|  | } | ||||||
|  | @ -1,150 +0,0 @@ | ||||||
| #include "..\etools.h" |  | ||||||
| #include <mmsystem.h> |  | ||||||
| #include "..\Win\MciPlayer.h" |  | ||||||
| #include <map> |  | ||||||
| 
 |  | ||||||
| typedef std::pair<UINT, MciPlayer *> Music; |  | ||||||
| typedef std::map<UINT, MciPlayer *> MusicList; |  | ||||||
| 
 |  | ||||||
| static MusicList& getMciPlayerList() |  | ||||||
| { |  | ||||||
| 	static MusicList s_List; |  | ||||||
| 	return s_List; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| UINT e2d::EMusicUtils::playMusic(const EString & musicFilePath, int repeatTimes) |  | ||||||
| { |  | ||||||
| 	UINT nRet = preloadMusic(musicFilePath); |  | ||||||
| 
 |  | ||||||
| 	if (nRet) |  | ||||||
| 	{ |  | ||||||
| 		getMciPlayerList()[nRet]->play(repeatTimes); |  | ||||||
| 	} |  | ||||||
| 	return nRet; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| UINT e2d::EMusicUtils::playMusic(const EString & musicResourceName, const EString & musicResourceType, const EString & musicExtension, int repeatTimes) |  | ||||||
| { |  | ||||||
| 	UINT nRet = preloadMusic(musicResourceName, musicResourceType, musicExtension); |  | ||||||
| 
 |  | ||||||
| 	if (nRet) |  | ||||||
| 	{ |  | ||||||
| 		getMciPlayerList()[nRet]->play(repeatTimes); |  | ||||||
| 	} |  | ||||||
| 	return nRet; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| UINT e2d::EMusicUtils::preloadMusic(const EString & musicFilePath) |  | ||||||
| { |  | ||||||
| 	if (musicFilePath.isEmpty())  |  | ||||||
| 		return 0; |  | ||||||
| 
 |  | ||||||
| 	UINT nRet = musicFilePath.hash(); |  | ||||||
| 
 |  | ||||||
| 	if (getMciPlayerList().end() != getMciPlayerList().find(nRet))  |  | ||||||
| 		return nRet; |  | ||||||
| 
 |  | ||||||
| 	getMciPlayerList().insert(Music(nRet, new MciPlayer())); |  | ||||||
| 	MciPlayer * pPlayer = getMciPlayerList()[nRet]; |  | ||||||
| 	pPlayer->open(musicFilePath, nRet); |  | ||||||
| 
 |  | ||||||
| 	if (nRet == pPlayer->getMusicID()) return nRet; |  | ||||||
| 
 |  | ||||||
| 	delete pPlayer; |  | ||||||
| 	getMciPlayerList().erase(nRet); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| UINT e2d::EMusicUtils::preloadMusic(const EString & musicResourceName, const EString & musicResourceType, const EString & musicExtension) |  | ||||||
| { |  | ||||||
| 	if (musicResourceName.isEmpty() || musicResourceType.isEmpty()) |  | ||||||
| 		return 0; |  | ||||||
| 
 |  | ||||||
| 	UINT nRet = musicResourceName.hash(); |  | ||||||
| 
 |  | ||||||
| 	if (getMciPlayerList().end() != getMciPlayerList().find(nRet))  |  | ||||||
| 		return nRet; |  | ||||||
| 
 |  | ||||||
| 	getMciPlayerList().insert(Music(nRet, new MciPlayer())); |  | ||||||
| 	MciPlayer * pPlayer = getMciPlayerList()[nRet]; |  | ||||||
| 	pPlayer->open(musicResourceName, musicResourceType, musicExtension, nRet); |  | ||||||
| 
 |  | ||||||
| 	if (nRet == pPlayer->getMusicID()) return nRet; |  | ||||||
| 
 |  | ||||||
| 	delete pPlayer; |  | ||||||
| 	getMciPlayerList().erase(nRet); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMusicUtils::resumeMusic(UINT musicId) |  | ||||||
| { |  | ||||||
| 	MusicList::iterator p = getMciPlayerList().find(musicId); |  | ||||||
| 	if (p != getMciPlayerList().end()) |  | ||||||
| 	{ |  | ||||||
| 		p->second->resume(); |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMusicUtils::resumeMusic(const EString & musicName) |  | ||||||
| { |  | ||||||
| 	return resumeMusic(musicName.hash());; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMusicUtils::pauseMusic(UINT musicId) |  | ||||||
| { |  | ||||||
| 	MusicList::iterator p = getMciPlayerList().find(musicId); |  | ||||||
| 	if (p != getMciPlayerList().end()) |  | ||||||
| 	{ |  | ||||||
| 		p->second->pause(); |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMusicUtils::pauseMusic(const EString & musicName) |  | ||||||
| { |  | ||||||
| 	return pauseMusic(musicName.hash()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMusicUtils::stopMusic(UINT musicId) |  | ||||||
| { |  | ||||||
| 	MusicList::iterator p = getMciPlayerList().find(musicId); |  | ||||||
| 	if (p != getMciPlayerList().end()) |  | ||||||
| 	{ |  | ||||||
| 		p->second->stop(); |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 	return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool e2d::EMusicUtils::stopMusic(const EString & musicName) |  | ||||||
| { |  | ||||||
| 	return stopMusic(musicName.hash());; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMusicUtils::pauseAllMusics() |  | ||||||
| { |  | ||||||
| 	for (auto iter = getMciPlayerList().begin(); iter != getMciPlayerList().end(); iter++) |  | ||||||
| 	{ |  | ||||||
| 		(*iter).second->pause(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMusicUtils::resumeAllMusics() |  | ||||||
| { |  | ||||||
| 	for (auto iter = getMciPlayerList().begin(); iter != getMciPlayerList().end(); iter++) |  | ||||||
| 	{ |  | ||||||
| 		(*iter).second->resume(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EMusicUtils::stopAllMusics() |  | ||||||
| { |  | ||||||
| 	for (auto iter = getMciPlayerList().begin(); iter != getMciPlayerList().end(); iter++) |  | ||||||
| 	{ |  | ||||||
| 		(*iter).second->stop(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| #include "..\etools.h" | #include "..\etools.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <commdlg.h> | #include <commdlg.h> | ||||||
| 
 | 
 | ||||||
|  | @ -9,13 +8,9 @@ | ||||||
| 
 | 
 | ||||||
| DEFINE_KNOWN_FOLDER(FOLDERID_LocalAppData, 0xF1B32785, 0x6FBA, 0x4FCF, 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91); | DEFINE_KNOWN_FOLDER(FOLDERID_LocalAppData, 0xF1B32785, 0x6FBA, 0x4FCF, 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91); | ||||||
| 
 | 
 | ||||||
| typedef HRESULT(WINAPI* pFunSHGetKnownFolderPath)( | typedef HRESULT(WINAPI* pFunSHGetKnownFolderPath)(const GUID& rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath); | ||||||
| 	const GUID& rfid, |  | ||||||
| 	DWORD dwFlags, |  | ||||||
| 	HANDLE hToken, |  | ||||||
| 	PWSTR *ppszPath); |  | ||||||
| 
 | 
 | ||||||
| e2d::EString e2d::EFileUtils::getLocalAppDataPath() | e2d::EString e2d::EFile::getLocalAppDataPath() | ||||||
| { | { | ||||||
| 	// 获取 AppData\Local 文件夹的路径
 | 	// 获取 AppData\Local 文件夹的路径
 | ||||||
| 	PWSTR pszPath = NULL; | 	PWSTR pszPath = NULL; | ||||||
|  | @ -32,14 +27,14 @@ e2d::EString e2d::EFileUtils::getLocalAppDataPath() | ||||||
| 	return L""; | 	return L""; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EString e2d::EFileUtils::getTempPath() | e2d::EString e2d::EFile::getTempPath() | ||||||
| { | { | ||||||
| 	// 获取临时文件目录
 | 	// 获取临时文件目录
 | ||||||
| 	wchar_t path[_MAX_PATH]; | 	wchar_t path[_MAX_PATH]; | ||||||
| 	::GetTempPath(_MAX_PATH, path); | 	::GetTempPath(_MAX_PATH, path); | ||||||
| 
 | 
 | ||||||
| 	// 创建临时文件目录
 | 	// 创建临时文件目录
 | ||||||
| 	e2d::EString tempFilePath = path + e2d::EApp::getAppName(); | 	e2d::EString tempFilePath = path + e2d::EGame::getAppName(); | ||||||
| 	if (_waccess(tempFilePath, 0) == -1) | 	if (_waccess(tempFilePath, 0) == -1) | ||||||
| 	{ | 	{ | ||||||
| 		_wmkdir(tempFilePath); | 		_wmkdir(tempFilePath); | ||||||
|  | @ -47,12 +42,12 @@ e2d::EString e2d::EFileUtils::getTempPath() | ||||||
| 	return tempFilePath; | 	return tempFilePath; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EString e2d::EFileUtils::getDefaultSavePath() | e2d::EString e2d::EFile::getDefaultSavePath() | ||||||
| { | { | ||||||
| 	EString path = EFileUtils::getLocalAppDataPath(); | 	EString path = EFile::getLocalAppDataPath(); | ||||||
| 	WARN_IF(path.isEmpty(), "Cannot get local AppData path!"); | 	WARN_IF(path.isEmpty(), "Cannot get local AppData path!"); | ||||||
| 
 | 
 | ||||||
| 	path += L"\\" + EApp::getAppName(); | 	path += L"\\" + EGame::getAppName(); | ||||||
| 
 | 
 | ||||||
| 	if (_waccess(path, 0) == -1) | 	if (_waccess(path, 0) == -1) | ||||||
| 	{ | 	{ | ||||||
|  | @ -64,45 +59,11 @@ e2d::EString e2d::EFileUtils::getDefaultSavePath() | ||||||
| 	return path; | 	return path; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EFileUtils::saveInt(const EString & key, int value) | e2d::EString e2d::EFile::getFileExtension(const EString & filePath) | ||||||
| { |  | ||||||
| 	::WritePrivateProfileString(L"Default", key, EString::parse(value), getDefaultSavePath()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EFileUtils::saveFloat(const EString & key, float value) |  | ||||||
| { |  | ||||||
| 	::WritePrivateProfileString(L"Default", key, EString::parse(value), getDefaultSavePath()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::EFileUtils::saveString(const EString & key, const EString & value) |  | ||||||
| { |  | ||||||
| 	::WritePrivateProfileString(L"Default", key, value, getDefaultSavePath()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int e2d::EFileUtils::getInt(const EString & key, int default) |  | ||||||
| { |  | ||||||
| 	return ::GetPrivateProfileInt(L"Default", key, default, getDefaultSavePath()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| float e2d::EFileUtils::getFloat(const EString & key, float default) |  | ||||||
| { |  | ||||||
| 	wchar_t temp[32] = { 0 }; |  | ||||||
| 	::GetPrivateProfileString(L"Default", key, EString::parse(default), temp, 31, getDefaultSavePath()); |  | ||||||
| 	return std::stof(temp); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EString e2d::EFileUtils::getString(const EString & key, const EString & default) |  | ||||||
| { |  | ||||||
| 	wchar_t temp[256] = { 0 }; |  | ||||||
| 	::GetPrivateProfileString(L"Default", key, default, temp, 255, getDefaultSavePath()); |  | ||||||
| 	return temp; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::EString e2d::EFileUtils::getFileExtension(const EString & filePath) |  | ||||||
| { | { | ||||||
| 	EString fileExtension; | 	EString fileExtension; | ||||||
| 	// 找到文件名中的最后一个 '.' 的位置
 | 	// 找到文件名中的最后一个 '.' 的位置
 | ||||||
| 	size_t pos = filePath.findLastOf(L'.'); | 	int pos = filePath.findLastOf(L'.'); | ||||||
| 	// 判断 pos 是否是个有效位置
 | 	// 判断 pos 是否是个有效位置
 | ||||||
| 	if (pos != -1) | 	if (pos != -1) | ||||||
| 	{ | 	{ | ||||||
|  | @ -115,13 +76,13 @@ e2d::EString e2d::EFileUtils::getFileExtension(const EString & filePath) | ||||||
| 	return fileExtension; | 	return fileExtension; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EString e2d::EFileUtils::getSaveFilePath(const EString & title, const EString & defExt) | e2d::EString e2d::EFile::getSaveFilePath(const EString & title, const EString & defExt) | ||||||
| { | { | ||||||
| 	// 弹出保存对话框
 | 	// 弹出保存对话框
 | ||||||
| 	OPENFILENAME ofn = { 0 }; | 	OPENFILENAME ofn = { 0 }; | ||||||
| 	TCHAR strFilename[MAX_PATH] = { 0 };				// 用于接收文件名
 | 	TCHAR strFilename[MAX_PATH] = { 0 };				// 用于接收文件名
 | ||||||
| 	ofn.lStructSize = sizeof(OPENFILENAME);				// 结构体大小
 | 	ofn.lStructSize = sizeof(OPENFILENAME);				// 结构体大小
 | ||||||
| 	ofn.hwndOwner = GetHWnd();							// ´°¿Ú¾ä±ú
 | 	ofn.hwndOwner = EWindow::getHWnd();					// ´°¿Ú¾ä±ú
 | ||||||
| 	ofn.lpstrFilter = L"所有文件\0*.*\0\0";				// 设置过滤
 | 	ofn.lpstrFilter = L"所有文件\0*.*\0\0";				// 设置过滤
 | ||||||
| 	ofn.nFilterIndex = 1;								// 过滤器索引
 | 	ofn.nFilterIndex = 1;								// 过滤器索引
 | ||||||
| 	ofn.lpstrFile = strFilename;						// 接收返回的文件路径和文件名
 | 	ofn.lpstrFile = strFilename;						// 接收返回的文件路径和文件名
 | ||||||
|  | @ -1,7 +1,6 @@ | ||||||
| #include "..\etools.h" | #include "..\etools.h" | ||||||
|  | #include <map> | ||||||
| #include <mmsystem.h> | #include <mmsystem.h> | ||||||
| #include "winbase.h" |  | ||||||
| #include "MciPlayer.h" |  | ||||||
| #pragma comment(lib , "winmm.lib") | #pragma comment(lib , "winmm.lib") | ||||||
| 
 | 
 | ||||||
| #define WIN_CLASS_NAME L"MciPlayerCallbackWnd" | #define WIN_CLASS_NAME L"MciPlayerCallbackWnd" | ||||||
|  | @ -11,6 +10,34 @@ static HINSTANCE s_hInstance = nullptr; | ||||||
| LRESULT WINAPI _MciPlayerProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); | LRESULT WINAPI _MciPlayerProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); | ||||||
| static bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName); | static bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName); | ||||||
| 
 | 
 | ||||||
|  | class MciPlayer | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	MciPlayer(); | ||||||
|  | 	~MciPlayer(); | ||||||
|  | 
 | ||||||
|  | 	void close(); | ||||||
|  | 	bool open(const e2d::EString & pFileName, UINT uId); | ||||||
|  | 	bool open(const e2d::EString & pResouceName, const e2d::EString & pResouceType, const e2d::EString & musicExtension, UINT uId); | ||||||
|  | 	void play(int repeatTimes); | ||||||
|  | 	void pause(); | ||||||
|  | 	void resume(); | ||||||
|  | 	void stop(); | ||||||
|  | 	void rewind(); | ||||||
|  | 	bool isPlaying(); | ||||||
|  | 	UINT getMusicID(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	friend LRESULT WINAPI _MciPlayerProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); | ||||||
|  | 	void _sendCommand(int nCommand, DWORD_PTR param1 = 0, DWORD_PTR parma2 = 0); | ||||||
|  | 
 | ||||||
|  | 	MCIDEVICEID m_dev; | ||||||
|  | 	HWND        m_wnd; | ||||||
|  | 	UINT		m_nMusicID; | ||||||
|  | 	bool        m_bPlaying; | ||||||
|  | 	int			m_nRepeatTimes; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| MciPlayer::MciPlayer() | MciPlayer::MciPlayer() | ||||||
| 	: m_wnd(NULL) | 	: m_wnd(NULL) | ||||||
|  | @ -72,7 +99,7 @@ bool MciPlayer::open(const e2d::EString & pFileName, UINT uId) | ||||||
| 	close(); | 	close(); | ||||||
| 
 | 
 | ||||||
| 	MCI_OPEN_PARMS mciOpen = { 0 }; | 	MCI_OPEN_PARMS mciOpen = { 0 }; | ||||||
| 	mciOpen.lpstrDeviceType = (LPCTSTR)MCI_ALL_DEVICE_ID; | 	mciOpen.lpstrDeviceType = 0; | ||||||
| 	mciOpen.lpstrElementName = pFileName; | 	mciOpen.lpstrElementName = pFileName; | ||||||
| 
 | 
 | ||||||
| 	MCIERROR mciError; | 	MCIERROR mciError; | ||||||
|  | @ -99,7 +126,7 @@ bool MciPlayer::open(const e2d::EString & pResouceName, const e2d::EString & pRe | ||||||
| 	if (pResouceName.isEmpty() || pResouceType.isEmpty() || musicExtension.isEmpty()) return false; | 	if (pResouceName.isEmpty() || pResouceType.isEmpty() || musicExtension.isEmpty()) return false; | ||||||
| 
 | 
 | ||||||
| 	// 获取临时文件目录
 | 	// 获取临时文件目录
 | ||||||
| 	e2d::EString tempFileName = e2d::EFileUtils::getTempPath(); | 	e2d::EString tempFileName = e2d::EFile::getTempPath(); | ||||||
| 
 | 
 | ||||||
| 	// 产生临时文件的文件名
 | 	// 产生临时文件的文件名
 | ||||||
| 	tempFileName = tempFileName + L"\\" + uId + L"." + musicExtension; | 	tempFileName = tempFileName + L"\\" + uId + L"." + musicExtension; | ||||||
|  | @ -251,11 +278,11 @@ LRESULT WINAPI _MciPlayerProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) | ||||||
| 
 | 
 | ||||||
| 		if (pPlayer->m_nRepeatTimes) | 		if (pPlayer->m_nRepeatTimes) | ||||||
| 		{ | 		{ | ||||||
| 			mciSendCommand(lParam, MCI_SEEK, MCI_SEEK_TO_START, 0); | 			mciSendCommand(static_cast<MCIDEVICEID>(lParam), MCI_SEEK, MCI_SEEK_TO_START, 0); | ||||||
| 
 | 
 | ||||||
| 			MCI_PLAY_PARMS mciPlay = { 0 }; | 			MCI_PLAY_PARMS mciPlay = { 0 }; | ||||||
| 			mciPlay.dwCallback = reinterpret_cast<DWORD_PTR>(hWnd); | 			mciPlay.dwCallback = reinterpret_cast<DWORD_PTR>(hWnd); | ||||||
| 			mciSendCommand(lParam, MCI_PLAY, MCI_NOTIFY, reinterpret_cast<DWORD_PTR>(&mciPlay)); | 			mciSendCommand(static_cast<MCIDEVICEID>(lParam), MCI_PLAY, MCI_NOTIFY, reinterpret_cast<DWORD_PTR>(&mciPlay)); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
|  | @ -265,3 +292,152 @@ LRESULT WINAPI _MciPlayerProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) | ||||||
| 	} | 	} | ||||||
| 	return DefWindowProc(hWnd, Msg, wParam, lParam); | 	return DefWindowProc(hWnd, Msg, wParam, lParam); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef std::pair<UINT, MciPlayer *> MusicPair; | ||||||
|  | typedef std::map<UINT, MciPlayer *> MusicList; | ||||||
|  | 
 | ||||||
|  | static MusicList& getMciPlayerList() | ||||||
|  | { | ||||||
|  | 	static MusicList s_List; | ||||||
|  | 	return s_List; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | UINT e2d::EMusic::play(const EString & musicFilePath, int repeatTimes) | ||||||
|  | { | ||||||
|  | 	UINT nRet = preload(musicFilePath); | ||||||
|  | 
 | ||||||
|  | 	if (nRet) | ||||||
|  | 	{ | ||||||
|  | 		getMciPlayerList()[nRet]->play(repeatTimes); | ||||||
|  | 	} | ||||||
|  | 	return nRet; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | UINT e2d::EMusic::play(const EString & musicResourceName, const EString & musicResourceType, const EString & musicExtension, int repeatTimes) | ||||||
|  | { | ||||||
|  | 	UINT nRet = preload(musicResourceName, musicResourceType, musicExtension); | ||||||
|  | 
 | ||||||
|  | 	if (nRet) | ||||||
|  | 	{ | ||||||
|  | 		getMciPlayerList()[nRet]->play(repeatTimes); | ||||||
|  | 	} | ||||||
|  | 	return nRet; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | UINT e2d::EMusic::preload(const EString & musicFilePath) | ||||||
|  | { | ||||||
|  | 	if (musicFilePath.isEmpty())  | ||||||
|  | 		return 0; | ||||||
|  | 
 | ||||||
|  | 	UINT nRet = musicFilePath.hash(); | ||||||
|  | 
 | ||||||
|  | 	if (getMciPlayerList().end() != getMciPlayerList().find(nRet))  | ||||||
|  | 		return nRet; | ||||||
|  | 
 | ||||||
|  | 	getMciPlayerList().insert(MusicPair(nRet, new MciPlayer())); | ||||||
|  | 	MciPlayer * pPlayer = getMciPlayerList()[nRet]; | ||||||
|  | 	pPlayer->open(musicFilePath, nRet); | ||||||
|  | 
 | ||||||
|  | 	if (nRet == pPlayer->getMusicID()) return nRet; | ||||||
|  | 
 | ||||||
|  | 	delete pPlayer; | ||||||
|  | 	getMciPlayerList().erase(nRet); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | UINT e2d::EMusic::preload(const EString & musicResourceName, const EString & musicResourceType, const EString & musicExtension) | ||||||
|  | { | ||||||
|  | 	if (musicResourceName.isEmpty() || musicResourceType.isEmpty()) | ||||||
|  | 		return 0; | ||||||
|  | 
 | ||||||
|  | 	UINT nRet = musicResourceName.hash(); | ||||||
|  | 
 | ||||||
|  | 	if (getMciPlayerList().end() != getMciPlayerList().find(nRet))  | ||||||
|  | 		return nRet; | ||||||
|  | 
 | ||||||
|  | 	getMciPlayerList().insert(MusicPair(nRet, new MciPlayer())); | ||||||
|  | 	MciPlayer * pPlayer = getMciPlayerList()[nRet]; | ||||||
|  | 	pPlayer->open(musicResourceName, musicResourceType, musicExtension, nRet); | ||||||
|  | 
 | ||||||
|  | 	if (nRet == pPlayer->getMusicID()) return nRet; | ||||||
|  | 
 | ||||||
|  | 	delete pPlayer; | ||||||
|  | 	getMciPlayerList().erase(nRet); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool e2d::EMusic::resume(UINT musicId) | ||||||
|  | { | ||||||
|  | 	MusicList::iterator p = getMciPlayerList().find(musicId); | ||||||
|  | 	if (p != getMciPlayerList().end()) | ||||||
|  | 	{ | ||||||
|  | 		p->second->resume(); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool e2d::EMusic::resume(const EString & musicName) | ||||||
|  | { | ||||||
|  | 	return resume(musicName.hash());; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool e2d::EMusic::pause(UINT musicId) | ||||||
|  | { | ||||||
|  | 	MusicList::iterator p = getMciPlayerList().find(musicId); | ||||||
|  | 	if (p != getMciPlayerList().end()) | ||||||
|  | 	{ | ||||||
|  | 		p->second->pause(); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool e2d::EMusic::pause(const EString & musicName) | ||||||
|  | { | ||||||
|  | 	return pause(musicName.hash()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool e2d::EMusic::stop(UINT musicId) | ||||||
|  | { | ||||||
|  | 	MusicList::iterator p = getMciPlayerList().find(musicId); | ||||||
|  | 	if (p != getMciPlayerList().end()) | ||||||
|  | 	{ | ||||||
|  | 		p->second->stop(); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool e2d::EMusic::stop(const EString & musicName) | ||||||
|  | { | ||||||
|  | 	return stop(musicName.hash());; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EMusic::pauseAllMusics() | ||||||
|  | { | ||||||
|  | 	for (auto iter = getMciPlayerList().begin(); iter != getMciPlayerList().end(); iter++) | ||||||
|  | 	{ | ||||||
|  | 		(*iter).second->pause(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EMusic::resumeAllMusics() | ||||||
|  | { | ||||||
|  | 	for (auto iter = getMciPlayerList().begin(); iter != getMciPlayerList().end(); iter++) | ||||||
|  | 	{ | ||||||
|  | 		(*iter).second->resume(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void e2d::EMusic::stopAllMusics() | ||||||
|  | { | ||||||
|  | 	for (auto iter = getMciPlayerList().begin(); iter != getMciPlayerList().end(); iter++) | ||||||
|  | 	{ | ||||||
|  | 		(*iter).second->stop(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -1,25 +1,26 @@ | ||||||
| #include "..\etools.h" | #include "..\etools.h" | ||||||
| #include "..\enodes.h" | #include "..\enodes.h" | ||||||
| #include "..\emanagers.h" | #include "..\emanagers.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::ETimer::ETimer() | e2d::ETimer::ETimer() | ||||||
| 	: m_bRunning(false) | 	: m_bRunning(false) | ||||||
| 	, m_nRunTimes(0) | 	, m_nRunTimes(0) | ||||||
| 	, m_pParentNode(nullptr) | 	, m_pParentNode(nullptr) | ||||||
| 	, m_Callback(nullptr) | 	, m_Callback(nullptr) | ||||||
| 	, m_nInterval() | 	, m_fInterval(0) | ||||||
|  | 	, m_fLast(0) | ||||||
| 	, m_nRepeatTimes(-1) | 	, m_nRepeatTimes(-1) | ||||||
| 	, m_bAtOnce(false) | 	, m_bAtOnce(false) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ETimer::ETimer(const TIMER_CALLBACK & callback, int repeatTimes /* = -1 */, LONGLONG interval /* = 0 */, bool atOnce /* = false */) | e2d::ETimer::ETimer(const TimerCallback & callback, int repeatTimes /* = -1 */, float interval /* = 0 */, bool atOnce /* = false */) | ||||||
| 	: m_bRunning(false) | 	: m_bRunning(false) | ||||||
| 	, m_nRunTimes(0) | 	, m_nRunTimes(0) | ||||||
| 	, m_pParentNode(nullptr) | 	, m_pParentNode(nullptr) | ||||||
| 	, m_Callback(nullptr) | 	, m_Callback(nullptr) | ||||||
| 	, m_nInterval() | 	, m_fInterval(0) | ||||||
|  | 	, m_fLast(0) | ||||||
| 	, m_nRepeatTimes(-1) | 	, m_nRepeatTimes(-1) | ||||||
| 	, m_bAtOnce(false) | 	, m_bAtOnce(false) | ||||||
| { | { | ||||||
|  | @ -29,12 +30,13 @@ e2d::ETimer::ETimer(const TIMER_CALLBACK & callback, int repeatTimes /* = -1 */, | ||||||
| 	m_bAtOnce = atOnce; | 	m_bAtOnce = atOnce; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ETimer::ETimer(const EString & name, const TIMER_CALLBACK & callback, int repeatTimes /* = -1 */, LONGLONG interval /* = 0 */, bool atOnce /* = false */) | e2d::ETimer::ETimer(const EString & name, const TimerCallback & callback, int repeatTimes /* = -1 */, float interval /* = 0 */, bool atOnce /* = false */) | ||||||
| 	: m_bRunning(false) | 	: m_bRunning(false) | ||||||
| 	, m_nRunTimes(0) | 	, m_nRunTimes(0) | ||||||
| 	, m_pParentNode(nullptr) | 	, m_pParentNode(nullptr) | ||||||
| 	, m_Callback(nullptr) | 	, m_Callback(nullptr) | ||||||
| 	, m_nInterval() | 	, m_fInterval(0) | ||||||
|  | 	, m_fLast(0) | ||||||
| 	, m_nRepeatTimes(-1) | 	, m_nRepeatTimes(-1) | ||||||
| 	, m_bAtOnce(false) | 	, m_bAtOnce(false) | ||||||
| { | { | ||||||
|  | @ -53,7 +55,7 @@ bool e2d::ETimer::isRunning() const | ||||||
| void e2d::ETimer::start() | void e2d::ETimer::start() | ||||||
| { | { | ||||||
| 	m_bRunning = true; | 	m_bRunning = true; | ||||||
| 	m_tLast = GetNow(); | 	m_fLast = ETime::getTotalTime(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETimer::stop() | void e2d::ETimer::stop() | ||||||
|  | @ -76,12 +78,12 @@ void e2d::ETimer::setName(const EString & name) | ||||||
| 	m_sName = name; | 	m_sName = name; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETimer::setInterval(LONGLONG interval) | void e2d::ETimer::setInterval(float interval) | ||||||
| { | { | ||||||
| 	SetInterval(m_nInterval, max(interval, 0)); | 	m_fInterval = max(interval, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETimer::setCallback(const TIMER_CALLBACK & callback) | void e2d::ETimer::setCallback(const TimerCallback & callback) | ||||||
| { | { | ||||||
| 	m_Callback = callback; | 	m_Callback = callback; | ||||||
| } | } | ||||||
|  | @ -125,17 +127,17 @@ bool e2d::ETimer::_isReady() | ||||||
| { | { | ||||||
| 	if (m_bRunning &&  | 	if (m_bRunning &&  | ||||||
| 		m_pParentNode && | 		m_pParentNode && | ||||||
| 		m_pParentNode->getParentScene() == EApp::getCurrentScene()) | 		m_pParentNode->getParentScene() == ESceneManager::getCurrentScene()) | ||||||
| 	{ | 	{ | ||||||
| 		if (m_bAtOnce && m_nRunTimes == 0) | 		if (m_bAtOnce && m_nRunTimes == 0) | ||||||
| 			return true; | 			return true; | ||||||
| 
 | 
 | ||||||
| 		if (m_nInterval.QuadPart == 0) | 		if (m_fInterval == 0) | ||||||
| 			return true; | 			return true; | ||||||
| 
 | 
 | ||||||
| 		if (IsIntervalFull(m_tLast, m_nInterval)) | 		if ((ETime::getTotalTime() - m_fLast) >= m_fInterval) | ||||||
| 		{ | 		{ | ||||||
| 			m_tLast.QuadPart += m_nInterval.QuadPart; | 			m_fLast += m_fInterval; | ||||||
| 			return true; | 			return true; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -1,15 +1,14 @@ | ||||||
|  | #include "..\ebase.h" | ||||||
| #include "..\etransitions.h" | #include "..\etransitions.h" | ||||||
| #include "..\Win\winbase.h" |  | ||||||
| 
 | 
 | ||||||
| e2d::ETransition::ETransition(float duration) | e2d::ETransition::ETransition(float duration) | ||||||
| 	: m_bEnd(false) | 	: m_bEnd(false) | ||||||
| 	, m_fTotalDuration(duration * 1000) | 	, m_fLast(0) | ||||||
| 	, m_fDuration(0) |  | ||||||
| 	, m_fRateOfProgress(0) | 	, m_fRateOfProgress(0) | ||||||
| 	, m_pPrevScene(nullptr) | 	, m_pPrevScene(nullptr) | ||||||
| 	, m_pNextScene(nullptr) | 	, m_pNextScene(nullptr) | ||||||
| { | { | ||||||
| 	SetInterval(m_nAnimationInterval, 15LL); | 	m_fDuration = max(duration, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::ETransition::isEnding() | bool e2d::ETransition::isEnding() | ||||||
|  | @ -17,25 +16,17 @@ bool e2d::ETransition::isEnding() | ||||||
| 	return m_bEnd; | 	return m_bEnd; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::ETransition::_isDelayEnough() | void e2d::ETransition::_calcRateOfProgress() | ||||||
| { | { | ||||||
| 	// 判断时间间隔是否足够
 | 	// 判断时间间隔是否足够
 | ||||||
| 	if (m_fTotalDuration == 0) | 	if (m_fDuration == 0) | ||||||
| 	{ | 	{ | ||||||
| 		m_fRateOfProgress = 1; | 		m_fRateOfProgress = 1; | ||||||
| 		return true; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (IsIntervalFull(m_tLast, m_nAnimationInterval)) | 	// 计算动画进度
 | ||||||
| 	{ | 	m_fRateOfProgress = min((ETime::getTotalTime() - m_fLast) / m_fDuration, 1); | ||||||
| 		// 重新记录时间
 |  | ||||||
| 		m_tLast.QuadPart += m_nAnimationInterval.QuadPart; |  | ||||||
| 		m_fDuration += static_cast<float>(ToMilliseconds(m_nAnimationInterval.QuadPart)); |  | ||||||
| 		// 计算动画进度
 |  | ||||||
| 		m_fRateOfProgress = m_fDuration / m_fTotalDuration; |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 	return false; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETransition::_stop() | void e2d::ETransition::_stop() | ||||||
|  | @ -46,7 +37,7 @@ void e2d::ETransition::_stop() | ||||||
| 
 | 
 | ||||||
| void e2d::ETransition::_setTarget(EScene * prev, EScene * next) | void e2d::ETransition::_setTarget(EScene * prev, EScene * next) | ||||||
| { | { | ||||||
| 	m_tLast = GetNow(); | 	m_fLast = ETime::getTotalTime(); | ||||||
| 	m_pPrevScene = prev; | 	m_pPrevScene = prev; | ||||||
| 	m_pNextScene = next; | 	m_pNextScene = next; | ||||||
| 	_init(); | 	_init(); | ||||||
|  |  | ||||||
|  | @ -8,15 +8,14 @@ e2d::ETransitionEmerge::ETransitionEmerge(float duration) | ||||||
| 
 | 
 | ||||||
| void e2d::ETransitionEmerge::_update() | void e2d::ETransitionEmerge::_update() | ||||||
| { | { | ||||||
| 	if (_isDelayEnough()) | 	this->_calcRateOfProgress(); | ||||||
| 	{ |  | ||||||
| 		if (m_pPrevScene) m_pPrevScene->getRoot()->setOpacity(1 - m_fRateOfProgress); |  | ||||||
| 		m_pNextScene->getRoot()->setOpacity(m_fRateOfProgress); |  | ||||||
| 
 | 
 | ||||||
| 		if (m_fDuration >= m_fTotalDuration) | 	if (m_pPrevScene) m_pPrevScene->getRoot()->setOpacity(1 - m_fRateOfProgress); | ||||||
| 		{ | 	m_pNextScene->getRoot()->setOpacity(m_fRateOfProgress); | ||||||
| 			this->_stop(); | 
 | ||||||
| 		} | 	if (m_fRateOfProgress >= 1) | ||||||
|  | 	{ | ||||||
|  | 		this->_stop(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -3,34 +3,33 @@ | ||||||
| 
 | 
 | ||||||
| e2d::ETransitionFade::ETransitionFade(float fadeOutDuration, float fadeInDuration) | e2d::ETransitionFade::ETransitionFade(float fadeOutDuration, float fadeInDuration) | ||||||
| 	: ETransition(0) | 	: ETransition(0) | ||||||
| 	, m_fFadeOutDuration(fadeOutDuration * 1000) | 	, m_fFadeOutDuration(fadeOutDuration) | ||||||
| 	, m_fFadeInDuration(fadeInDuration * 1000) | 	, m_fFadeInDuration(fadeInDuration) | ||||||
| 	, m_bFadeOutTransioning(true) | 	, m_bFadeOutTransioning(true) | ||||||
| { | { | ||||||
| 	m_fTotalDuration = m_fFadeOutDuration; | 	m_fDuration = max(m_fFadeOutDuration, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ETransitionFade::_update() | void e2d::ETransitionFade::_update() | ||||||
| { | { | ||||||
| 	if (_isDelayEnough()) | 	this->_calcRateOfProgress(); | ||||||
|  | 
 | ||||||
|  | 	if (m_bFadeOutTransioning) | ||||||
| 	{ | 	{ | ||||||
| 		if (m_bFadeOutTransioning) | 		m_pPrevScene->getRoot()->setOpacity(1 - m_fRateOfProgress); | ||||||
|  | 		if (m_fRateOfProgress >= 1) | ||||||
| 		{ | 		{ | ||||||
| 			m_pPrevScene->getRoot()->setOpacity(1 - m_fRateOfProgress); | 			m_bFadeOutTransioning = false; | ||||||
| 			if (m_fDuration >= m_fTotalDuration) | 			m_fDuration = max(m_fFadeInDuration, 0); | ||||||
| 			{ | 			m_fLast = ETime::getTotalTime(); | ||||||
| 				m_bFadeOutTransioning = false; |  | ||||||
| 				m_fTotalDuration = m_fFadeInDuration; |  | ||||||
| 				m_fDuration = 0; |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 		else | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		m_pNextScene->getRoot()->setOpacity(m_fRateOfProgress); | ||||||
|  | 		if (m_fRateOfProgress >= 1) | ||||||
| 		{ | 		{ | ||||||
| 			m_pNextScene->getRoot()->setOpacity(m_fRateOfProgress); | 			this->_stop(); | ||||||
| 			if (m_fDuration >= m_fTotalDuration) |  | ||||||
| 			{ |  | ||||||
| 				this->_stop(); |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -45,7 +44,7 @@ void e2d::ETransitionFade::_init() | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		m_bFadeOutTransioning = false; | 		m_bFadeOutTransioning = false; | ||||||
| 		m_fTotalDuration = m_fFadeInDuration; | 		m_fDuration = m_fFadeInDuration; | ||||||
| 	} | 	} | ||||||
| 	m_pNextScene->getRoot()->setOpacity(0); | 	m_pNextScene->getRoot()->setOpacity(0); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -9,15 +9,14 @@ e2d::ETransitionMove::ETransitionMove(float duration, MOVE_DIRECT direct) | ||||||
| 
 | 
 | ||||||
| void e2d::ETransitionMove::_update() | void e2d::ETransitionMove::_update() | ||||||
| { | { | ||||||
| 	if (_isDelayEnough()) | 	this->_calcRateOfProgress(); | ||||||
| 	{ |  | ||||||
| 		if (m_pPrevScene) m_pPrevScene->getRoot()->setPos(m_Vec * m_fRateOfProgress); |  | ||||||
| 		m_pNextScene->getRoot()->setPos(m_NextPos + m_Vec * m_fRateOfProgress); |  | ||||||
| 
 | 
 | ||||||
| 		if (m_fDuration >= m_fTotalDuration) | 	if (m_pPrevScene) m_pPrevScene->getRoot()->setPos(m_Vec * m_fRateOfProgress); | ||||||
| 		{ | 	m_pNextScene->getRoot()->setPos(m_NextPos + m_Vec * m_fRateOfProgress); | ||||||
| 			this->_stop(); | 
 | ||||||
| 		} | 	if (m_fRateOfProgress >= 1) | ||||||
|  | 	{ | ||||||
|  | 		this->_stop(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -25,23 +24,23 @@ void e2d::ETransitionMove::_init() | ||||||
| { | { | ||||||
| 	if (m_Direct == ETransitionMove::UP) | 	if (m_Direct == ETransitionMove::UP) | ||||||
| 	{ | 	{ | ||||||
| 		m_Vec = EVec(0, -EApp::getHeight()); | 		m_Vec = EVector2(0, -EWindow::getHeight()); | ||||||
| 		m_NextPos = EPoint(0, EApp::getHeight()); | 		m_NextPos = EPoint(0, EWindow::getHeight()); | ||||||
| 	} | 	} | ||||||
| 	else if (m_Direct == ETransitionMove::DOWN) | 	else if (m_Direct == ETransitionMove::DOWN) | ||||||
| 	{ | 	{ | ||||||
| 		m_Vec = EVec(0, EApp::getHeight()); | 		m_Vec = EVector2(0, EWindow::getHeight()); | ||||||
| 		m_NextPos = EPoint(0, -EApp::getHeight()); | 		m_NextPos = EPoint(0, -EWindow::getHeight()); | ||||||
| 	} | 	} | ||||||
| 	else if (m_Direct == ETransitionMove::LEFT) | 	else if (m_Direct == ETransitionMove::LEFT) | ||||||
| 	{ | 	{ | ||||||
| 		m_Vec = EVec(-EApp::getWidth(), 0); | 		m_Vec = EVector2(-EWindow::getWidth(), 0); | ||||||
| 		m_NextPos = EPoint(EApp::getWidth(), 0); | 		m_NextPos = EPoint(EWindow::getWidth(), 0); | ||||||
| 	} | 	} | ||||||
| 	else if (m_Direct == ETransitionMove::RIGHT) | 	else if (m_Direct == ETransitionMove::RIGHT) | ||||||
| 	{ | 	{ | ||||||
| 		m_Vec = EVec(EApp::getWidth(), 0); | 		m_Vec = EVector2(EWindow::getWidth(), 0); | ||||||
| 		m_NextPos = EPoint(-EApp::getWidth(), 0); | 		m_NextPos = EPoint(-EWindow::getWidth(), 0); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (m_pPrevScene) m_pPrevScene->getRoot()->setPos(0, 0); | 	if (m_pPrevScene) m_pPrevScene->getRoot()->setPos(0, 0); | ||||||
|  |  | ||||||
|  | @ -1,29 +0,0 @@ | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| class MciPlayer |  | ||||||
| { |  | ||||||
| public: |  | ||||||
| 	MciPlayer(); |  | ||||||
| 	~MciPlayer(); |  | ||||||
| 
 |  | ||||||
| 	void close(); |  | ||||||
| 	bool open(const e2d::EString & pFileName, UINT uId); |  | ||||||
| 	bool open(const e2d::EString & pResouceName, const e2d::EString & pResouceType, const e2d::EString & musicExtension, UINT uId); |  | ||||||
| 	void play(int repeatTimes); |  | ||||||
| 	void pause(); |  | ||||||
| 	void resume(); |  | ||||||
| 	void stop(); |  | ||||||
| 	void rewind(); |  | ||||||
| 	bool isPlaying(); |  | ||||||
| 	UINT getMusicID(); |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 	friend LRESULT WINAPI _MciPlayerProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); |  | ||||||
| 	void _sendCommand(int nCommand, DWORD_PTR param1 = 0, DWORD_PTR parma2 = 0); |  | ||||||
| 
 |  | ||||||
| 	MCIDEVICEID m_dev; |  | ||||||
| 	HWND        m_wnd; |  | ||||||
| 	UINT		m_nMusicID; |  | ||||||
| 	bool        m_bPlaying; |  | ||||||
| 	int			m_nRepeatTimes; |  | ||||||
| }; |  | ||||||
|  | @ -1,136 +0,0 @@ | ||||||
| #include "winbase.h" |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| static HWND s_HWnd = nullptr; |  | ||||||
| static ID2D1Factory * s_pDirect2dFactory = nullptr; |  | ||||||
| static ID2D1HwndRenderTarget * s_pRenderTarget = nullptr; |  | ||||||
| static ID2D1SolidColorBrush * s_pSolidBrush = nullptr; |  | ||||||
| static IWICImagingFactory * s_pIWICFactory = nullptr; |  | ||||||
| static IDWriteFactory * s_pDWriteFactory = nullptr; |  | ||||||
| static LARGE_INTEGER s_tNow; |  | ||||||
| static LARGE_INTEGER s_tFreq; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| HWND &GetHWnd() |  | ||||||
| { |  | ||||||
| 	return s_HWnd; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ID2D1Factory * &GetFactory() |  | ||||||
| { |  | ||||||
| 	if (!s_pDirect2dFactory) |  | ||||||
| 	{ |  | ||||||
| 		// 创建设备无关资源,它们的生命周期和程序的时长相同
 |  | ||||||
| 		HRESULT hr = S_OK; |  | ||||||
| 
 |  | ||||||
| 		// 创建一个 Direct2D 工厂
 |  | ||||||
| 		hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &s_pDirect2dFactory); |  | ||||||
| 
 |  | ||||||
| 		ASSERT(SUCCEEDED(hr), "Create Device Independent Resources Failed!"); |  | ||||||
| 	} |  | ||||||
| 	return s_pDirect2dFactory; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ID2D1HwndRenderTarget * &GetRenderTarget() |  | ||||||
| { |  | ||||||
| 	if (!s_pRenderTarget) |  | ||||||
| 	{ |  | ||||||
| 		// 创建设备相关资源。这些资源应在 Direct3D 设备消失时重建,
 |  | ||||||
| 		// 比如当 isVisiable 被修改,等等
 |  | ||||||
| 		RECT rc; |  | ||||||
| 		GetClientRect(GetHWnd(), &rc); |  | ||||||
| 
 |  | ||||||
| 		D2D1_SIZE_U size = D2D1::SizeU( |  | ||||||
| 			rc.right - rc.left, |  | ||||||
| 			rc.bottom - rc.top |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		// 创建一个 Direct2D 渲染目标
 |  | ||||||
| 		HRESULT hr; |  | ||||||
| 		hr = GetFactory()->CreateHwndRenderTarget( |  | ||||||
| 			D2D1::RenderTargetProperties(), |  | ||||||
| 			D2D1::HwndRenderTargetProperties( |  | ||||||
| 				GetHWnd(),  |  | ||||||
| 				size), |  | ||||||
| 			&s_pRenderTarget |  | ||||||
| 		); |  | ||||||
| 		 |  | ||||||
| 		ASSERT(SUCCEEDED(hr), "Create Render Target Failed! Maybe you should initalize EApp first."); |  | ||||||
| 	} |  | ||||||
| 	return s_pRenderTarget; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| IWICImagingFactory * &GetImagingFactory() |  | ||||||
| { |  | ||||||
| 	if (!s_pIWICFactory) |  | ||||||
| 	{ |  | ||||||
| 		// 创建 WIC 绘图工厂,用于统一处理各种格式的图片
 |  | ||||||
| 		HRESULT hr = CoCreateInstance( |  | ||||||
| 			CLSID_WICImagingFactory, |  | ||||||
| 			NULL, |  | ||||||
| 			CLSCTX_INPROC_SERVER, |  | ||||||
| 			IID_IWICImagingFactory, |  | ||||||
| 			reinterpret_cast<void**>(&s_pIWICFactory) |  | ||||||
| 		); |  | ||||||
| 		ASSERT(SUCCEEDED(hr), "Create WICImagingFactory Failed!"); |  | ||||||
| 	} |  | ||||||
| 	return s_pIWICFactory; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| IDWriteFactory * &GetDirectWriteFactory() |  | ||||||
| { |  | ||||||
| 	if (!s_pDWriteFactory) |  | ||||||
| 	{ |  | ||||||
| 		// 创建 DirectWrite 工厂
 |  | ||||||
| 		HRESULT hr = DWriteCreateFactory( |  | ||||||
| 			DWRITE_FACTORY_TYPE_SHARED, |  | ||||||
| 			__uuidof(IDWriteFactory), |  | ||||||
| 			reinterpret_cast<IUnknown**>(&s_pDWriteFactory) |  | ||||||
| 		); |  | ||||||
| 		ASSERT(SUCCEEDED(hr), "Create DirectWrite Factory Failed!"); |  | ||||||
| 	} |  | ||||||
| 	return s_pDWriteFactory; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ID2D1SolidColorBrush * &GetSolidColorBrush() |  | ||||||
| { |  | ||||||
| 	if (!s_pSolidBrush) |  | ||||||
| 	{ |  | ||||||
| 		HRESULT hr; |  | ||||||
| 		hr = GetRenderTarget()->CreateSolidColorBrush( |  | ||||||
| 			D2D1::ColorF(D2D1::ColorF::White),  |  | ||||||
| 			&s_pSolidBrush |  | ||||||
| 		); |  | ||||||
| 		ASSERT(SUCCEEDED(hr), "Create Solid Color Brush Failed!"); |  | ||||||
| 	} |  | ||||||
| 	return s_pSolidBrush; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| LARGE_INTEGER &GetFreq() |  | ||||||
| { |  | ||||||
| 	if (s_tFreq.QuadPart == 0) |  | ||||||
| 	{ |  | ||||||
| 		QueryPerformanceFrequency(&s_tFreq);	// 获取时钟频率
 |  | ||||||
| 	} |  | ||||||
| 	return s_tFreq; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| LARGE_INTEGER &GetNow() |  | ||||||
| { |  | ||||||
| 	return s_tNow; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool IsIntervalFull(const LARGE_INTEGER& tLast, const LARGE_INTEGER& tInterval) |  | ||||||
| { |  | ||||||
| 	return (s_tNow.QuadPart - tLast.QuadPart) >= tInterval.QuadPart; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| LONGLONG ToMilliseconds(LONGLONG tLast) |  | ||||||
| { |  | ||||||
| 	return tLast * 1000LL / GetFreq().QuadPart; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void SetInterval(LARGE_INTEGER& nInterval, LONGLONG nIntervalMS) |  | ||||||
| { |  | ||||||
| 	nInterval.QuadPart = static_cast<LONGLONG>(GetFreq().QuadPart * nIntervalMS / 1000.0); |  | ||||||
| } |  | ||||||
|  | @ -1,45 +0,0 @@ | ||||||
| #pragma once |  | ||||||
| #include "..\emacros.h" |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #ifndef HINST_THISCOMPONENT |  | ||||||
| EXTERN_C IMAGE_DOS_HEADER __ImageBase; |  | ||||||
| #define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase) |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| HWND &GetHWnd(); |  | ||||||
| 
 |  | ||||||
| ID2D1Factory * &GetFactory(); |  | ||||||
| 
 |  | ||||||
| ID2D1HwndRenderTarget * &GetRenderTarget(); |  | ||||||
| 
 |  | ||||||
| ID2D1SolidColorBrush * &GetSolidColorBrush(); |  | ||||||
| 
 |  | ||||||
| IWICImagingFactory * &GetImagingFactory(); |  | ||||||
| 
 |  | ||||||
| IDWriteFactory * &GetDirectWriteFactory(); |  | ||||||
| 
 |  | ||||||
| LARGE_INTEGER &GetFreq(); |  | ||||||
| 
 |  | ||||||
| LARGE_INTEGER &GetNow(); |  | ||||||
| 
 |  | ||||||
| bool IsIntervalFull(const LARGE_INTEGER& tLast, const LARGE_INTEGER& tInterval); |  | ||||||
| 
 |  | ||||||
| LONGLONG ToMilliseconds(LONGLONG tLast); |  | ||||||
| 
 |  | ||||||
| void SetInterval(LARGE_INTEGER& nInterval, LONGLONG nIntervalMS); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| template<class Interface> |  | ||||||
| inline void SafeReleaseInterface( |  | ||||||
| 	Interface **ppInterfaceToRelease |  | ||||||
| ) |  | ||||||
| { |  | ||||||
| 	if (*ppInterfaceToRelease != nullptr) |  | ||||||
| 	{ |  | ||||||
| 		(*ppInterfaceToRelease)->Release(); |  | ||||||
| 
 |  | ||||||
| 		(*ppInterfaceToRelease) = nullptr; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -49,11 +49,6 @@ public: | ||||||
| 	// 获取执行该动作的目标
 | 	// 获取执行该动作的目标
 | ||||||
| 	virtual ENode * getTarget(); | 	virtual ENode * getTarget(); | ||||||
| 
 | 
 | ||||||
| 	// 设置动作每一帧的时间间隔
 |  | ||||||
| 	virtual void setInterval( |  | ||||||
| 		LONGLONG milliSeconds |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 设置动作执行目标
 | 	// 设置动作执行目标
 | ||||||
| 	virtual void setTarget( | 	virtual void setTarget( | ||||||
| 		ENode * node | 		ENode * node | ||||||
|  | @ -76,13 +71,12 @@ protected: | ||||||
| 	virtual void _resetTime(); | 	virtual void _resetTime(); | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	bool		m_bRunning; | 	bool	m_bRunning; | ||||||
| 	bool		m_bEnding; | 	bool	m_bEnding; | ||||||
| 	bool		m_bInit; | 	bool	m_bInit; | ||||||
| 	ENode *		m_pTarget; | 	ENode *	m_pTarget; | ||||||
| 	EScene *	m_pParentScene; | 	EScene *m_pParentScene; | ||||||
| 	LARGE_INTEGER m_nAnimationInterval; | 	float	m_fLast; | ||||||
| 	LARGE_INTEGER m_tLast; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -96,21 +90,17 @@ public: | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	// 判断动作是否结束
 |  | ||||||
| 	bool _isEnd() const; |  | ||||||
| 
 |  | ||||||
| 	// 判断延时是否足够
 |  | ||||||
| 	bool _isDelayEnough(); |  | ||||||
| 
 |  | ||||||
| 	// 初始化动画
 | 	// 初始化动画
 | ||||||
| 	virtual void _init() override; | 	virtual void _init() override; | ||||||
| 
 | 
 | ||||||
|  | 	// 更新动画
 | ||||||
|  | 	virtual void _update() override; | ||||||
|  | 
 | ||||||
| 	// 重置动画
 | 	// 重置动画
 | ||||||
| 	virtual void _reset() override; | 	virtual void _reset() override; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	float m_fDuration; | 	float m_fDuration; | ||||||
| 	float m_fTotalDuration; |  | ||||||
| 	float m_fRateOfProgress; | 	float m_fRateOfProgress; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -122,7 +112,7 @@ public: | ||||||
| 	// 创建相对位移动画
 | 	// 创建相对位移动画
 | ||||||
| 	EActionMoveBy( | 	EActionMoveBy( | ||||||
| 		float duration, /* 动画持续时长 */ | 		float duration, /* 动画持续时长 */ | ||||||
| 		EVec vector		/* 位移向量 */ | 		EVector2 vector		/* 位移向量 */ | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 获取该动画的拷贝对象
 | 	// 获取该动画的拷贝对象
 | ||||||
|  | @ -143,7 +133,7 @@ protected: | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	EPoint	m_BeginPos; | 	EPoint	m_BeginPos; | ||||||
| 	EVec	m_MoveVec; | 	EVector2	m_MoveVec; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -490,6 +480,9 @@ protected: | ||||||
| 
 | 
 | ||||||
| 	// 重置动作
 | 	// 重置动作
 | ||||||
| 	virtual void _reset() override; | 	virtual void _reset() override; | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  | 	float m_fDelayTime; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -576,14 +569,19 @@ public: | ||||||
| 
 | 
 | ||||||
| 	// 创建特定帧间隔的帧动画
 | 	// 创建特定帧间隔的帧动画
 | ||||||
| 	EAnimation( | 	EAnimation( | ||||||
| 		LONGLONG frameDelay	/* 帧间隔(毫秒) */ | 		float interval	/* 帧间隔(秒) */ | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	virtual ~EAnimation(); | 	virtual ~EAnimation(); | ||||||
| 
 | 
 | ||||||
| 	// 添加帧
 | 	// 添加关键帧
 | ||||||
| 	void addFrame( | 	void addKeyframe( | ||||||
| 		ESpriteFrame * frame /* 添加帧 */ | 		EKeyframe * frame	/* 添加关键帧 */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 设置每一帧的时间间隔(秒)
 | ||||||
|  | 	void setInterval( | ||||||
|  | 		float interval | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 获取该动画的拷贝对象
 | 	// 获取该动画的拷贝对象
 | ||||||
|  | @ -603,8 +601,9 @@ protected: | ||||||
| 	virtual void _reset() override; | 	virtual void _reset() override; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	UINT m_nFrameIndex; | 	float	m_fInterval; | ||||||
| 	std::vector<ESpriteFrame*> m_vFrames; | 	UINT	m_nFrameIndex; | ||||||
|  | 	std::vector<EKeyframe*> m_vFrames; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| /******************************************************
 | /******************************************************
 | ||||||
| * Easy2D Game Framework | * Easy2D Game Core | ||||||
| *  | *  | ||||||
| * Website: http://www.easy2d.cn
 | * Website: https://www.easy2d.cn
 | ||||||
| * Source Code: https://github.com/Nomango/Easy2D
 | * Source Code: https://github.com/Nomango/Easy2D
 | ||||||
| ******************************************************/ | ******************************************************/ | ||||||
| 
 | 
 | ||||||
|  | @ -9,11 +9,11 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #ifndef __cplusplus | #ifndef __cplusplus | ||||||
| 	#error Easy2D is only for C++ | 	#error 仅能在 C++ 环境下使用 Easy2D | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if _MSC_VER < 1600 | #if _MSC_VER < 1600 | ||||||
| 	#error MSVC version is too low | 	#error Easy2D 不支持 Visual Studio 2010 以下版本 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										392
									
								
								core/ebase.h
								
								
								
								
							
							
						
						
									
										392
									
								
								core/ebase.h
								
								
								
								
							|  | @ -8,29 +8,22 @@ | ||||||
| namespace e2d | namespace e2d | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| class EScene; |  | ||||||
| class ENode; |  | ||||||
| class EObjectManager; |  | ||||||
| class EListenerMouse; |  | ||||||
| class EListenerKeyboard; |  | ||||||
| class EAction; |  | ||||||
| class ETransition; |  | ||||||
| 
 | 
 | ||||||
| class EApp | class EGame | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	// 获取程序实例
 | 	// 初始化游戏
 | ||||||
| 	static EApp * getInstance(); |  | ||||||
| 
 |  | ||||||
| 	// 初始化游戏界面
 |  | ||||||
| 	static bool init( | 	static bool init( | ||||||
| 		const EString &title,	/* 窗口标题 */ | 		LPCTSTR sTitle,				/* 窗口标题 */ | ||||||
| 		UINT32 width,			/* 窗口宽度 */ | 		UINT32 nWidth,				/* 窗口宽度 */ | ||||||
| 		UINT32 height,			/* 窗口高度 */ | 		UINT32 nHeight,				/* 窗口高度 */ | ||||||
| 		const EWindowStyle &wStyle = nullptr	/* 窗口样式 */ | 		LPCTSTR pIconID = nullptr,	/* 窗口图标 */ | ||||||
|  | 		bool bNoClose = false,		/* 禁用关闭按钮 */ | ||||||
|  | 		bool bNoMiniSize = false,	/* 禁用最小化按钮 */ | ||||||
|  | 		bool bTopMost = false		/* 窗口置顶 */ | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 启动程序
 | 	// 启动游戏
 | ||||||
| 	static int run(); | 	static int run(); | ||||||
| 
 | 
 | ||||||
| 	// 暂停游戏
 | 	// 暂停游戏
 | ||||||
|  | @ -42,35 +35,32 @@ public: | ||||||
| 	// 结束游戏
 | 	// 结束游戏
 | ||||||
| 	static void quit(); | 	static void quit(); | ||||||
| 
 | 
 | ||||||
| 	// 切换场景
 | 	// 回收游戏资源
 | ||||||
| 	static void enterScene( | 	static void uninit(); | ||||||
| 		EScene * scene,						/* 下一个场景的指针 */ |  | ||||||
| 		ETransition * transition = nullptr,	/* 场景切换动画 */ |  | ||||||
| 		bool saveCurrentScene = true		/* 是否保存当前场景 */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 返回上一场景
 |  | ||||||
| 	static void backScene( |  | ||||||
| 		ETransition * transition = nullptr	/* 场景切换动画 */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 清空保存的所有场景
 |  | ||||||
| 	static void clearScene(); |  | ||||||
| 
 |  | ||||||
| 	// 隐藏窗口
 |  | ||||||
| 	static void hideWindow(); |  | ||||||
| 
 |  | ||||||
| 	// 显示窗口
 |  | ||||||
| 	static void showWindow(); |  | ||||||
| 
 |  | ||||||
| 	// 是否打开控制台
 |  | ||||||
| 	static void showConsole( |  | ||||||
| 		bool show = true |  | ||||||
| 	); |  | ||||||
| 
 | 
 | ||||||
| 	// 游戏是否暂停
 | 	// 游戏是否暂停
 | ||||||
| 	static bool isPaused(); | 	static bool isPaused(); | ||||||
| 
 | 
 | ||||||
|  | 	// 获取 AppName
 | ||||||
|  | 	static EString getAppName(); | ||||||
|  | 
 | ||||||
|  | 	// 设置 AppName
 | ||||||
|  | 	static void setAppName( | ||||||
|  | 		const EString &appname | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	// 更新游戏内容
 | ||||||
|  | 	static void __update(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // 控制窗口属性
 | ||||||
|  | class EWindow | ||||||
|  | { | ||||||
|  | 	friend EGame; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
| 	// 获取窗口标题
 | 	// 获取窗口标题
 | ||||||
| 	static EString getTitle(); | 	static EString getTitle(); | ||||||
| 
 | 
 | ||||||
|  | @ -83,175 +73,209 @@ public: | ||||||
| 	// 获取窗口大小
 | 	// 获取窗口大小
 | ||||||
| 	static ESize getSize(); | 	static ESize getSize(); | ||||||
| 
 | 
 | ||||||
| 	// 获取当前场景
 |  | ||||||
| 	static EScene * getCurrentScene(); |  | ||||||
| 
 |  | ||||||
| 	// 获取窗口句柄
 | 	// 获取窗口句柄
 | ||||||
| 	static HWND getHWnd(); | 	static HWND getHWnd(); | ||||||
| 
 | 
 | ||||||
| 	// 获取窗口样式
 |  | ||||||
| 	static EWindowStyle getWindowStyle(); |  | ||||||
| 
 |  | ||||||
| 	// 获取从游戏开始到当前经过的毫秒数
 |  | ||||||
| 	static LONGLONG getTotalDurationFromStart(); |  | ||||||
| 
 |  | ||||||
| 	// 获取 AppName
 |  | ||||||
| 	static EString getAppName(); |  | ||||||
| 
 |  | ||||||
| 	// 修改窗口大小
 | 	// 修改窗口大小
 | ||||||
| 	static void setWindowSize( | 	static void setSize( | ||||||
| 		UINT32 width, | 		UINT32 width, | ||||||
| 		UINT32 height | 		UINT32 height | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置窗口标题
 | 	// 设置窗口标题
 | ||||||
| 	static void setWindowTitle( | 	static void setTitle( | ||||||
| 		const EString & title | 		const EString & title | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置 AppName
 | 	// 打开/隐藏控制台
 | ||||||
| 	static void setAppName( | 	static void showConsole( | ||||||
| 		const EString &appname | 		bool show = true | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 修改窗口背景色
 | 	// 隐藏主窗口
 | ||||||
| 	static void setBkColor( | 	static void hideWindow(); | ||||||
|  | 
 | ||||||
|  | 	// 显示主窗口
 | ||||||
|  | 	static void showWindow(); | ||||||
|  | 
 | ||||||
|  | 	// 是否允许响应输入法
 | ||||||
|  | 	static void setTypewritingEnable( | ||||||
|  | 		bool bEnable | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	// 初始化窗口
 | ||||||
|  | 	static bool __init( | ||||||
|  | 		LPCTSTR sTitle,		/* 窗口标题 */ | ||||||
|  | 		UINT32 nWidth,		/* 窗口宽度 */ | ||||||
|  | 		UINT32 nHeight,		/* 窗口高度 */ | ||||||
|  | 		LPCTSTR pIconID,	/* 窗口图标 */ | ||||||
|  | 		bool bNoClose,		/* 禁用关闭按钮 */ | ||||||
|  | 		bool bNoMiniSize,	/* 禁用最小化按钮 */ | ||||||
|  | 		bool bTopMost		/* 窗口置顶 */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 重置窗口属性
 | ||||||
|  | 	static void __uninit(); | ||||||
|  | 
 | ||||||
|  | 	// 处理窗口消息
 | ||||||
|  | 	static void __poll(); | ||||||
|  | 
 | ||||||
|  | 	// Win32 窗口消息回调程序
 | ||||||
|  | 	static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // 控制游戏时间
 | ||||||
|  | class ETime | ||||||
|  | { | ||||||
|  | 	friend EGame; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 	// 获取上一帧与当前帧的时间间隔(毫秒)
 | ||||||
|  | 	static int getDeltaTime(); | ||||||
|  | 
 | ||||||
|  | 	// 获取游戏开始时长(秒)
 | ||||||
|  | 	static float getTotalTime(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	// 初始化计时操作
 | ||||||
|  | 	static void __init(); | ||||||
|  | 
 | ||||||
|  | 	// 重置计时操作
 | ||||||
|  | 	static void __uninit(); | ||||||
|  | 
 | ||||||
|  | 	// 更新当前时间
 | ||||||
|  | 	static void __updateNow(); | ||||||
|  | 
 | ||||||
|  | 	// 更新时间信息
 | ||||||
|  | 	static void __updateLast(); | ||||||
|  | 
 | ||||||
|  | 	// 挂起线程
 | ||||||
|  | 	static void __sleep(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // 控制键盘和鼠标的输入
 | ||||||
|  | class EInput | ||||||
|  | { | ||||||
|  | 	friend EGame; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 	// 检测键盘某按键是否正被按下
 | ||||||
|  | 	static bool isKeyDown( | ||||||
|  | 		int nKeyCode | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 检测键盘某按键是否被点击
 | ||||||
|  | 	static bool isKeyPress( | ||||||
|  | 		int nKeyCode | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 检测键盘某按键是否正在松开
 | ||||||
|  | 	static bool isKeyRelease( | ||||||
|  | 		int nKeyCode | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 检测鼠标左键是否正被按下
 | ||||||
|  | 	static bool isMouseLButtonDown(); | ||||||
|  | 
 | ||||||
|  | 	// 检测鼠标右键是否正被按下
 | ||||||
|  | 	static bool isMouseRButtonDown(); | ||||||
|  | 
 | ||||||
|  | 	// 检测鼠标中键是否正被按下
 | ||||||
|  | 	static bool isMouseMButtonDown(); | ||||||
|  | 
 | ||||||
|  | 	// 检测鼠标左键是否被点击
 | ||||||
|  | 	static bool isMouseLButtonPress(); | ||||||
|  | 
 | ||||||
|  | 	// 检测鼠标右键是否被点击
 | ||||||
|  | 	static bool isMouseRButtonPress(); | ||||||
|  | 
 | ||||||
|  | 	// 检测鼠标中键是否被点击
 | ||||||
|  | 	static bool isMouseMButtonPress(); | ||||||
|  | 
 | ||||||
|  | 	// 检测鼠标左键是否正在松开
 | ||||||
|  | 	static bool isMouseLButtonRelease(); | ||||||
|  | 
 | ||||||
|  | 	// 检测鼠标右键是否正在松开
 | ||||||
|  | 	static bool isMouseRButtonRelease(); | ||||||
|  | 
 | ||||||
|  | 	// 检测鼠标中键是否正在松开
 | ||||||
|  | 	static bool isMouseMButtonRelease(); | ||||||
|  | 
 | ||||||
|  | 	// 获得鼠标X轴坐标值
 | ||||||
|  | 	static float getMouseX(); | ||||||
|  | 
 | ||||||
|  | 	// 获得鼠标Y轴坐标值
 | ||||||
|  | 	static float getMouseY(); | ||||||
|  | 
 | ||||||
|  | 	// 获得鼠标坐标值
 | ||||||
|  | 	static EPoint getMousePos(); | ||||||
|  | 
 | ||||||
|  | 	// 获得鼠标X轴坐标增量
 | ||||||
|  | 	static float getMouseDeltaX(); | ||||||
|  | 
 | ||||||
|  | 	// 获得鼠标Y轴坐标增量
 | ||||||
|  | 	static float getMouseDeltaY(); | ||||||
|  | 
 | ||||||
|  | 	// 获得鼠标Z轴(鼠标滚轮)坐标增量
 | ||||||
|  | 	static float getMouseDeltaZ(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	// 初始化 DirectInput 以及键盘鼠标设备
 | ||||||
|  | 	static HRESULT __init(); | ||||||
|  | 
 | ||||||
|  | 	// 获得输入信息
 | ||||||
|  | 	static void __updateDeviceState(); | ||||||
|  | 
 | ||||||
|  | 	// 卸载 DirectInput
 | ||||||
|  | 	static void __uninit(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // 渲染器
 | ||||||
|  | class ERenderer | ||||||
|  | { | ||||||
|  | 	friend EGame; | ||||||
|  | 	friend EWindow; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 	// 修改背景色
 | ||||||
|  | 	static void setBackgroundColor( | ||||||
| 		UINT32 color | 		UINT32 color | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置程序是否响应输入法
 | 	// 获取 ID2D1Factory 对象
 | ||||||
| 	static void setKeyboardLayoutEnable( | 	static ID2D1Factory * getID2D1Factory(); | ||||||
| 		bool value |  | ||||||
| 	); |  | ||||||
| 
 | 
 | ||||||
| 	// 预设画面帧数
 | 	// 获取 ID2D1HwndRenderTarget 对象
 | ||||||
| 	static void setFPS( | 	static ID2D1HwndRenderTarget * getRenderTarget(); | ||||||
| 		UINT32 fps |  | ||||||
| 	); |  | ||||||
| 
 | 
 | ||||||
| public: | 	// 获取 ID2D1SolidColorBrush 对象
 | ||||||
| 	// 重写这个函数,它将在窗口激活时执行
 | 	static ID2D1SolidColorBrush * getSolidColorBrush(); | ||||||
| 	virtual bool onActivate(); |  | ||||||
| 
 | 
 | ||||||
| 	// 重写这个函数,它将在窗口非激活时执行
 | 	// 获取 IWICImagingFactory 对象
 | ||||||
| 	virtual bool onInactive(); | 	static IWICImagingFactory * getIWICImagingFactory(); | ||||||
| 
 | 
 | ||||||
| 	// 重写这个函数,它将在关闭窗口时执行
 | 	// 获取 IDWriteFactory 对象
 | ||||||
| 	virtual bool onCloseWindow(); | 	static IDWriteFactory * getIDWriteFactory(); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 	EApp(); | 	// 渲染游戏画面
 | ||||||
|  | 	static void __render(); | ||||||
| 
 | 
 | ||||||
| 	virtual ~EApp(); | 	// 创建设备无关资源
 | ||||||
|  | 	static bool __createDeviceIndependentResources(); | ||||||
| 
 | 
 | ||||||
| 	void _update(); | 	// 创建设备相关资源
 | ||||||
|  | 	static bool __createDeviceResources(); | ||||||
| 
 | 
 | ||||||
| 	void _render(); | 	// 删除设备相关资源
 | ||||||
|  | 	static void __discardDeviceResources(); | ||||||
| 
 | 
 | ||||||
| 	void _enterNextScene(); | 	// 删除所有渲染相关资源
 | ||||||
| 
 | 	static void __discardResources(); | ||||||
| 	void _updateTime(); |  | ||||||
| 
 |  | ||||||
| 	static LRESULT CALLBACK WndProc( |  | ||||||
| 		HWND hWnd, |  | ||||||
| 		UINT message, |  | ||||||
| 		WPARAM wParam, |  | ||||||
| 		LPARAM lParam |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 	bool	m_bEnd; |  | ||||||
| 	bool	m_bPaused; |  | ||||||
| 	bool	m_bManualPaused; |  | ||||||
| 	bool	m_bShowConsole; |  | ||||||
| 	EString	m_sTitle; |  | ||||||
| 	EString	m_sAppName; |  | ||||||
| 	UINT32	m_ClearColor; |  | ||||||
| 	LARGE_INTEGER m_nAnimationInterval; |  | ||||||
| 	EScene * m_pCurrentScene; |  | ||||||
| 	EScene * m_pNextScene; |  | ||||||
| 	EWindowStyle m_WindowStyle; |  | ||||||
| 	ETransition * m_pTransition; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class EScene : |  | ||||||
| 	public EObject |  | ||||||
| { |  | ||||||
| 	friend EApp; |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 	EScene(); |  | ||||||
| 
 |  | ||||||
| 	virtual ~EScene(); |  | ||||||
| 
 |  | ||||||
| 	// 重写这个函数,它将在进入这个场景时自动执行
 |  | ||||||
| 	virtual void onEnter(); |  | ||||||
| 
 |  | ||||||
| 	// 重写这个函数,它将在离开这个场景时自动执行
 |  | ||||||
| 	virtual void onExit(); |  | ||||||
| 
 |  | ||||||
| 	// 重写这个函数,它将在窗口激活时执行
 |  | ||||||
| 	virtual bool onActivate(); |  | ||||||
| 
 |  | ||||||
| 	// 重写这个函数,它将在窗口非激活时执行
 |  | ||||||
| 	virtual bool onInactive(); |  | ||||||
| 
 |  | ||||||
| 	// 重写这个函数,它将在关闭窗口时执行
 |  | ||||||
| 	virtual bool onCloseWindow(); |  | ||||||
| 
 |  | ||||||
| 	// 添加子节点到场景
 |  | ||||||
| 	void add( |  | ||||||
| 		ENode * child,  |  | ||||||
| 		int zOrder = 0 |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 删除子节点
 |  | ||||||
| 	bool remove( |  | ||||||
| 		ENode * child |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 删除相同名称的子节点
 |  | ||||||
| 	void remove( |  | ||||||
| 		const EString &childName |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 获取所有子节点
 |  | ||||||
| 	std::vector<e2d::ENode*> &getChildren(); |  | ||||||
| 
 |  | ||||||
| 	// 获取子节点数量
 |  | ||||||
| 	size_t getChildrenCount() const; |  | ||||||
| 
 |  | ||||||
| 	// 根据名称获取子节点
 |  | ||||||
| 	ENode * getChild( |  | ||||||
| 		const EString &childName |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 获取根节点
 |  | ||||||
| 	ENode * getRoot() const; |  | ||||||
| 
 |  | ||||||
| 	// 清空所有子成员
 |  | ||||||
| 	void clearAllChildren(); |  | ||||||
| 
 |  | ||||||
| 	// 执行动画
 |  | ||||||
| 	void runAction( |  | ||||||
| 		EAction * action |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 开启几何图形的渲染
 |  | ||||||
| 	void setGeometryVisiable( |  | ||||||
| 		bool visiable |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	// 渲染场景画面
 |  | ||||||
| 	void _render(); |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	bool m_bSortNeeded; |  | ||||||
| 	bool m_bWillSave; |  | ||||||
| 	bool m_bGeometryVisiable; |  | ||||||
| 	ENode * m_pRoot; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
							
								
								
									
										502
									
								
								core/ecommon.h
								
								
								
								
							
							
						
						
									
										502
									
								
								core/ecommon.h
								
								
								
								
							|  | @ -47,9 +47,6 @@ struct EPoint | ||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| // 表示二维向量的结构体
 |  | ||||||
| typedef EPoint EVec; |  | ||||||
| 
 |  | ||||||
| // 表示大小的结构体
 | // 表示大小的结构体
 | ||||||
| struct ESize | struct ESize | ||||||
| { | { | ||||||
|  | @ -89,46 +86,6 @@ struct ESize | ||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| // 表示窗口样式的结构体
 |  | ||||||
| struct EWindowStyle |  | ||||||
| { |  | ||||||
| 	LPCTSTR m_pIconID;	/* 程序图标 ID */ |  | ||||||
| 	bool m_bNoClose;	/* 禁用关闭按钮 */ |  | ||||||
| 	bool m_bNoMiniSize;	/* 禁用最小化按钮 */ |  | ||||||
| 	bool m_bTopMost;	/* 窗口置顶 */ |  | ||||||
| 
 |  | ||||||
| 	EWindowStyle() |  | ||||||
| 	{ |  | ||||||
| 		m_pIconID = 0; |  | ||||||
| 		m_bNoClose = false; |  | ||||||
| 		m_bNoMiniSize = false; |  | ||||||
| 		m_bTopMost = false; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	EWindowStyle( |  | ||||||
| 		LPCTSTR pIconID |  | ||||||
| 	) |  | ||||||
| 	{ |  | ||||||
| 		m_pIconID = pIconID; |  | ||||||
| 		m_bNoClose = false; |  | ||||||
| 		m_bNoMiniSize = false; |  | ||||||
| 		m_bTopMost = false; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	EWindowStyle( |  | ||||||
| 		LPCTSTR pIconID, |  | ||||||
| 		bool bNoClose, |  | ||||||
| 		bool bNoMiniSize, |  | ||||||
| 		bool bTopMost |  | ||||||
| 	) |  | ||||||
| 	{ |  | ||||||
| 		m_pIconID = pIconID; |  | ||||||
| 		m_bNoClose = bNoClose; |  | ||||||
| 		m_bNoMiniSize = bNoMiniSize; |  | ||||||
| 		m_bTopMost = bTopMost; |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // 字符串
 | // 字符串
 | ||||||
| class EString | class EString | ||||||
| { | { | ||||||
|  | @ -261,6 +218,32 @@ private: | ||||||
| 	int _size; | 	int _size; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | // 二维向量
 | ||||||
|  | typedef EPoint EVector2; | ||||||
|  | 
 | ||||||
|  | // 定时器回调函数(参数为该定时器被调用的次数,从 0 开始)
 | ||||||
|  | typedef std::function<void(int)> TimerCallback; | ||||||
|  | 
 | ||||||
|  | // 按钮点击回调函数
 | ||||||
|  | typedef std::function<void()> BtnClkCallback; | ||||||
|  | 
 | ||||||
|  | // 物理世界消息监听器回调函数
 | ||||||
|  | typedef std::function<void()> PhysLsnrCallback; | ||||||
|  | 
 | ||||||
|  | // 碰撞消息监听器回调函数
 | ||||||
|  | typedef PhysLsnrCallback  ClsLsnrCallback; | ||||||
|  | 
 | ||||||
|  | template<typename T> | ||||||
|  | inline void SafeDelete(T** p) { if (*p) { delete *p; *p = nullptr; } } | ||||||
|  | 
 | ||||||
|  | template<typename Obj> | ||||||
|  | inline void SafeRelease(Obj** p) { if (*p) { (*p)->release(); *p = nullptr; } } | ||||||
|  | 
 | ||||||
|  | template<class Interface> | ||||||
|  | inline void SafeReleaseInterface(Interface **pp) { if (*pp != nullptr) { (*pp)->Release(); (*pp) = nullptr; } } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| // 颜色
 | // 颜色
 | ||||||
| class EColor | class EColor | ||||||
| { | { | ||||||
|  | @ -268,143 +251,65 @@ public: | ||||||
| 	enum COMMON_VALUE | 	enum COMMON_VALUE | ||||||
| 	{ | 	{ | ||||||
| 		ALICE_BLUE = 0xF0F8FF, | 		ALICE_BLUE = 0xF0F8FF, | ||||||
| 		ANTIQUE_WHITE = 0xFAEBD7, |  | ||||||
| 		AQUA = 0x00FFFF, | 		AQUA = 0x00FFFF, | ||||||
| 		AQUAMARINE = 0x7FFFD4, |  | ||||||
| 		AZURE = 0xF0FFFF, | 		AZURE = 0xF0FFFF, | ||||||
| 		BEIGE = 0xF5F5DC, | 		BEIGE = 0xF5F5DC, | ||||||
| 		BISQUE = 0xFFE4C4, |  | ||||||
| 		BLACK = 0x000000, | 		BLACK = 0x000000, | ||||||
| 		BLANCHED_ALMOND = 0xFFEBCD, |  | ||||||
| 		BLUE = 0x0000FF, | 		BLUE = 0x0000FF, | ||||||
| 		BLUE_VIOLET = 0x8A2BE2, | 		BLUE_VIOLET = 0x8A2BE2, | ||||||
| 		BROWN = 0xA52A2A, | 		BROWN = 0xA52A2A, | ||||||
| 		BURLY_WOOD = 0xDEB887, |  | ||||||
| 		CADET_BLUE = 0x5F9EA0, |  | ||||||
| 		CHARTREUSE = 0x7FFF00, |  | ||||||
| 		CHOCOLATE = 0xD2691E, | 		CHOCOLATE = 0xD2691E, | ||||||
| 		CORAL = 0xFF7F50, |  | ||||||
| 		CORNFLOWER_BLUE = 0x6495ED, |  | ||||||
| 		CORNSILK = 0xFFF8DC, |  | ||||||
| 		CRIMSON = 0xDC143C, |  | ||||||
| 		CYAN = 0x00FFFF, | 		CYAN = 0x00FFFF, | ||||||
| 		DARK_BLUE = 0x00008B, | 		DARK_BLUE = 0x00008B, | ||||||
| 		DARK_CYAN = 0x008B8B, | 		DARK_CYAN = 0x008B8B, | ||||||
| 		DARK_GOLDENROD = 0xB8860B, | 		DARK_GOLDENROD = 0xB8860B, | ||||||
| 		DARK_GRAY = 0xA9A9A9, | 		DARK_GRAY = 0xA9A9A9, | ||||||
| 		DARK_GREEN = 0x006400, | 		DARK_GREEN = 0x006400, | ||||||
| 		DARK_KHAKI = 0xBDB76B, |  | ||||||
| 		DARK_MAGENTA = 0x8B008B, |  | ||||||
| 		DARK_OLIVE_GREEN = 0x556B2F, |  | ||||||
| 		DARK_ORANGE = 0xFF8C00, | 		DARK_ORANGE = 0xFF8C00, | ||||||
| 		DARK_ORCHID = 0x9932CC, |  | ||||||
| 		DARK_RED = 0x8B0000, | 		DARK_RED = 0x8B0000, | ||||||
| 		DARK_SALMON = 0xE9967A, |  | ||||||
| 		DARK_SEA_GREEN = 0x8FBC8F, | 		DARK_SEA_GREEN = 0x8FBC8F, | ||||||
| 		DARK_SLATE_BLUE = 0x483D8B, |  | ||||||
| 		DARK_SLATE_GRAY = 0x2F4F4F, |  | ||||||
| 		DARK_TURQUOISE = 0x00CED1, |  | ||||||
| 		DARK_VIOLET = 0x9400D3, | 		DARK_VIOLET = 0x9400D3, | ||||||
| 		DEEP_PINK = 0xFF1493, | 		DEEP_PINK = 0xFF1493, | ||||||
| 		DEEP_SKY_BLUE = 0x00BFFF, | 		DEEP_SKY_BLUE = 0x00BFFF, | ||||||
| 		DIM_GRAY = 0x696969, |  | ||||||
| 		DODGER_BLUE = 0x1E90FF, |  | ||||||
| 		FIREBRICK = 0xB22222, |  | ||||||
| 		FLORAL_WHITE = 0xFFFAF0, |  | ||||||
| 		FOREST_GREEN = 0x228B22, | 		FOREST_GREEN = 0x228B22, | ||||||
| 		FUCHSIA = 0xFF00FF, |  | ||||||
| 		GAINSCORO = 0xDCDCDC, |  | ||||||
| 		GHOST_WHITE = 0xF8F8FF, |  | ||||||
| 		GOLD = 0xFFD700, | 		GOLD = 0xFFD700, | ||||||
| 		GOLDENROD = 0xDAA520, | 		GOLDENROD = 0xDAA520, | ||||||
| 		GRAY = 0x808080, | 		GRAY = 0x808080, | ||||||
| 		GREEN = 0x008000, | 		GREEN = 0x008000, | ||||||
| 		GREEN_YELLOW = 0xADFF2F, | 		GREEN_YELLOW = 0xADFF2F, | ||||||
| 		HONEYDEW = 0xF0FFF0, |  | ||||||
| 		HOT_PINK = 0xFF69B4, |  | ||||||
| 		INDIAN_RED = 0xCD5C5C, |  | ||||||
| 		INDIGO = 0x4B0082, |  | ||||||
| 		IVORY = 0xFFFFF0, |  | ||||||
| 		KHAKI = 0xF0E68C, |  | ||||||
| 		LAVENDER = 0xE6E6FA, |  | ||||||
| 		LAVENDER_BLUSH = 0xFFF0F5, |  | ||||||
| 		LAWN_GREEN = 0x7CFC00, |  | ||||||
| 		LEMON_CHIFFON = 0xFFFACD, |  | ||||||
| 		LIGHT_BLUE = 0xADD8E6, | 		LIGHT_BLUE = 0xADD8E6, | ||||||
| 		LIGHT_CORAL = 0xF08080, |  | ||||||
| 		LIGHT_CYAN = 0xE0FFFF, | 		LIGHT_CYAN = 0xE0FFFF, | ||||||
| 		LIGHT_GOLDENROD_YELLOW = 0xFAFAD2, | 		LIGHT_GOLDENROD_YELLOW = 0xFAFAD2, | ||||||
| 		LIGHT_GREEN = 0x90EE90, | 		LIGHT_GREEN = 0x90EE90, | ||||||
| 		LIGHT_GRAY = 0xD3D3D3, | 		LIGHT_GRAY = 0xD3D3D3, | ||||||
| 		LIGHT_PINK = 0xFFB6C1, | 		LIGHT_PINK = 0xFFB6C1, | ||||||
| 		LIGHT_SALMON = 0xFFA07A, |  | ||||||
| 		LIGHT_SEA_GREEN = 0x20B2AA, | 		LIGHT_SEA_GREEN = 0x20B2AA, | ||||||
| 		LIGHT_SKY_BLUE = 0x87CEFA, | 		LIGHT_SKY_BLUE = 0x87CEFA, | ||||||
| 		LIGHT_SLATE_GRAY = 0x778899, | 		LIGHT_SLATE_GRAY = 0x778899, | ||||||
| 		LIGHT_STEEL_BLUE = 0xB0C4DE, |  | ||||||
| 		LIGHT_YELLOW = 0xFFFFE0, | 		LIGHT_YELLOW = 0xFFFFE0, | ||||||
| 		LIME = 0x00FF00, |  | ||||||
| 		LIME_GREEN = 0x32CD32, |  | ||||||
| 		LINEN = 0xFAF0E6, |  | ||||||
| 		MAGENTA = 0xFF00FF, |  | ||||||
| 		MAROON = 0x800000, |  | ||||||
| 		MEDIUM_AQUAMARINE = 0x66CDAA, |  | ||||||
| 		MEDIUM_BLUE = 0x0000CD, | 		MEDIUM_BLUE = 0x0000CD, | ||||||
| 		MEDIUM_ORCHID = 0xBA55D3, |  | ||||||
| 		MEDIUM_PURPLE = 0x9370DB, | 		MEDIUM_PURPLE = 0x9370DB, | ||||||
| 		MEDIUM_SEA_GREEN = 0x3CB371, | 		MEDIUM_SEA_GREEN = 0x3CB371, | ||||||
| 		MEDIUM_SLATE_BLUE = 0x7B68EE, |  | ||||||
| 		MEDIUM_SPRING_GREEN = 0x00FA9A, | 		MEDIUM_SPRING_GREEN = 0x00FA9A, | ||||||
| 		MEDIUM_TURQUOISE = 0x48D1CC, |  | ||||||
| 		MEDUIM_VIOLET_RED = 0xC71585, | 		MEDUIM_VIOLET_RED = 0xC71585, | ||||||
| 		MIDNIGHT_BLUE = 0x191970, | 		MIDNIGHT_BLUE = 0x191970, | ||||||
| 		MINT_CREAM = 0xF5FFFA, |  | ||||||
| 		MISTY_ROSE = 0xFFE4E1, |  | ||||||
| 		MOCCASIN = 0xFFE4B5, |  | ||||||
| 		NAVAJO_WHITE = 0xFFDEAD, |  | ||||||
| 		NAVY = 0x000080, |  | ||||||
| 		OLD_LACE = 0xFDF5E6, |  | ||||||
| 		OLIVE = 0x808000, |  | ||||||
| 		OLIVE_DRAB = 0x6B8E23, |  | ||||||
| 		ORANGE = 0xFFA500, | 		ORANGE = 0xFFA500, | ||||||
| 		ORANGE_RED = 0xFF4500, | 		ORANGE_RED = 0xFF4500, | ||||||
| 		ORCHID = 0xDA70D6, |  | ||||||
| 		PALE_GOLDENROD = 0xEEE8AA, |  | ||||||
| 		PALE_GREEN = 0x98FB98, |  | ||||||
| 		PALE_TURQUOISE = 0xAFEEEE, |  | ||||||
| 		PALE_VIOLET_RED = 0xDB7093, |  | ||||||
| 		PAPAYA_WHIP = 0xFFEFD5, |  | ||||||
| 		PEACH_PUFF = 0xFFDAB9, |  | ||||||
| 		PERU = 0xCD853F, |  | ||||||
| 		PINK = 0xFFC0CB, | 		PINK = 0xFFC0CB, | ||||||
| 		PLUM = 0xDDA0DD, |  | ||||||
| 		POWDER_BLUE = 0xB0E0E6, |  | ||||||
| 		PURPLE = 0x800080, | 		PURPLE = 0x800080, | ||||||
| 		RED = 0xFF0000, | 		RED = 0xFF0000, | ||||||
| 		ROSY_BROWN = 0xBC8F8F, |  | ||||||
| 		ROYAL_BLUE = 0x4169E1, |  | ||||||
| 		SADDLE_BROWN = 0x8B4513, |  | ||||||
| 		SALMON = 0xFA8072, |  | ||||||
| 		SANDY_BROWN = 0xF4A460, |  | ||||||
| 		SEA_GREEN = 0x2E8B57, | 		SEA_GREEN = 0x2E8B57, | ||||||
| 		SEA_SHELL = 0xFFF5EE, | 		SEA_SHELL = 0xFFF5EE, | ||||||
| 		SIENNA = 0xA0522D, |  | ||||||
| 		SILVER = 0xC0C0C0, | 		SILVER = 0xC0C0C0, | ||||||
| 		SKY_BLUE = 0x87CEEB, | 		SKY_BLUE = 0x87CEEB, | ||||||
| 		SLATE_BLUE = 0x6A5ACD, |  | ||||||
| 		SLATE_GRAY = 0x708090, |  | ||||||
| 		SNOW = 0xFFFAFA, | 		SNOW = 0xFFFAFA, | ||||||
| 		SPRING_GREEN = 0x00FF7F, | 		SPRING_GREEN = 0x00FF7F, | ||||||
| 		STEEL_BLUE = 0x4682B4, |  | ||||||
| 		TAN = 0xD2B48C, |  | ||||||
| 		TEAL = 0x008080, |  | ||||||
| 		THISTLE = 0xD8BFD8, |  | ||||||
| 		TOMATO = 0xFF6347, | 		TOMATO = 0xFF6347, | ||||||
| 		TURQUOISE = 0x40E0D0, |  | ||||||
| 		VIOLET = 0xEE82EE, | 		VIOLET = 0xEE82EE, | ||||||
| 		WHEAT = 0xF5DEB3, | 		WHEAT = 0xF5DEB3, | ||||||
| 		WHITE = 0xFFFFFF, | 		WHITE = 0xFFFFFF, | ||||||
| 		WHITE_SMOKE = 0xF5F5F5, | 		WHITE_SMOKE = 0xF5F5F5, | ||||||
|  | 		WOOD = 0xDEB887, | ||||||
| 		YELLOW = 0xFFFF00, | 		YELLOW = 0xFFFF00, | ||||||
| 		YELLOW_GREEN = 0x9ACD32 | 		YELLOW_GREEN = 0x9ACD32 | ||||||
| 	}; | 	}; | ||||||
|  | @ -437,136 +342,86 @@ public: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // 鼠标消息
 | // 键值集合
 | ||||||
| class EMouseMsg | class EKeyCode | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	// 鼠标消息集合
 | 	enum VALUE | ||||||
| 	enum MOUSE_MSG |  | ||||||
| 	{ | 	{ | ||||||
| 		MOVE = 0x0200,	// 鼠标移动
 | 		UP = 0xC8, | ||||||
| 		LBUTTON_DOWN,	// 鼠标左键按下
 | 		LEFT = 0xCB, | ||||||
| 		LBUTTON_UP,		// 鼠标左键抬起
 | 		RIGHT = 0xCD, | ||||||
| 		LBUTTON_DBLCLK,	// 鼠标左键双击
 | 		DOWN = 0xD0, | ||||||
| 		RBUTTON_DOWN,	// 鼠标右键按下
 | 		ENTER = 0x1C, | ||||||
| 		RBUTTON_UP,		// 鼠标右键抬起
 | 		SPACE = 0x39, | ||||||
| 		RBUTTON_DBLCLK,	// 鼠标右键双击
 | 		ESC = 0x01, | ||||||
| 		MBUTTON_DOWN,	// 鼠标中键按下
 | 		BACK = 0x0E, | ||||||
| 		MBUTTON_UP,		// 鼠标中键抬起
 | 		TAB = 0x0F, | ||||||
| 		MBUTTON_DBLCLK,	// 鼠标中键双击
 | 		PAUSE = 0xC5, | ||||||
| 		WHEEL			// 滑动滚轮
 | 		Q = 0x10, | ||||||
|  | 		W = 0x11, | ||||||
|  | 		E = 0x12, | ||||||
|  | 		R = 0x13, | ||||||
|  | 		T = 0x14, | ||||||
|  | 		Y = 0x15, | ||||||
|  | 		U = 0x16, | ||||||
|  | 		I = 0x17, | ||||||
|  | 		O = 0x18, | ||||||
|  | 		P = 0x19, | ||||||
|  | 		A = 0x1E, | ||||||
|  | 		S = 0x1F, | ||||||
|  | 		D = 0x20, | ||||||
|  | 		F = 0x21, | ||||||
|  | 		G = 0x22, | ||||||
|  | 		H = 0x23, | ||||||
|  | 		J = 0x24, | ||||||
|  | 		K = 0x25, | ||||||
|  | 		L = 0x26, | ||||||
|  | 		Z = 0x2C, | ||||||
|  | 		X = 0x2D, | ||||||
|  | 		C = 0x2E, | ||||||
|  | 		V = 0x2F, | ||||||
|  | 		B = 0x30, | ||||||
|  | 		N = 0x31, | ||||||
|  | 		M = 0x32, | ||||||
|  | 		NUM1 = 0x02, | ||||||
|  | 		NUM2 = 0x03, | ||||||
|  | 		NUM3 = 0x04, | ||||||
|  | 		NUM4 = 0x05, | ||||||
|  | 		NUM5 = 0x06, | ||||||
|  | 		NUM6 = 0x07, | ||||||
|  | 		NUM7 = 0x08, | ||||||
|  | 		NUM8 = 0x09, | ||||||
|  | 		NUM9 = 0x0A, | ||||||
|  | 		NUM0 = 0x0B, | ||||||
|  | 		NUMPAD7 = 0x47, | ||||||
|  | 		NUMPAD8 = 0x48, | ||||||
|  | 		NUMPAD9 = 0x49, | ||||||
|  | 		NUMPAD4 = 0x4B, | ||||||
|  | 		NUMPAD5 = 0x4C, | ||||||
|  | 		NUMPAD6 = 0x4D, | ||||||
|  | 		NUMPAD1 = 0x4F, | ||||||
|  | 		NUMPAD2 = 0x50, | ||||||
|  | 		NUMPAD3 = 0x51, | ||||||
|  | 		NUMPAD0 = 0x52, | ||||||
|  | 		F1 = 0x3B, | ||||||
|  | 		F2 = 0x3C, | ||||||
|  | 		F3 = 0x3D, | ||||||
|  | 		F4 = 0x3E, | ||||||
|  | 		F5 = 0x3F, | ||||||
|  | 		F6 = 0x40, | ||||||
|  | 		F7 = 0x41, | ||||||
|  | 		F8 = 0x42, | ||||||
|  | 		F9 = 0x43, | ||||||
|  | 		F10 = 0x44 | ||||||
| 	}; | 	}; | ||||||
| 
 |  | ||||||
| 	// 获取鼠标横坐标
 |  | ||||||
| 	static DWORD getPosX(); |  | ||||||
| 
 |  | ||||||
| 	// 获取鼠标纵坐标
 |  | ||||||
| 	static DWORD getPosY(); |  | ||||||
| 
 |  | ||||||
| 	// 获取鼠标坐标
 |  | ||||||
| 	static EPoint getPos(); |  | ||||||
| 
 |  | ||||||
| 	// 获取鼠标左键按下状态
 |  | ||||||
| 	static bool isLButtonDown(); |  | ||||||
| 
 |  | ||||||
| 	// 获取鼠标中键按下状态
 |  | ||||||
| 	static bool isMButtonDown(); |  | ||||||
| 
 |  | ||||||
| 	// 获取鼠标右键按下状态
 |  | ||||||
| 	static bool isRButtonDown(); |  | ||||||
| 
 |  | ||||||
| 	// 获取 Shift 按键状态
 |  | ||||||
| 	static bool isShiftDown(); |  | ||||||
| 
 |  | ||||||
| 	// 获取 Ctrl 按键状态
 |  | ||||||
| 	static bool isCtrlDown(); |  | ||||||
| 
 |  | ||||||
| 	// 获取鼠标滚轮值
 |  | ||||||
| 	static DWORD getWheelDelta(); |  | ||||||
| 
 |  | ||||||
| 	// 获取当前鼠标消息类型
 |  | ||||||
| 	static MOUSE_MSG getMsg(); |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 	static UINT s_nMsg; |  | ||||||
| 	static WPARAM s_wParam; |  | ||||||
| 	static LPARAM s_lParam; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 按键消息
 |  | ||||||
| class EKeyboardMsg |  | ||||||
| { |  | ||||||
| public: |  | ||||||
| 	// 按键消息类型集合
 |  | ||||||
| 	enum KEYBOARD_MSG |  | ||||||
| 	{ |  | ||||||
| 		KEY_DOWN = 0x0100,	// 按下
 |  | ||||||
| 		KEY_UP				// 抬起
 |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	// 按键键值集合
 |  | ||||||
| 	enum KEY |  | ||||||
| 	{ |  | ||||||
| 		A = 'A', B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,					// 字母键值
 |  | ||||||
| 		NUM0 = '0', NUM1, NUM2, NUM3, NUM4, NUM5, NUM6, NUM7, NUM8, NUM9,									// 数字键值
 |  | ||||||
| 		NUMPAD0 = 0x60, NUMPAD1, NUMPAD2, NUMPAD3, NUMPAD4, NUMPAD5, NUMPAD6, NUMPAD7, NUMPAD8, NUMPAD9,	// 数字小键盘键值
 |  | ||||||
| 		F1 = 0x70, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12,											// F键键值
 |  | ||||||
| 		MULTIPLY,		// 乘号键键值
 |  | ||||||
| 		ADD,			// 加号键键值
 |  | ||||||
| 		SEPARATOR,		// 分割键键值
 |  | ||||||
| 		SUBTRACT,		// 减号键键值
 |  | ||||||
| 		DECIMAL,		// 小数点键键值
 |  | ||||||
| 		DIVIDE,			// 除号键键值
 |  | ||||||
| 		TAB = 0x09,		// TAB 键键值
 |  | ||||||
| 		ENTER = 0x0D,	// 回车键键值
 |  | ||||||
| 		SHIFT, CTRL, 	// SHIFT 键键值
 |  | ||||||
| 		ESC = 0x1B, 	// ESCAPE 键键值
 |  | ||||||
| 		SPACE = 0x20, 	// 空格键键值
 |  | ||||||
| 		PAGE_UP, 		// PageUp 键键值
 |  | ||||||
| 		PAGE_DOWN, 		// PageDown 键键值
 |  | ||||||
| 		END, 			// End 键键值
 |  | ||||||
| 		HOME, 			// Home 键键值
 |  | ||||||
| 		LEFT, 			// 左键键值
 |  | ||||||
| 		UP, 			// 上键键值
 |  | ||||||
| 		RIGHT, 			// 右键键值
 |  | ||||||
| 		DOWN			// 下键键值
 |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	// 获取按键消息类型
 |  | ||||||
| 	static KEYBOARD_MSG getMsg(); |  | ||||||
| 
 |  | ||||||
| 	// 获取键值
 |  | ||||||
| 	static KEY getKeyValue(); |  | ||||||
| 
 |  | ||||||
| 	// 获取按键消息的计数
 |  | ||||||
| 	static DWORD getCount(); |  | ||||||
| 
 |  | ||||||
| 	// 获取特定按键的状态
 |  | ||||||
| 	static bool isKeyDown( |  | ||||||
| 		KEY key |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 获取大小写锁定状态
 |  | ||||||
| 	static bool isCapitalLockOn(); |  | ||||||
| 
 |  | ||||||
| 	// 获取数字小键盘锁定状态
 |  | ||||||
| 	static bool isNumpadLockOn(); |  | ||||||
| 
 |  | ||||||
| 	// 获取滑动锁定状态
 |  | ||||||
| 	static bool isScrollLockOn(); |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 	static UINT s_nMsg; |  | ||||||
| 	static WPARAM s_wParam; |  | ||||||
| 	static LPARAM s_lParam; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class EGeometry; | class EGeometry; | ||||||
| 
 | 
 | ||||||
| // 物理消息
 | // 物理消息
 | ||||||
| class EPhysicsMsg | class EPhysicsEvent | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	enum INTERSECT_RELATION | 	enum INTERSECT_RELATION | ||||||
|  | @ -694,27 +549,27 @@ protected: | ||||||
| 
 | 
 | ||||||
| class ESprite; | class ESprite; | ||||||
| 
 | 
 | ||||||
| class ETexture : | class EImage : | ||||||
| 	public EObject | 	public EObject | ||||||
| { | { | ||||||
| 	friend ESprite; | 	friend ESprite; | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
| 	// 创建一个空的纹理
 | 	// 创建一个空的图片
 | ||||||
| 	ETexture(); | 	EImage(); | ||||||
| 
 | 
 | ||||||
| 	// 从本地文件中读取资源
 | 	// 从本地文件中读取资源
 | ||||||
| 	ETexture( | 	EImage( | ||||||
| 		const EString & fileName | 		LPCTSTR fileName | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 读取程序资源
 | 	// 读取程序资源
 | ||||||
| 	ETexture( | 	EImage( | ||||||
| 		LPCTSTR resourceName, | 		LPCTSTR resourceName, | ||||||
| 		LPCTSTR resourceType | 		LPCTSTR resourceType | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	virtual ~ETexture(); | 	virtual ~EImage(); | ||||||
| 
 | 
 | ||||||
| 	// 从本地文件中读取资源
 | 	// 从本地文件中读取资源
 | ||||||
| 	void loadFromFile( | 	void loadFromFile( | ||||||
|  | @ -758,42 +613,42 @@ protected: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ESpriteFrame : | class EKeyframe : | ||||||
| 	public EObject | 	public EObject | ||||||
| { | { | ||||||
| 	friend ESprite; | 	friend ESprite; | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
| 	// 创建空的精灵帧
 | 	// 创建空的关键帧
 | ||||||
| 	ESpriteFrame(); | 	EKeyframe(); | ||||||
| 
 | 
 | ||||||
| 	// 创建空的精灵帧
 | 	// 创建空的关键帧
 | ||||||
| 	ESpriteFrame( | 	EKeyframe( | ||||||
| 		ETexture * texture | 		EImage * texture | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建空的精灵帧
 | 	// 创建空的关键帧
 | ||||||
| 	ESpriteFrame( | 	EKeyframe( | ||||||
| 		const EString & imageFileName | 		const EString & imageFileName | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建空的精灵帧
 | 	// 创建空的关键帧
 | ||||||
| 	ESpriteFrame( | 	EKeyframe( | ||||||
| 		LPCTSTR resourceName, | 		LPCTSTR resourceName, | ||||||
| 		LPCTSTR resourceType | 		LPCTSTR resourceType | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建空的精灵帧
 | 	// 创建空的关键帧
 | ||||||
| 	ESpriteFrame( | 	EKeyframe( | ||||||
| 		ETexture * texture, | 		EImage * texture, | ||||||
| 		float x, | 		float x, | ||||||
| 		float y, | 		float y, | ||||||
| 		float width, | 		float width, | ||||||
| 		float height | 		float height | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建空的精灵帧
 | 	// 创建空的关键帧
 | ||||||
| 	ESpriteFrame( | 	EKeyframe( | ||||||
| 		const EString & imageFileName, | 		const EString & imageFileName, | ||||||
| 		float x, | 		float x, | ||||||
| 		float y, | 		float y, | ||||||
|  | @ -801,8 +656,8 @@ public: | ||||||
| 		float height | 		float height | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建空的精灵帧
 | 	// 创建空的关键帧
 | ||||||
| 	ESpriteFrame( | 	EKeyframe( | ||||||
| 		LPCTSTR resourceName, | 		LPCTSTR resourceName, | ||||||
| 		LPCTSTR resourceType, | 		LPCTSTR resourceType, | ||||||
| 		float x, | 		float x, | ||||||
|  | @ -811,7 +666,7 @@ public: | ||||||
| 		float height | 		float height | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	virtual ~ESpriteFrame(); | 	virtual ~EKeyframe(); | ||||||
| 
 | 
 | ||||||
| 	// 获取宽度
 | 	// 获取宽度
 | ||||||
| 	float getWidth() const; | 	float getWidth() const; | ||||||
|  | @ -819,16 +674,16 @@ public: | ||||||
| 	// 获取高度
 | 	// 获取高度
 | ||||||
| 	float getHeight() const; | 	float getHeight() const; | ||||||
| 
 | 
 | ||||||
| 	// 获取纹理
 | 	// 获取图片
 | ||||||
| 	ETexture * getTexture() const; | 	EImage * getImage() const; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	// 获取纹理
 | 	// 修改图片
 | ||||||
| 	void _setTexture( | 	void _setImage( | ||||||
| 		ETexture * texture | 		EImage * texture | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 裁剪纹理
 | 	// 裁剪图片
 | ||||||
| 	void _clipTexture( | 	void _clipTexture( | ||||||
| 		float x, | 		float x, | ||||||
| 		float y, | 		float y, | ||||||
|  | @ -841,39 +696,98 @@ protected: | ||||||
| 	float	m_fSourceClipY; | 	float	m_fSourceClipY; | ||||||
| 	float	m_fSourceClipWidth; | 	float	m_fSourceClipWidth; | ||||||
| 	float	m_fSourceClipHeight; | 	float	m_fSourceClipHeight; | ||||||
| 	ETexture * m_pTexture; | 	EImage * m_pImage; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | class ESceneManager; | ||||||
| class ENode; | class ENode; | ||||||
|  | class EAction; | ||||||
| 
 | 
 | ||||||
| // 定时器回调函数(参数为该定时器被调用的次数,从 0 开始)
 | // 场景
 | ||||||
| typedef std::function<void(int)> TIMER_CALLBACK; | class EScene : | ||||||
|  | 	public EObject | ||||||
|  | { | ||||||
|  | 	friend ESceneManager; | ||||||
| 
 | 
 | ||||||
| // 按钮点击回调函数
 | public: | ||||||
| typedef std::function<void()> BUTTON_CLICK_CALLBACK; | 	EScene(); | ||||||
| 
 | 
 | ||||||
| // 按键消息监听回调函数
 | 	virtual ~EScene(); | ||||||
| typedef std::function<void()> KEY_LISTENER_CALLBACK; |  | ||||||
| 
 | 
 | ||||||
| // 鼠标消息监听回调函数
 | 	// 重写这个函数,它将在进入这个场景时自动执行
 | ||||||
| typedef std::function<void()> MOUSE_LISTENER_CALLBACK; | 	virtual void onEnter() {} | ||||||
| 
 | 
 | ||||||
| // 鼠标点击消息监听回调函数(参数为点击位置)
 | 	// 重写这个函数,它将在离开这个场景时自动执行
 | ||||||
| typedef std::function<void(EPoint mousePos)> MOUSE_CLICK_LISTENER_CALLBACK; | 	virtual void onExit() {} | ||||||
| 
 | 
 | ||||||
| // 鼠标按下消息监听回调函数(参数为按下位置)
 | 	// 重写这个函数,它将在窗口激活时执行
 | ||||||
| typedef MOUSE_CLICK_LISTENER_CALLBACK  MOUSE_PRESS_LISTENER_CALLBACK; | 	virtual bool onActivate() { return false; } | ||||||
| 
 | 
 | ||||||
| // 鼠标双击消息监听回调函数(参数为双击位置)
 | 	// 重写这个函数,它将在窗口非激活时执行
 | ||||||
| typedef MOUSE_CLICK_LISTENER_CALLBACK  MOUSE_DBLCLK_LISTENER_CALLBACK; | 	virtual bool onInactive() { return false; } | ||||||
| 
 | 
 | ||||||
| // 鼠标拖动消息监听回调函数(参数为拖动前位置和拖动后位置)
 | 	// 重写这个函数,它将在关闭窗口时执行
 | ||||||
| typedef std::function<void(EPoint begin, EPoint end)> MOUSE_DRAG_LISTENER_CALLBACK; | 	virtual bool onCloseWindow() { return true; } | ||||||
| 
 | 
 | ||||||
| // 物理世界消息监听器回调函数
 | 	// 重写这个函数,它将在每一帧画面刷新时执行
 | ||||||
| typedef std::function<void()> PHYSICS_LISTENER_CALLBACK; | 	virtual void onUpdate() {} | ||||||
| 
 | 
 | ||||||
| // 碰撞消息监听器回调函数
 | 	// 添加子节点到场景
 | ||||||
| typedef PHYSICS_LISTENER_CALLBACK  COLLISION_LISTENER_CALLBACK; | 	void add( | ||||||
|  | 		ENode * child, | ||||||
|  | 		int zOrder = 0 | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 删除子节点
 | ||||||
|  | 	bool remove( | ||||||
|  | 		ENode * child | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 删除相同名称的子节点
 | ||||||
|  | 	void remove( | ||||||
|  | 		const EString &childName | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 获取所有子节点
 | ||||||
|  | 	std::vector<e2d::ENode*> getChildren(); | ||||||
|  | 
 | ||||||
|  | 	// 获取子节点数量
 | ||||||
|  | 	size_t getChildrenCount() const; | ||||||
|  | 
 | ||||||
|  | 	// 根据名称获取子节点
 | ||||||
|  | 	ENode * getChild( | ||||||
|  | 		const EString &childName | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 获取根节点
 | ||||||
|  | 	ENode * getRoot() const; | ||||||
|  | 
 | ||||||
|  | 	// 清空所有子成员
 | ||||||
|  | 	void clearAllChildren(); | ||||||
|  | 
 | ||||||
|  | 	// 执行动画
 | ||||||
|  | 	void runAction( | ||||||
|  | 		EAction * action | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 开启几何图形的渲染
 | ||||||
|  | 	void setGeometryVisiable( | ||||||
|  | 		bool visiable | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  | 	// 渲染场景画面
 | ||||||
|  | 	void _render(); | ||||||
|  | 
 | ||||||
|  | 	// 更新场景内容
 | ||||||
|  | 	void _update(); | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  | 	bool m_bSortNeeded; | ||||||
|  | 	bool m_bWillSave; | ||||||
|  | 	bool m_bGeometryVisiable; | ||||||
|  | 	ENode * m_pRoot; | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | @ -56,7 +56,7 @@ public: | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	// 判断两形状的交集关系
 | 	// 判断两形状的交集关系
 | ||||||
| 	virtual EPhysicsMsg::INTERSECT_RELATION _intersectWith( | 	virtual EPhysicsEvent::INTERSECT_RELATION _intersectWith( | ||||||
| 		EGeometry * pGeometry | 		EGeometry * pGeometry | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,15 +6,12 @@ namespace e2d | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| class ENode; | class ENode; | ||||||
| class EMsgManager; |  | ||||||
| class EPhysicsManager; | class EPhysicsManager; | ||||||
| 
 | 
 | ||||||
| // 监听器
 | // 监听器
 | ||||||
| class EListener : | class EListener : | ||||||
| 	public EObject | 	public EObject | ||||||
| { | { | ||||||
| 	friend EMsgManager; |  | ||||||
| 
 |  | ||||||
| public: | public: | ||||||
| 	EListener(); | 	EListener(); | ||||||
| 
 | 
 | ||||||
|  | @ -78,265 +75,6 @@ protected: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // 鼠标消息监听器
 |  | ||||||
| class EListenerMouse : |  | ||||||
| 	public EListener |  | ||||||
| { |  | ||||||
| 	friend EMsgManager; |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 	EListenerMouse(); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouse( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouse( |  | ||||||
| 		const MOUSE_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouse( |  | ||||||
| 		const EString &name, |  | ||||||
| 		const MOUSE_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 设置监听器回调函数
 |  | ||||||
| 	void setCallback( |  | ||||||
| 		const MOUSE_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 绑定监听器到场景
 |  | ||||||
| 	virtual void bindWith( |  | ||||||
| 		EScene * pParentScene |  | ||||||
| 	) override; |  | ||||||
| 
 |  | ||||||
| 	// 绑定监听器到节点
 |  | ||||||
| 	virtual void bindWith( |  | ||||||
| 		ENode * pParentNode |  | ||||||
| 	) override; |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	// 执行监听器回调函数
 |  | ||||||
| 	virtual void _callOn() override; |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	MOUSE_LISTENER_CALLBACK m_Callback; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 鼠标按下消息监听器
 |  | ||||||
| class EListenerMousePress : |  | ||||||
| 	public EListenerMouse |  | ||||||
| { |  | ||||||
| public: |  | ||||||
| 	EListenerMousePress(); |  | ||||||
| 
 |  | ||||||
| 	EListenerMousePress( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerMousePress( |  | ||||||
| 		const MOUSE_PRESS_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerMousePress( |  | ||||||
| 		const EString &name, |  | ||||||
| 		const MOUSE_PRESS_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 设置监听器回调函数
 |  | ||||||
| 	void setCallback( |  | ||||||
| 		const MOUSE_PRESS_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	// 执行监听器回调函数
 |  | ||||||
| 	virtual void _callOn() override; |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	MOUSE_PRESS_LISTENER_CALLBACK m_Callback; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 鼠标点击消息监听器
 |  | ||||||
| class EListenerMouseClick : |  | ||||||
| 	public EListenerMouse |  | ||||||
| { |  | ||||||
| public: |  | ||||||
| 	EListenerMouseClick(); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouseClick( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouseClick( |  | ||||||
| 		const MOUSE_CLICK_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouseClick( |  | ||||||
| 		const EString &name, |  | ||||||
| 		const MOUSE_CLICK_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 设置监听器回调函数
 |  | ||||||
| 	void setCallback( |  | ||||||
| 		const MOUSE_CLICK_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	// 执行监听器回调函数
 |  | ||||||
| 	virtual void _callOn() override; |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	bool m_bPressed; |  | ||||||
| 	MOUSE_CLICK_LISTENER_CALLBACK m_Callback; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 鼠标点击消息监听器
 |  | ||||||
| class EListenerMouseDoubleClick : |  | ||||||
| 	public EListenerMouse |  | ||||||
| { |  | ||||||
| public: |  | ||||||
| 	EListenerMouseDoubleClick(); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouseDoubleClick( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouseDoubleClick( |  | ||||||
| 		const MOUSE_DBLCLK_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouseDoubleClick( |  | ||||||
| 		const EString &name, |  | ||||||
| 		const MOUSE_DBLCLK_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 设置监听器回调函数
 |  | ||||||
| 	void setCallback( |  | ||||||
| 		const MOUSE_DBLCLK_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	// 执行监听器回调函数
 |  | ||||||
| 	virtual void _callOn() override; |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	bool m_bPressed; |  | ||||||
| 	MOUSE_DBLCLK_LISTENER_CALLBACK m_Callback; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 鼠标拖动消息监听器
 |  | ||||||
| class EListenerMouseDrag : |  | ||||||
| 	public EListenerMouse |  | ||||||
| { |  | ||||||
| public: |  | ||||||
| 	EListenerMouseDrag(); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouseDrag( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouseDrag( |  | ||||||
| 		const MOUSE_DRAG_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerMouseDrag( |  | ||||||
| 		const EString &name, |  | ||||||
| 		const MOUSE_DRAG_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 设置监听器回调函数
 |  | ||||||
| 	void setCallback( |  | ||||||
| 		const MOUSE_DRAG_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	// 执行监听器回调函数
 |  | ||||||
| 	virtual void _callOn() override; |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	EPoint	m_Begin; |  | ||||||
| 	MOUSE_DRAG_LISTENER_CALLBACK m_Callback; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 按键消息监听器
 |  | ||||||
| class EListenerKeyboard : |  | ||||||
| 	public EListener |  | ||||||
| { |  | ||||||
| 	friend EMsgManager; |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 	EListenerKeyboard(); |  | ||||||
| 
 |  | ||||||
| 	EListenerKeyboard( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerKeyboard( |  | ||||||
| 		const KEY_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerKeyboard( |  | ||||||
| 		const EString &name, |  | ||||||
| 		const KEY_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 设置监听器回调函数
 |  | ||||||
| 	void setCallback( |  | ||||||
| 		const KEY_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 绑定监听器到场景
 |  | ||||||
| 	virtual void bindWith( |  | ||||||
| 		EScene * pParentScene |  | ||||||
| 	) override; |  | ||||||
| 
 |  | ||||||
| 	// 绑定监听器到节点
 |  | ||||||
| 	virtual void bindWith( |  | ||||||
| 		ENode * pParentNode |  | ||||||
| 	) override; |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	// 执行监听器回调函数
 |  | ||||||
| 	virtual void _callOn() override; |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	KEY_LISTENER_CALLBACK m_Callback; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 按键按下消息监听
 |  | ||||||
| class EListenerKeyboardPress : |  | ||||||
| 	public EListenerKeyboard |  | ||||||
| { |  | ||||||
| 	friend EMsgManager; |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 	EListenerKeyboardPress(); |  | ||||||
| 
 |  | ||||||
| 	EListenerKeyboardPress( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerKeyboardPress( |  | ||||||
| 		const KEY_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	EListenerKeyboardPress( |  | ||||||
| 		const EString &name, |  | ||||||
| 		const KEY_LISTENER_CALLBACK &callback |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	// 执行监听器回调函数
 |  | ||||||
| 	virtual void _callOn() override; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 物理世界消息监听器
 | // 物理世界消息监听器
 | ||||||
| class EListenerPhysics : | class EListenerPhysics : | ||||||
| 	public EListener | 	public EListener | ||||||
|  | @ -351,17 +89,17 @@ public: | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	EListenerPhysics( | 	EListenerPhysics( | ||||||
| 		const PHYSICS_LISTENER_CALLBACK &callback | 		const PhysLsnrCallback &callback | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	EListenerPhysics( | 	EListenerPhysics( | ||||||
| 		const EString &name, | 		const EString &name, | ||||||
| 		const PHYSICS_LISTENER_CALLBACK &callback | 		const PhysLsnrCallback &callback | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置监听器回调函数
 | 	// 设置监听器回调函数
 | ||||||
| 	void setCallback( | 	void setCallback( | ||||||
| 		const PHYSICS_LISTENER_CALLBACK &callback | 		const PhysLsnrCallback &callback | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 将监听器与场景绑定
 | 	// 将监听器与场景绑定
 | ||||||
|  | @ -379,7 +117,7 @@ protected: | ||||||
| 	virtual void _callOn() override; | 	virtual void _callOn() override; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	PHYSICS_LISTENER_CALLBACK m_Callback; | 	PhysLsnrCallback m_Callback; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -395,12 +133,12 @@ public: | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	EListenerPhysicsCollision( | 	EListenerPhysicsCollision( | ||||||
| 		const COLLISION_LISTENER_CALLBACK &callback | 		const ClsLsnrCallback &callback | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	EListenerPhysicsCollision( | 	EListenerPhysicsCollision( | ||||||
| 		const EString &name, | 		const EString &name, | ||||||
| 		const COLLISION_LISTENER_CALLBACK &callback | 		const ClsLsnrCallback &callback | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|  | @ -408,7 +146,7 @@ protected: | ||||||
| 	virtual void _callOn() override; | 	virtual void _callOn() override; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	COLLISION_LISTENER_CALLBACK m_Callback; | 	ClsLsnrCallback m_Callback; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | @ -24,6 +24,10 @@ | ||||||
| #define WIN32_LEAN_AND_MEAN | #define WIN32_LEAN_AND_MEAN | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef DIRECTINPUT_VERSION | ||||||
|  | #define DIRECTINPUT_VERSION 0x0800 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| // Windows Header Files:
 | // Windows Header Files:
 | ||||||
| #include <windows.h> | #include <windows.h> | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
|  | @ -34,15 +38,22 @@ | ||||||
| #include <d2d1.h> | #include <d2d1.h> | ||||||
| #include <d2d1helper.h> | #include <d2d1helper.h> | ||||||
| #include <dwrite.h> | #include <dwrite.h> | ||||||
|  | #include <dinput.h> | ||||||
| #include <wincodec.h> | #include <wincodec.h> | ||||||
| #pragma comment(lib, "d2d1.lib") | #pragma comment(lib, "d2d1.lib") | ||||||
| #pragma comment(lib, "dwrite.lib") | #pragma comment(lib, "dwrite.lib") | ||||||
| #pragma comment(lib, "windowscodecs.lib") | #pragma comment(lib, "windowscodecs.lib") | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | #ifndef HINST_THISCOMPONENT | ||||||
|  | EXTERN_C IMAGE_DOS_HEADER __ImageBase; | ||||||
|  | #define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| #ifndef ASSERT_IF | #ifndef ASSERT_IF | ||||||
| #if defined( DEBUG ) || defined( _DEBUG ) | #if defined( DEBUG ) || defined( _DEBUG ) | ||||||
| #define ASSERT(b, m) do {if (!(b)) { fprintf(stderr, "Assert: " #m "\n"); assert(b); }} while(0) | 	#define ASSERT(b, m) do {if (!(b)) { fprintf(stderr, "Assert: " #m "\n"); assert(b); }} while(0) | ||||||
| #else | #else | ||||||
| 	#define ASSERT(b, m) ((void)0) | 	#define ASSERT(b, m) ((void)0) | ||||||
| #endif //DEBUG || _DEBUG
 | #endif //DEBUG || _DEBUG
 | ||||||
|  | @ -50,18 +61,8 @@ | ||||||
| 
 | 
 | ||||||
| #ifndef WARN_IF | #ifndef WARN_IF | ||||||
| #if defined( DEBUG ) || defined( _DEBUG ) | #if defined( DEBUG ) || defined( _DEBUG ) | ||||||
| #define WARN_IF(b, m) do {if (b) { fprintf(stderr, "Warning: " #m "\n"); }} while(0) | 	#define WARN_IF(b, m) do {if (b) { fprintf(stderr, "Warning: " #m "\n"); }} while(0) | ||||||
| #else | #else | ||||||
| #define WARN_IF(b, m) ((void)0) | 	#define WARN_IF(b, m) ((void)0) | ||||||
| #endif //DEBUG || _DEBUG
 | #endif //DEBUG || _DEBUG
 | ||||||
| #endif | #endif | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #define DEPRECATED_ATTRIBUTE __declspec(deprecated) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| template<typename T> |  | ||||||
| inline void SafeDelete(T** p) { if (*p) { delete *p; *p = nullptr; } } |  | ||||||
| 
 |  | ||||||
| template<typename T> |  | ||||||
| inline void SafeRelease(T** p) { if (*p) { (*p)->release(); *p = nullptr; } } |  | ||||||
							
								
								
									
										191
									
								
								core/emanagers.h
								
								
								
								
							
							
						
						
									
										191
									
								
								core/emanagers.h
								
								
								
								
							|  | @ -5,21 +5,21 @@ | ||||||
| namespace e2d | namespace e2d | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| class EApp; | class EGame; | ||||||
|  | class ERenderer; | ||||||
| class EObject; | class EObject; | ||||||
| class EScene; | class EScene; | ||||||
| class ENode; | class ENode; | ||||||
| class ETimer; | class ETimer; | ||||||
| class EAction; | class EAction; | ||||||
| class EListenerMouse; |  | ||||||
| class EListenerKeyboard; |  | ||||||
| class EGeometry; | class EGeometry; | ||||||
|  | class ETransition; | ||||||
| class EListenerPhysics; | class EListenerPhysics; | ||||||
| 
 | 
 | ||||||
| // 对象管理器
 | // 对象管理器
 | ||||||
| class EObjectManager | class EObjectManager | ||||||
| { | { | ||||||
| 	friend EApp; | 	friend EGame; | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
| 	// 将一个节点放入内存池
 | 	// 将一个节点放入内存池
 | ||||||
|  | @ -36,154 +36,47 @@ private: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // 消息管理器
 | // 场景管理器
 | ||||||
| class EMsgManager | class ESceneManager | ||||||
| { | { | ||||||
| 	friend EApp; | 	friend EGame; | ||||||
| 	friend EScene; | 	friend ERenderer; | ||||||
| 	friend ENode; |  | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
| 	// 绑定鼠标消息监听器到场景
 | 	// 切换场景
 | ||||||
| 	static void bindListener( | 	static void enterScene( | ||||||
| 		EListenerMouse * listener, | 		EScene * scene,						/* 下一个场景的指针 */ | ||||||
| 		EScene * pParentScene | 		ETransition * transition = nullptr,	/* 场景切换动画 */ | ||||||
|  | 		bool saveCurrentScene = true		/* 是否保存当前场景 */ | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 绑定鼠标消息监听器到节点
 | 	// 返回上一场景
 | ||||||
| 	static void bindListener( | 	static void backScene( | ||||||
| 		EListenerMouse * listener, | 		ETransition * transition = nullptr	/* 场景切换动画 */ | ||||||
| 		ENode * pParentNode |  | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 启动具有相同名称的鼠标消息监听器
 | 	// 清空保存的所有场景
 | ||||||
| 	static void startMouseListeners( | 	static void clearScene(); | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 | 
 | ||||||
| 	// 停止具有相同名称的鼠标消息监听器
 | 	// 获取当前场景
 | ||||||
| 	static void stopMouseListeners( | 	static EScene * getCurrentScene(); | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 删除具有相同名称的鼠标消息监听器
 |  | ||||||
| 	static void delMouseListeners( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 启动绑定在场景及其子节点上的所有鼠标消息监听器
 |  | ||||||
| 	static void startAllMouseListenersBindedWith( |  | ||||||
| 		EScene * pParentScene |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 停止绑定在场景及其子节点上的所有鼠标消息监听器
 |  | ||||||
| 	static void stopAllMouseListenersBindedWith( |  | ||||||
| 		EScene * pParentScene |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 启动绑定在节点上的所有鼠标消息监听器
 |  | ||||||
| 	static void startAllMouseListenersBindedWith( |  | ||||||
| 		ENode * pParentNode |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 停止绑定在节点上的所有鼠标消息监听器
 |  | ||||||
| 	static void stopAllMouseListenersBindedWith( |  | ||||||
| 		ENode * pParentNode |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 启动所有鼠标消息监听器
 |  | ||||||
| 	static void startAllMouseListeners(); |  | ||||||
| 
 |  | ||||||
| 	// 停止所有鼠标消息监听器
 |  | ||||||
| 	static void stopAllMouseListeners(); |  | ||||||
| 
 |  | ||||||
| 	// 绑定按键消息监听器到场景
 |  | ||||||
| 	static void bindListener( |  | ||||||
| 		EListenerKeyboard * listener, |  | ||||||
| 		EScene * pParentScene |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 绑定按键消息监听器到节点
 |  | ||||||
| 	static void bindListener( |  | ||||||
| 		EListenerKeyboard * listener, |  | ||||||
| 		ENode * pParentNode |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 启动名称相同的按键消息监听器
 |  | ||||||
| 	static void startKeyboardListeners( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 停止名称相同的按键消息监听器
 |  | ||||||
| 	static void stopKeyboardListeners( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 删除名称相同的按键消息监听器
 |  | ||||||
| 	static void delKeyboardListeners( |  | ||||||
| 		const EString &name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 启动绑定在场景及其子节点上的所有按键消息监听器
 |  | ||||||
| 	static void startAllKeyboardListenersBindedWith( |  | ||||||
| 		EScene * pParentScene |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 停止绑定在场景及其子节点上的所有按键消息监听器
 |  | ||||||
| 	static void stopAllKeyboardListenersBindedWith( |  | ||||||
| 		EScene * pParentScene |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 启动绑定在节点上的所有按键消息监听器
 |  | ||||||
| 	static void startAllKeyboardListenersBindedWith( |  | ||||||
| 		ENode * pParentNode |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 停止绑定在节点上的所有按键消息监听器
 |  | ||||||
| 	static void stopAllKeyboardListenersBindedWith( |  | ||||||
| 		ENode * pParentNode |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 启动所有按键消息监听器
 |  | ||||||
| 	static void startAllKeyboardListeners(); |  | ||||||
| 
 |  | ||||||
| 	// 停止所有按键消息监听器
 |  | ||||||
| 	static void stopAllKeyboardListeners(); |  | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 	// 清除所有监听器
 | 	// 更新场景内容
 | ||||||
| 	static void _clearManager(); | 	static void __update(); | ||||||
| 
 | 
 | ||||||
| 	// 清除绑定在节点上的所有鼠标消息监听器
 | 	// 渲染场景画面
 | ||||||
| 	static void _clearAllMouseListenersBindedWith( | 	static void __render(); | ||||||
| 		ENode * pParentNode |  | ||||||
| 	); |  | ||||||
| 
 | 
 | ||||||
| 	// 清除绑定在节点上的所有按键消息监听器
 | 	// 进入下一场景
 | ||||||
| 	static void _clearAllKeyboardListenersBindedWith( | 	static void __enterNextScene(); | ||||||
| 		ENode * pParentNode |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 鼠标消息程序
 |  | ||||||
| 	static void MouseProc( |  | ||||||
| 		UINT message, |  | ||||||
| 		WPARAM wParam, |  | ||||||
| 		LPARAM lParam |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 按键消息程序
 |  | ||||||
| 	static void KeyboardProc( |  | ||||||
| 		UINT message, |  | ||||||
| 		WPARAM wParam, |  | ||||||
| 		LPARAM lParam |  | ||||||
| 	); |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // 定时器管理器
 | // 定时器管理器
 | ||||||
| class ETimerManager | class ETimerManager | ||||||
| { | { | ||||||
| 	friend EApp; | 	friend EGame; | ||||||
| 	friend EScene; | 	friend EScene; | ||||||
| 	friend ENode; | 	friend ENode; | ||||||
| 
 | 
 | ||||||
|  | @ -242,26 +135,23 @@ public: | ||||||
| 	static void stopAllTimers(); | 	static void stopAllTimers(); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 	// 清空定时器管理器
 | 	// 更新定时器
 | ||||||
| 	static void _clearManager(); | 	static void __update(); | ||||||
| 
 | 
 | ||||||
| 	// 清空绑定在节点上的所有定时器
 | 	// 清空绑定在节点上的所有定时器
 | ||||||
| 	static void _clearAllTimersBindedWith( | 	static void __clearAllTimersBindedWith( | ||||||
| 		ENode * pParentNode | 		ENode * pParentNode | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 重置定时器状态
 | 	// 重置定时器状态
 | ||||||
| 	static void _resetAllTimers(); | 	static void __resetAllTimers(); | ||||||
| 
 |  | ||||||
| 	// 定时器执行程序
 |  | ||||||
| 	static void TimerProc(); |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // 动作管理器
 | // 动作管理器
 | ||||||
| class EActionManager | class EActionManager | ||||||
| { | { | ||||||
| 	friend EApp; | 	friend EGame; | ||||||
| 	friend EScene; | 	friend EScene; | ||||||
| 	friend ENode; | 	friend ENode; | ||||||
| 
 | 
 | ||||||
|  | @ -272,7 +162,7 @@ public: | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 继续绑定在节点上的所有动作
 | 	// 继续绑定在节点上的所有动作
 | ||||||
| 	static void startAllActionsBindedWith( | 	static void resumeAllActionsBindedWith( | ||||||
| 		ENode * pTargetNode | 		ENode * pTargetNode | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | @ -287,7 +177,7 @@ public: | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 继续所有动作
 | 	// 继续所有动作
 | ||||||
| 	static void startAllActions(); | 	static void resumeAllActions(); | ||||||
| 
 | 
 | ||||||
| 	// 暂停所有动作
 | 	// 暂停所有动作
 | ||||||
| 	static void pauseAllActions(); | 	static void pauseAllActions(); | ||||||
|  | @ -296,25 +186,22 @@ public: | ||||||
| 	static void stopAllActions(); | 	static void stopAllActions(); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 	// 清空动画管理器
 | 	// 更新动画状态
 | ||||||
| 	static void _clearManager(); | 	static void __update(); | ||||||
| 
 | 
 | ||||||
| 	// 清空绑定在节点上的所有动作
 | 	// 清空绑定在节点上的所有动作
 | ||||||
| 	static void _clearAllActionsBindedWith( | 	static void __clearAllActionsBindedWith( | ||||||
| 		ENode * pTargetNode | 		ENode * pTargetNode | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 重置所有动作状态
 | 	// 重置所有动作状态
 | ||||||
| 	static void _resetAllActions(); | 	static void __resetAllActions(); | ||||||
| 
 |  | ||||||
| 	// 动作执行程序
 |  | ||||||
| 	static void ActionProc(); |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class EPhysicsManager | class EPhysicsManager | ||||||
| { | { | ||||||
| 	friend EApp; | 	friend EGame; | ||||||
| 	friend EScene; | 	friend EScene; | ||||||
| 	friend ENode; | 	friend ENode; | ||||||
| 	friend EGeometry; | 	friend EGeometry; | ||||||
|  |  | ||||||
|  | @ -31,11 +31,17 @@ public: | ||||||
| 
 | 
 | ||||||
| 	virtual ~ENode(); | 	virtual ~ENode(); | ||||||
| 
 | 
 | ||||||
| 	// 重写这个函数,它将在节点进入场景时自动执行
 | 	// 节点进入场景时,这个函数将自动运行
 | ||||||
| 	virtual void onEnter(); | 	virtual void onEnter() {} | ||||||
| 
 | 
 | ||||||
| 	// 重写这个函数,它将在节点离开场景时自动执行
 | 	// 节点离开场景时,这个函数将自动运行
 | ||||||
| 	virtual void onExit(); | 	virtual void onExit() {} | ||||||
|  | 
 | ||||||
|  | 	// 每一帧画面刷新时,这个函数将自动运行
 | ||||||
|  | 	virtual void onUpdate() {} | ||||||
|  | 
 | ||||||
|  | 	// 渲染节点时,这个函数将自动运行
 | ||||||
|  | 	virtual void onRender() {} | ||||||
| 
 | 
 | ||||||
| 	// 获取节点显示状态
 | 	// 获取节点显示状态
 | ||||||
| 	virtual bool isVisiable() const; | 	virtual bool isVisiable() const; | ||||||
|  | @ -163,7 +169,7 @@ public: | ||||||
| 
 | 
 | ||||||
| 	// 移动节点
 | 	// 移动节点
 | ||||||
| 	virtual void movePos( | 	virtual void movePos( | ||||||
| 		const EVec & v | 		const EVector2 & v | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置节点绘图顺序
 | 	// 设置节点绘图顺序
 | ||||||
|  | @ -295,7 +301,7 @@ public: | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 继续所有暂停动画
 | 	// 继续所有暂停动画
 | ||||||
| 	virtual void startAllActions(); | 	virtual void resumeAllActions(); | ||||||
| 
 | 
 | ||||||
| 	// 暂停所有动画
 | 	// 暂停所有动画
 | ||||||
| 	virtual void pauseAllActions(); | 	virtual void pauseAllActions(); | ||||||
|  | @ -411,22 +417,22 @@ public: | ||||||
| 
 | 
 | ||||||
| 	// 从文理资源创建精灵
 | 	// 从文理资源创建精灵
 | ||||||
| 	ESprite( | 	ESprite( | ||||||
| 		ETexture * texture | 		EImage * image | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 从精灵帧创建精灵
 | 	// 从关键帧创建精灵
 | ||||||
| 	ESprite( | 	ESprite( | ||||||
| 		ESpriteFrame * spriteFrame | 		EKeyframe * spriteFrame | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 从文件图片创建精灵
 | 	// 从文件图片创建精灵
 | ||||||
| 	ESprite( | 	ESprite( | ||||||
| 		const EString & imageFileName | 		LPCTSTR imageFileName | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 从文件图片创建精灵并裁剪
 | 	// 从文件图片创建精灵并裁剪
 | ||||||
| 	ESprite( | 	ESprite( | ||||||
| 		const EString & imageFileName, | 		LPCTSTR imageFileName, | ||||||
| 		float x, | 		float x, | ||||||
| 		float y, | 		float y, | ||||||
| 		float width, | 		float width, | ||||||
|  | @ -451,37 +457,37 @@ public: | ||||||
| 
 | 
 | ||||||
| 	virtual ~ESprite(); | 	virtual ~ESprite(); | ||||||
| 	 | 	 | ||||||
| 	// 加载精灵纹理
 | 	// 加载精灵图片
 | ||||||
| 	void loadFrom( | 	void loadFrom( | ||||||
| 		ETexture * texture | 		EImage * texture | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 从本地文件加载纹理
 | 	// 从本地文件加载图片
 | ||||||
| 	void loadFrom( | 	void loadFrom( | ||||||
| 		const EString & imageFileName | 		LPCTSTR imageFileName | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 从资源加载纹理
 | 	// 从资源加载图片
 | ||||||
| 	void loadFrom( | 	void loadFrom( | ||||||
| 		LPCTSTR resourceName, | 		LPCTSTR resourceName, | ||||||
| 		LPCTSTR resourceType | 		LPCTSTR resourceType | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 加载纹理并裁剪
 | 	// 加载图片并裁剪
 | ||||||
| 	void loadFrom( | 	void loadFrom( | ||||||
| 		ETexture * texture, | 		EImage * image, | ||||||
| 		float x, | 		float x, | ||||||
| 		float y, | 		float y, | ||||||
| 		float width, | 		float width, | ||||||
| 		float height | 		float height | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 从精灵帧加载资源
 | 	// 从关键帧加载资源
 | ||||||
| 	void loadFrom( | 	void loadFrom( | ||||||
| 		ESpriteFrame * frame | 		EKeyframe * frame | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 裁剪纹理
 | 	// 裁剪图片
 | ||||||
| 	void clip( | 	void clip( | ||||||
| 		float x, | 		float x, | ||||||
| 		float y, | 		float y, | ||||||
|  | @ -489,14 +495,13 @@ public: | ||||||
| 		float height | 		float height | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| protected: |  | ||||||
| 	// 渲染精灵
 | 	// 渲染精灵
 | ||||||
| 	virtual void _render() override; | 	virtual void onRender() override; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	float	m_fSourceClipX; | 	float	m_fSourceClipX; | ||||||
| 	float	m_fSourceClipY; | 	float	m_fSourceClipY; | ||||||
| 	ETexture * m_pTexture; | 	EImage * m_pImage; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -562,10 +567,10 @@ public: | ||||||
| 		float wordWrapWidth | 		float wordWrapWidth | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| protected: |  | ||||||
| 	// 渲染文字
 | 	// 渲染文字
 | ||||||
| 	virtual void _render() override; | 	virtual void onRender() override; | ||||||
| 
 | 
 | ||||||
|  | protected: | ||||||
| 	// 创建文字布局
 | 	// 创建文字布局
 | ||||||
| 	void _initTextLayout(); | 	void _initTextLayout(); | ||||||
| 
 | 
 | ||||||
|  | @ -589,14 +594,14 @@ public: | ||||||
| 	// 创建按钮
 | 	// 创建按钮
 | ||||||
| 	EButton( | 	EButton( | ||||||
| 		ENode * normal,		/* 普通状态 */ | 		ENode * normal,		/* 普通状态 */ | ||||||
| 		const BUTTON_CLICK_CALLBACK & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建按钮
 | 	// 创建按钮
 | ||||||
| 	EButton( | 	EButton( | ||||||
| 		ENode * normal,		/* 普通状态 */ | 		ENode * normal,		/* 普通状态 */ | ||||||
| 		ENode * selected,	/* 鼠标按下状态 */ | 		ENode * selected,	/* 鼠标按下状态 */ | ||||||
| 		const BUTTON_CLICK_CALLBACK & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建按钮
 | 	// 创建按钮
 | ||||||
|  | @ -604,7 +609,7 @@ public: | ||||||
| 		ENode * normal,		/* 普通状态 */ | 		ENode * normal,		/* 普通状态 */ | ||||||
| 		ENode * mouseover,	/* 鼠标移入状态 */ | 		ENode * mouseover,	/* 鼠标移入状态 */ | ||||||
| 		ENode * selected,	/* 鼠标按下状态 */ | 		ENode * selected,	/* 鼠标按下状态 */ | ||||||
| 		const BUTTON_CLICK_CALLBACK & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建按钮
 | 	// 创建按钮
 | ||||||
|  | @ -613,7 +618,7 @@ public: | ||||||
| 		ENode * mouseover,	/* 鼠标移入状态 */ | 		ENode * mouseover,	/* 鼠标移入状态 */ | ||||||
| 		ENode * selected,	/* 鼠标移入状态 */ | 		ENode * selected,	/* 鼠标移入状态 */ | ||||||
| 		ENode * disabled,	/* 按钮禁用状态 */ | 		ENode * disabled,	/* 按钮禁用状态 */ | ||||||
| 		const BUTTON_CLICK_CALLBACK & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 获取按钮状态是启用还是禁用
 | 	// 获取按钮状态是启用还是禁用
 | ||||||
|  | @ -646,7 +651,7 @@ public: | ||||||
| 
 | 
 | ||||||
| 	// 设置回调函数
 | 	// 设置回调函数
 | ||||||
| 	void setCallback( | 	void setCallback( | ||||||
| 		const BUTTON_CLICK_CALLBACK & callback | 		const BtnClkCallback & callback | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置中心点的横向位置
 | 	// 设置中心点的横向位置
 | ||||||
|  | @ -668,24 +673,18 @@ public: | ||||||
| 		float pivotY | 		float pivotY | ||||||
| 	) override; | 	) override; | ||||||
| 
 | 
 | ||||||
|  | 	// 更新按钮状态
 | ||||||
|  | 	virtual void onUpdate(); | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 	enum STATUS { NORMAL, MOUSEOVER, SELECTED }; | 	enum STATUS { NORMAL, MOUSEOVER, SELECTED }; | ||||||
| 
 | 
 | ||||||
| 	// 初始化按钮
 |  | ||||||
| 	virtual void _init(); |  | ||||||
| 
 |  | ||||||
| 	// 设置按钮状态
 | 	// 设置按钮状态
 | ||||||
| 	virtual void _setStatus(STATUS status); | 	virtual void _setStatus(STATUS status); | ||||||
| 
 | 
 | ||||||
| 	// 对自身进行二维矩阵变换
 |  | ||||||
| 	virtual void _updateTransform() override; |  | ||||||
| 
 |  | ||||||
| 	// 刷新按钮显示
 | 	// 刷新按钮显示
 | ||||||
| 	virtual void _updateVisiable(); | 	virtual void _updateVisiable(); | ||||||
| 
 | 
 | ||||||
| 	// 刷新按钮状态
 |  | ||||||
| 	virtual void _updateStatus(); |  | ||||||
| 
 |  | ||||||
| 	// 执行按钮回调函数
 | 	// 执行按钮回调函数
 | ||||||
| 	virtual void _runCallback(); | 	virtual void _runCallback(); | ||||||
| 
 | 
 | ||||||
|  | @ -697,8 +696,7 @@ protected: | ||||||
| 	ENode * m_pDisabled; | 	ENode * m_pDisabled; | ||||||
| 	bool	m_bEnable; | 	bool	m_bEnable; | ||||||
| 	bool	m_bIsSelected; | 	bool	m_bIsSelected; | ||||||
| 	EListenerMouse * m_pListener; | 	BtnClkCallback m_Callback; | ||||||
| 	BUTTON_CLICK_CALLBACK m_Callback; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -713,7 +711,7 @@ public: | ||||||
| 	EButtonToggle( | 	EButtonToggle( | ||||||
| 		ENode * toggleOnNormal, | 		ENode * toggleOnNormal, | ||||||
| 		ENode * toggleOffNormal, | 		ENode * toggleOffNormal, | ||||||
| 		const BUTTON_CLICK_CALLBACK & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建开关按钮
 | 	// 创建开关按钮
 | ||||||
|  | @ -722,7 +720,7 @@ public: | ||||||
| 		ENode * toggleOffNormal, | 		ENode * toggleOffNormal, | ||||||
| 		ENode * toggleOnSelected, | 		ENode * toggleOnSelected, | ||||||
| 		ENode * toggleOffSelected, | 		ENode * toggleOffSelected, | ||||||
| 		const BUTTON_CLICK_CALLBACK & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建开关按钮
 | 	// 创建开关按钮
 | ||||||
|  | @ -733,7 +731,7 @@ public: | ||||||
| 		ENode * toggleOffMouseOver, | 		ENode * toggleOffMouseOver, | ||||||
| 		ENode * toggleOnSelected, | 		ENode * toggleOnSelected, | ||||||
| 		ENode * toggleOffSelected, | 		ENode * toggleOffSelected, | ||||||
| 		const BUTTON_CLICK_CALLBACK & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 创建开关按钮
 | 	// 创建开关按钮
 | ||||||
|  | @ -746,7 +744,7 @@ public: | ||||||
| 		ENode * toggleOffSelected, | 		ENode * toggleOffSelected, | ||||||
| 		ENode * toggleOnDisabled, | 		ENode * toggleOnDisabled, | ||||||
| 		ENode * toggleOffDisabled, | 		ENode * toggleOffDisabled, | ||||||
| 		const BUTTON_CLICK_CALLBACK & callback = nullptr | 		const BtnClkCallback & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 切换开关状态,并执行回调函数
 | 	// 切换开关状态,并执行回调函数
 | ||||||
|  |  | ||||||
							
								
								
									
										220
									
								
								core/etools.h
								
								
								
								
							
							
						
						
									
										220
									
								
								core/etools.h
								
								
								
								
							|  | @ -8,6 +8,47 @@ namespace e2d | ||||||
| class ETimerManager; | class ETimerManager; | ||||||
| class EAction; | class EAction; | ||||||
| 
 | 
 | ||||||
|  | // 随机数产生器
 | ||||||
|  | class ERandom | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	// 取得整型范围内的一个随机数
 | ||||||
|  | 	template<typename T> | ||||||
|  | 	static inline T range(T min, T max) { return e2d::ERandom::randomInt(min, max); } | ||||||
|  | 
 | ||||||
|  | 	// 取得浮点数范围内的一个随机数
 | ||||||
|  | 	static inline float range(float min, float max) { return e2d::ERandom::randomReal(min, max); } | ||||||
|  | 
 | ||||||
|  | 	// 取得浮点数范围内的一个随机数
 | ||||||
|  | 	static inline double range(double min, double max) { return e2d::ERandom::randomReal(min, max); } | ||||||
|  | 
 | ||||||
|  | 	// 取得浮点数范围内的一个随机数
 | ||||||
|  | 	static inline long double range(long double min, long double max) { return e2d::ERandom::randomReal(min, max); } | ||||||
|  | 
 | ||||||
|  | 	// 取得整型范围内的一个随机数
 | ||||||
|  | 	template<typename T> | ||||||
|  | 	static T randomInt( | ||||||
|  | 		T min, | ||||||
|  | 		T max) | ||||||
|  | 	{ | ||||||
|  | 		std::uniform_int_distribution<T> dist(min, max); | ||||||
|  | 		return dist(getEngine()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 取得浮点数类型范围内的一个随机数
 | ||||||
|  | 	template<typename T> | ||||||
|  | 	static T randomReal( | ||||||
|  | 		T min, | ||||||
|  | 		T max) | ||||||
|  | 	{ | ||||||
|  | 		std::uniform_real_distribution<T> dist(min, max); | ||||||
|  | 		return dist(getEngine()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 获取随机数产生器
 | ||||||
|  | 	static std::default_random_engine &getEngine(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| // 定时器
 | // 定时器
 | ||||||
| class ETimer : | class ETimer : | ||||||
|  | @ -19,17 +60,17 @@ public: | ||||||
| 	ETimer(); | 	ETimer(); | ||||||
| 
 | 
 | ||||||
| 	ETimer( | 	ETimer( | ||||||
| 		const TIMER_CALLBACK &callback,	/* 定时器回调函数 */ | 		const TimerCallback &callback,	/* 定时器回调函数 */ | ||||||
| 		int repeatTimes = -1,			/* 定时器执行次数 */ | 		int repeatTimes = -1,			/* 定时器执行次数 */ | ||||||
| 		LONGLONG interval = 0LL,		/* 时间间隔(毫秒) */ | 		float interval = 0LL,			/* 时间间隔(秒) */ | ||||||
| 		bool atOnce = false				/* 是否立即执行 */ | 		bool atOnce = false				/* 是否立即执行 */ | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	ETimer( | 	ETimer( | ||||||
| 		const EString &name,			/* 定时器名称 */ | 		const EString &name,			/* 定时器名称 */ | ||||||
| 		const TIMER_CALLBACK &callback,	/* 定时器回调函数 */ | 		const TimerCallback &callback,	/* 定时器回调函数 */ | ||||||
| 		int repeatTimes = -1,			/* 定时器执行次数 */ | 		int repeatTimes = -1,			/* 定时器执行次数 */ | ||||||
| 		LONGLONG interval = 0LL,		/* 时间间隔(毫秒) */ | 		float interval = 0,				/* 时间间隔(秒) */ | ||||||
| 		bool atOnce = false				/* 是否立即执行 */ | 		bool atOnce = false				/* 是否立即执行 */ | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | @ -53,14 +94,14 @@ public: | ||||||
| 		const EString &name | 		const EString &name | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置定时器执行间隔
 | 	// 设置定时器执行间隔(秒)
 | ||||||
| 	void setInterval( | 	void setInterval( | ||||||
| 		LONGLONG interval | 		float interval | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置定时器回调函数
 | 	// 设置定时器回调函数
 | ||||||
| 	void setCallback( | 	void setCallback( | ||||||
| 		const TIMER_CALLBACK & callback | 		const TimerCallback & callback | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置定时器重复执行次数
 | 	// 设置定时器重复执行次数
 | ||||||
|  | @ -96,14 +137,60 @@ protected: | ||||||
| 	bool			m_bAtOnce; | 	bool			m_bAtOnce; | ||||||
| 	int				m_nRunTimes; | 	int				m_nRunTimes; | ||||||
| 	int				m_nRepeatTimes; | 	int				m_nRepeatTimes; | ||||||
|  | 	float			m_fInterval; | ||||||
|  | 	float			m_fLast; | ||||||
| 	ENode *			m_pParentNode; | 	ENode *			m_pParentNode; | ||||||
| 	TIMER_CALLBACK	m_Callback; | 	TimerCallback	m_Callback; | ||||||
| 	LARGE_INTEGER	m_nInterval; |  | ||||||
| 	LARGE_INTEGER	m_tLast; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class EFileUtils | // 数据管理工具
 | ||||||
|  | class EData | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	// 保存 int 类型的值
 | ||||||
|  | 	static void saveInt( | ||||||
|  | 		const EString & key, | ||||||
|  | 		int value | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 保存 float 类型的值
 | ||||||
|  | 	static void saveFloat( | ||||||
|  | 		const EString & key, | ||||||
|  | 		float value | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 保存 字符串 类型的值
 | ||||||
|  | 	static void saveString( | ||||||
|  | 		const EString & key, | ||||||
|  | 		const EString & value | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 获取 int 类型的值
 | ||||||
|  | 	// (若不存在则返回 defaultValue 参数的值)
 | ||||||
|  | 	static int getInt( | ||||||
|  | 		const EString & key, | ||||||
|  | 		int defaultValue | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 获取 float 类型的值
 | ||||||
|  | 	// (若不存在则返回 defaultValue 参数的值)
 | ||||||
|  | 	static float getFloat( | ||||||
|  | 		const EString & key, | ||||||
|  | 		float defaultValue | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 获取 字符串 类型的值
 | ||||||
|  | 	// (若不存在则返回 defaultValue 参数的值)
 | ||||||
|  | 	static EString getString( | ||||||
|  | 		const EString & key, | ||||||
|  | 		const EString & defaultValue | ||||||
|  | 	); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // 文件管理工具
 | ||||||
|  | class EFile | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	// 获取系统的 AppData Local 路径
 | 	// 获取系统的 AppData Local 路径
 | ||||||
|  | @ -115,110 +202,31 @@ public: | ||||||
| 	// 获取默认的保存路径
 | 	// 获取默认的保存路径
 | ||||||
| 	static EString getDefaultSavePath(); | 	static EString getDefaultSavePath(); | ||||||
| 
 | 
 | ||||||
| 	// 保存 int 型的值
 | 	// 获取文件扩展名
 | ||||||
| 	static void saveInt( |  | ||||||
| 		const EString & key, |  | ||||||
| 		int value |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 保存 float 型的值
 |  | ||||||
| 	static void saveFloat( |  | ||||||
| 		const EString & key, |  | ||||||
| 		float value |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 保存 字符串 型的值(不要在 Unicode 字符集下保存中文字符)
 |  | ||||||
| 	static void saveString( |  | ||||||
| 		const EString & key, |  | ||||||
| 		const EString & value |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 获取 int 型的值(若不存在则返回 default 参数的值)
 |  | ||||||
| 	static int getInt( |  | ||||||
| 		const EString & key, |  | ||||||
| 		int default |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 获取 float 型的值(若不存在则返回 default 参数的值)
 |  | ||||||
| 	static float getFloat( |  | ||||||
| 		const EString & key, |  | ||||||
| 		float default |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 获取 字符串 型的值(若不存在则返回 default 参数的值)
 |  | ||||||
| 	static EString getString( |  | ||||||
| 		const EString & key, |  | ||||||
| 		const EString & default |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 得到文件扩展名(小写)
 |  | ||||||
| 	static EString getFileExtension( | 	static EString getFileExtension( | ||||||
| 		const EString & filePath | 		const EString & filePath | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	/**
 | 	// 打开保存文件对话框
 | ||||||
| 	*  打开保存文件对话框,得到有效保存路径返回 true |  | ||||||
| 	*  参数:窗口标题,默认扩展名 |  | ||||||
| 	*/ |  | ||||||
| 	static EString getSaveFilePath( | 	static EString getSaveFilePath( | ||||||
| 		const EString & title = L"保存到", | 		const EString & title = L"保存到",	/* 对话框标题 */ | ||||||
| 		const EString & defExt = L"" | 		const EString & defExt = L""		/* 默认扩展名 */ | ||||||
| 	); | 	); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ERandom | // 音乐管理工具
 | ||||||
| { | class EMusic | ||||||
| public: |  | ||||||
| 	// 取得整型范围内的一个随机数
 |  | ||||||
| 	template<typename T> |  | ||||||
| 	static inline T between(T min, T max) { return e2d::ERandom::randomInt(min, max); } |  | ||||||
| 
 |  | ||||||
| 	// 取得浮点数范围内的一个随机数
 |  | ||||||
| 	static inline float between(float min, float max) { return e2d::ERandom::randomReal(min, max); } |  | ||||||
| 
 |  | ||||||
| 	// 取得浮点数范围内的一个随机数
 |  | ||||||
| 	static inline double between(double min, double max) { return e2d::ERandom::randomReal(min, max); } |  | ||||||
| 
 |  | ||||||
| 	// 取得浮点数范围内的一个随机数
 |  | ||||||
| 	static inline long double between(long double min, long double max) { return e2d::ERandom::randomReal(min, max); } |  | ||||||
| 
 |  | ||||||
| 	// 取得整型范围内的一个随机数
 |  | ||||||
| 	template<typename T> |  | ||||||
| 	static T randomInt( |  | ||||||
| 		T min,  |  | ||||||
| 		T max) |  | ||||||
| 	{ |  | ||||||
| 		std::uniform_int_distribution<T> dist(min, max); |  | ||||||
| 		return dist(getEngine()); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// 取得浮点数类型范围内的一个随机数
 |  | ||||||
| 	template<typename T> |  | ||||||
| 	static T randomReal( |  | ||||||
| 		T min,  |  | ||||||
| 		T max) |  | ||||||
| 	{ |  | ||||||
| 		std::uniform_real_distribution<T> dist(min, max); |  | ||||||
| 		return dist(getEngine()); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// 获取随机数产生器
 |  | ||||||
| 	static std::default_random_engine &getEngine(); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class EMusicUtils |  | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	// 播放音乐
 | 	// 播放音乐
 | ||||||
| 	static UINT playMusic( | 	static UINT play( | ||||||
| 		const EString & musicFilePath,		/* 音乐文件路径 */ | 		const EString & musicFilePath,		/* 音乐文件路径 */ | ||||||
| 		int repeatTimes = 1 | 		int repeatTimes = 1 | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 播放音乐
 | 	// 播放音乐
 | ||||||
| 	static UINT playMusic( | 	static UINT play( | ||||||
| 		const EString & musicResourceName,	/* 资源名称 */ | 		const EString & musicResourceName,	/* 资源名称 */ | ||||||
| 		const EString & musicResourceType,	/* 资源类别 */ | 		const EString & musicResourceType,	/* 资源类别 */ | ||||||
| 		const EString & musicExtension,		/* 指定资源的扩展名 */ | 		const EString & musicExtension,		/* 指定资源的扩展名 */ | ||||||
|  | @ -226,42 +234,42 @@ public: | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 暂停音乐
 | 	// 暂停音乐
 | ||||||
| 	static bool pauseMusic( | 	static bool pause( | ||||||
| 		UINT musicId | 		UINT musicId | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 暂停音乐
 | 	// 暂停音乐
 | ||||||
| 	static bool pauseMusic( | 	static bool pause( | ||||||
| 		const EString& musicName | 		const EString& musicName | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 继续播放音乐
 | 	// 继续播放音乐
 | ||||||
| 	static bool resumeMusic( | 	static bool resume( | ||||||
| 		UINT musicId | 		UINT musicId | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 继续播放音乐
 | 	// 继续播放音乐
 | ||||||
| 	static bool resumeMusic( | 	static bool resume( | ||||||
| 		const EString& musicName | 		const EString& musicName | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 停止音乐
 | 	// 停止音乐
 | ||||||
| 	static bool stopMusic( | 	static bool stop( | ||||||
| 		UINT musicId | 		UINT musicId | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 停止音乐
 | 	// 停止音乐
 | ||||||
| 	static bool stopMusic( | 	static bool stop( | ||||||
| 		const EString& musicName | 		const EString& musicName | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 预加载音乐
 | 	// 预加载音乐
 | ||||||
| 	static UINT preloadMusic( | 	static UINT preload( | ||||||
| 		const EString & musicFilePath | 		const EString & musicFilePath | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 预加载音乐
 | 	// 预加载音乐
 | ||||||
| 	static UINT preloadMusic( | 	static UINT preload( | ||||||
| 		const EString & musicResourceName,	/* 资源名称 */ | 		const EString & musicResourceName,	/* 资源名称 */ | ||||||
| 		const EString & musicResourceType,	/* 资源类别 */ | 		const EString & musicResourceType,	/* 资源类别 */ | ||||||
| 		const EString & musicExtension		/* 指定资源的扩展名 */ | 		const EString & musicExtension		/* 指定资源的扩展名 */ | ||||||
|  |  | ||||||
|  | @ -1,13 +1,16 @@ | ||||||
| #pragma once | #pragma once | ||||||
| #include "ebase.h" | #include "ecommon.h" | ||||||
| 
 | 
 | ||||||
| namespace e2d | namespace e2d | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | class ESceneManager; | ||||||
|  | 
 | ||||||
| class ETransition : | class ETransition : | ||||||
| 	public EObject | 	public EObject | ||||||
| { | { | ||||||
| 	friend EApp; | 	friend ESceneManager; | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
| 	ETransition(float duration); | 	ETransition(float duration); | ||||||
|  | @ -16,17 +19,21 @@ public: | ||||||
| 	bool isEnding(); | 	bool isEnding(); | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	// 更新动画
 | 	// 更新场景动画
 | ||||||
| 	virtual void _update() = 0; | 	virtual void _update() = 0; | ||||||
| 
 | 
 | ||||||
|  | 	// 初始化场景动画
 | ||||||
| 	virtual void _init() = 0; | 	virtual void _init() = 0; | ||||||
| 
 | 
 | ||||||
|  | 	// 重置场景动画
 | ||||||
| 	virtual void _reset() = 0; | 	virtual void _reset() = 0; | ||||||
| 
 | 
 | ||||||
| 	virtual bool _isDelayEnough(); | 	// 停止场景动画
 | ||||||
| 
 |  | ||||||
| 	virtual void _stop(); | 	virtual void _stop(); | ||||||
| 
 | 
 | ||||||
|  | 	// 计算场景动画进度
 | ||||||
|  | 	void _calcRateOfProgress(); | ||||||
|  | 
 | ||||||
| 	// 保存当前场景和下一场景的指针
 | 	// 保存当前场景和下一场景的指针
 | ||||||
| 	void _setTarget( | 	void _setTarget( | ||||||
| 		EScene * prev, | 		EScene * prev, | ||||||
|  | @ -35,13 +42,11 @@ protected: | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	bool m_bEnd; | 	bool m_bEnd; | ||||||
| 	float m_fTotalDuration; | 	float m_fLast; | ||||||
| 	float m_fDuration; | 	float m_fDuration; | ||||||
| 	float m_fRateOfProgress; | 	float m_fRateOfProgress; | ||||||
| 	EScene * m_pPrevScene; | 	EScene * m_pPrevScene; | ||||||
| 	EScene * m_pNextScene; | 	EScene * m_pNextScene; | ||||||
| 	LARGE_INTEGER m_tLast; |  | ||||||
| 	LARGE_INTEGER m_nAnimationInterval; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -117,7 +122,7 @@ protected: | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	MOVE_DIRECT m_Direct; | 	MOVE_DIRECT m_Direct; | ||||||
| 	EVec m_Vec; | 	EVector2 m_Vec; | ||||||
| 	EPoint m_NextPos; | 	EPoint m_NextPos; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -94,72 +94,63 @@ | ||||||
|     <ClInclude Include="..\..\core\enodes.h" /> |     <ClInclude Include="..\..\core\enodes.h" /> | ||||||
|     <ClInclude Include="..\..\core\etools.h" /> |     <ClInclude Include="..\..\core\etools.h" /> | ||||||
|     <ClInclude Include="..\..\core\etransitions.h" /> |     <ClInclude Include="..\..\core\etransitions.h" /> | ||||||
|     <ClInclude Include="..\..\core\Win\MciPlayer.h" /> |  | ||||||
|     <ClInclude Include="..\..\core\Win\winbase.h" /> |  | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClCompile Include="..\..\core\Action\EAction.cpp" /> |     <ClCompile Include="..\..\core\Action\Action.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionCallback.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionCallback.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionDelay.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionDelay.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionGradual.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionGradual.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionLoop.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionLoop.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionMoveBy.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionMoveBy.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionMoveTo.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionMoveTo.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionOpacityBy.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionOpacityBy.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionOpacityTo.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionOpacityTo.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionRotateBy.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionRotateBy.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionRotateTo.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionRotateTo.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionScaleBy.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionScaleBy.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionScaleTo.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionScaleTo.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionSequence.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionSequence.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionTwo.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionTwo.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionTwoAtSameTime.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionTwoAtSameTime.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\EAnimation.cpp" /> |     <ClCompile Include="..\..\core\Action\Animation.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\EApp.cpp" /> |     <ClCompile Include="..\..\core\Base\Game.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\EScene.cpp" /> |     <ClCompile Include="..\..\core\Base\Input.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\EFont.cpp" /> |     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\EObject.cpp" /> |     <ClCompile Include="..\..\core\Base\Time.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\ESpriteFrame.cpp" /> |     <ClCompile Include="..\..\core\Base\Window.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\EString.cpp" /> |     <ClCompile Include="..\..\core\Common\Font.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\ETexture.cpp" /> |     <ClCompile Include="..\..\core\Common\Image.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Geometry\ECircle.cpp" /> |     <ClCompile Include="..\..\core\Common\Keyframe.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Geometry\EEllipse.cpp" /> |     <ClCompile Include="..\..\core\Common\Object.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Geometry\EGeometry.cpp" /> |     <ClCompile Include="..\..\core\Common\Scene.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Geometry\ERectangle.cpp" /> |     <ClCompile Include="..\..\core\Common\String.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListener.cpp" /> |     <ClCompile Include="..\..\core\Event\PhysicsEvent.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerKeyboard.cpp" /> |     <ClCompile Include="..\..\core\Geometry\Circle.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerKeyboardPress.cpp" /> |     <ClCompile Include="..\..\core\Geometry\Ellipse.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerMouse.cpp" /> |     <ClCompile Include="..\..\core\Geometry\Geometry.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerMouseClick.cpp" /> |     <ClCompile Include="..\..\core\Geometry\Rectangle.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerMouseDoubleClick.cpp" /> |     <ClCompile Include="..\..\core\Listener\Listener.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerMouseDrag.cpp" /> |     <ClCompile Include="..\..\core\Listener\ListenerPhysics.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerMousePress.cpp" /> |     <ClCompile Include="..\..\core\Listener\ListenerPhysicsCollision.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerPhysics.cpp" /> |     <ClCompile Include="..\..\core\Manager\ActionManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerPhysicsCollision.cpp" /> |     <ClCompile Include="..\..\core\Manager\ObjectManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\EActionManager.cpp" /> |     <ClCompile Include="..\..\core\Manager\PhysicsManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\EMsgManager.cpp" /> |     <ClCompile Include="..\..\core\Manager\SceneManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\EObjectManager.cpp" /> |     <ClCompile Include="..\..\core\Manager\TimerManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\EPhysicsManager.cpp" /> |     <ClCompile Include="..\..\core\Node\Button.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\ETimerManager.cpp" /> |     <ClCompile Include="..\..\core\Node\ButtonToggle.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Msg\EKeyboardMsg.cpp" /> |     <ClCompile Include="..\..\core\Node\Menu.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Msg\EMouseMsg.cpp" /> |     <ClCompile Include="..\..\core\Node\Node.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Msg\EPhysicsMsg.cpp" /> |     <ClCompile Include="..\..\core\Node\Sprite.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\EButton.cpp" /> |     <ClCompile Include="..\..\core\Node\Text.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\EButtonToggle.cpp" /> |     <ClCompile Include="..\..\core\Tool\Data.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\EMenu.cpp" /> |     <ClCompile Include="..\..\core\Tool\Music.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\ENode.cpp" /> |     <ClCompile Include="..\..\core\Tool\Random.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\ESprite.cpp" /> |     <ClCompile Include="..\..\core\Tool\Timer.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\EText.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Tool\EFileUtils.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Tool\EMusicUtils.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Tool\ERandom.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Tool\ETimer.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Transition\ETransition.cpp" /> |     <ClCompile Include="..\..\core\Transition\ETransition.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Transition\ETransitionEmerge.cpp" /> |     <ClCompile Include="..\..\core\Transition\ETransitionEmerge.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Transition\ETransitionFade.cpp" /> |     <ClCompile Include="..\..\core\Transition\ETransitionFade.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Transition\ETransitionMove.cpp" /> |     <ClCompile Include="..\..\core\Transition\ETransitionMove.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Win\MciPlayer.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Win\winbase.cpp" /> |  | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||||
|   <ImportGroup Label="ExtensionTargets"> |   <ImportGroup Label="ExtensionTargets"> | ||||||
|  |  | ||||||
|  | @ -1,275 +1,215 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <Filter Include="源文件"> |     <Filter Include="Action"> | ||||||
|       <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> |  | ||||||
|       <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> |  | ||||||
|     </Filter> |  | ||||||
|     <Filter Include="头文件"> |  | ||||||
|       <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> |  | ||||||
|       <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> |  | ||||||
|     </Filter> |  | ||||||
|     <Filter Include="源文件\Base"> |  | ||||||
|       <UniqueIdentifier>{d4a509dd-1bc0-4456-9554-d414de91b50c}</UniqueIdentifier> |  | ||||||
|     </Filter> |  | ||||||
|     <Filter Include="源文件\Msg"> |  | ||||||
|       <UniqueIdentifier>{3ff66c81-6040-4f84-a39a-d21b4bb54819}</UniqueIdentifier> |  | ||||||
|     </Filter> |  | ||||||
|     <Filter Include="源文件\Action"> |  | ||||||
|       <UniqueIdentifier>{5be538cb-a432-4f84-9678-bbf408eca288}</UniqueIdentifier> |       <UniqueIdentifier>{5be538cb-a432-4f84-9678-bbf408eca288}</UniqueIdentifier> | ||||||
|     </Filter> |     </Filter> | ||||||
|     <Filter Include="源文件\Transition"> |     <Filter Include="Base"> | ||||||
|       <UniqueIdentifier>{6c760a81-9bc8-4fb0-a145-8e119b783365}</UniqueIdentifier> |       <UniqueIdentifier>{d4a509dd-1bc0-4456-9554-d414de91b50c}</UniqueIdentifier> | ||||||
|     </Filter> |     </Filter> | ||||||
|     <Filter Include="源文件\Manager"> |     <Filter Include="Common"> | ||||||
|       <UniqueIdentifier>{7b102f67-5905-4c0e-8400-51c128da026a}</UniqueIdentifier> |  | ||||||
|     </Filter> |  | ||||||
|     <Filter Include="源文件\Node"> |  | ||||||
|       <UniqueIdentifier>{c536c42c-283d-4a10-b19b-0699b4f1e051}</UniqueIdentifier> |  | ||||||
|     </Filter> |  | ||||||
|     <Filter Include="源文件\Tool"> |  | ||||||
|       <UniqueIdentifier>{17bdc67b-1801-4b69-b79b-ffcbbee8dae0}</UniqueIdentifier> |  | ||||||
|     </Filter> |  | ||||||
|     <Filter Include="源文件\Win"> |  | ||||||
|       <UniqueIdentifier>{7454d212-5d2e-4b0b-865c-30fb02d2878c}</UniqueIdentifier> |  | ||||||
|     </Filter> |  | ||||||
|     <Filter Include="源文件\Listener"> |  | ||||||
|       <UniqueIdentifier>{c5f168c6-1403-486a-9cae-ab29495a723c}</UniqueIdentifier> |  | ||||||
|     </Filter> |  | ||||||
|     <Filter Include="源文件\Common"> |  | ||||||
|       <UniqueIdentifier>{c907d829-e510-472c-bd47-cf4eab6f9266}</UniqueIdentifier> |       <UniqueIdentifier>{c907d829-e510-472c-bd47-cf4eab6f9266}</UniqueIdentifier> | ||||||
|     </Filter> |     </Filter> | ||||||
|     <Filter Include="源文件\Geometry"> |     <Filter Include="Event"> | ||||||
|  |       <UniqueIdentifier>{62d6a1d4-f1ec-458a-aee0-377b16012bed}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Geometry"> | ||||||
|       <UniqueIdentifier>{508b39c8-a430-45c3-9405-364fbc281220}</UniqueIdentifier> |       <UniqueIdentifier>{508b39c8-a430-45c3-9405-364fbc281220}</UniqueIdentifier> | ||||||
|     </Filter> |     </Filter> | ||||||
|  |     <Filter Include="Listener"> | ||||||
|  |       <UniqueIdentifier>{c5f168c6-1403-486a-9cae-ab29495a723c}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Manager"> | ||||||
|  |       <UniqueIdentifier>{7b102f67-5905-4c0e-8400-51c128da026a}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Node"> | ||||||
|  |       <UniqueIdentifier>{c536c42c-283d-4a10-b19b-0699b4f1e051}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Tool"> | ||||||
|  |       <UniqueIdentifier>{17bdc67b-1801-4b69-b79b-ffcbbee8dae0}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Transition"> | ||||||
|  |       <UniqueIdentifier>{6c760a81-9bc8-4fb0-a145-8e119b783365}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="..\..\core\eactions.h"> |     <ClInclude Include="..\..\core\eactions.h" /> | ||||||
|       <Filter>头文件</Filter> |     <ClInclude Include="..\..\core\etransitions.h" /> | ||||||
|     </ClInclude> |     <ClInclude Include="..\..\core\easy2d.h" /> | ||||||
|     <ClInclude Include="..\..\core\easy2d.h"> |     <ClInclude Include="..\..\core\ebase.h" /> | ||||||
|       <Filter>头文件</Filter> |     <ClInclude Include="..\..\core\ecommon.h" /> | ||||||
|     </ClInclude> |     <ClInclude Include="..\..\core\egeometry.h" /> | ||||||
|     <ClInclude Include="..\..\core\ebase.h"> |     <ClInclude Include="..\..\core\elisteners.h" /> | ||||||
|       <Filter>头文件</Filter> |     <ClInclude Include="..\..\core\emacros.h" /> | ||||||
|     </ClInclude> |     <ClInclude Include="..\..\core\emanagers.h" /> | ||||||
|     <ClInclude Include="..\..\core\ecommon.h"> |     <ClInclude Include="..\..\core\enodes.h" /> | ||||||
|       <Filter>头文件</Filter> |     <ClInclude Include="..\..\core\etools.h" /> | ||||||
|     </ClInclude> |  | ||||||
|     <ClInclude Include="..\..\core\egeometry.h"> |  | ||||||
|       <Filter>头文件</Filter> |  | ||||||
|     </ClInclude> |  | ||||||
|     <ClInclude Include="..\..\core\elisteners.h"> |  | ||||||
|       <Filter>头文件</Filter> |  | ||||||
|     </ClInclude> |  | ||||||
|     <ClInclude Include="..\..\core\emacros.h"> |  | ||||||
|       <Filter>头文件</Filter> |  | ||||||
|     </ClInclude> |  | ||||||
|     <ClInclude Include="..\..\core\emanagers.h"> |  | ||||||
|       <Filter>头文件</Filter> |  | ||||||
|     </ClInclude> |  | ||||||
|     <ClInclude Include="..\..\core\enodes.h"> |  | ||||||
|       <Filter>头文件</Filter> |  | ||||||
|     </ClInclude> |  | ||||||
|     <ClInclude Include="..\..\core\etools.h"> |  | ||||||
|       <Filter>头文件</Filter> |  | ||||||
|     </ClInclude> |  | ||||||
|     <ClInclude Include="..\..\core\etransitions.h"> |  | ||||||
|       <Filter>头文件</Filter> |  | ||||||
|     </ClInclude> |  | ||||||
|     <ClInclude Include="..\..\core\Win\MciPlayer.h"> |  | ||||||
|       <Filter>源文件\Win</Filter> |  | ||||||
|     </ClInclude> |  | ||||||
|     <ClInclude Include="..\..\core\Win\winbase.h"> |  | ||||||
|       <Filter>源文件\Win</Filter> |  | ||||||
|     </ClInclude> |  | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClCompile Include="..\..\core\Base\EApp.cpp"> |     <ClCompile Include="..\..\core\Action\Action.cpp"> | ||||||
|       <Filter>源文件\Base</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Base\EScene.cpp"> |     <ClCompile Include="..\..\core\Action\ActionCallback.cpp"> | ||||||
|       <Filter>源文件\Base</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Msg\EKeyboardMsg.cpp"> |     <ClCompile Include="..\..\core\Action\ActionDelay.cpp"> | ||||||
|       <Filter>源文件\Msg</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Msg\EMouseMsg.cpp"> |     <ClCompile Include="..\..\core\Action\ActionGradual.cpp"> | ||||||
|       <Filter>源文件\Msg</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Msg\EPhysicsMsg.cpp"> |     <ClCompile Include="..\..\core\Action\ActionLoop.cpp"> | ||||||
|       <Filter>源文件\Msg</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EAction.cpp"> |     <ClCompile Include="..\..\core\Action\ActionMoveBy.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionCallback.cpp"> |     <ClCompile Include="..\..\core\Action\ActionMoveTo.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionDelay.cpp"> |     <ClCompile Include="..\..\core\Action\ActionOpacityBy.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionGradual.cpp"> |     <ClCompile Include="..\..\core\Action\ActionOpacityTo.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionLoop.cpp"> |     <ClCompile Include="..\..\core\Action\ActionRotateBy.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionMoveBy.cpp"> |     <ClCompile Include="..\..\core\Action\ActionRotateTo.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionMoveTo.cpp"> |     <ClCompile Include="..\..\core\Action\ActionScaleBy.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionOpacityBy.cpp"> |     <ClCompile Include="..\..\core\Action\ActionScaleTo.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionOpacityTo.cpp"> |     <ClCompile Include="..\..\core\Action\ActionSequence.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionRotateBy.cpp"> |     <ClCompile Include="..\..\core\Action\ActionTwo.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionRotateTo.cpp"> |     <ClCompile Include="..\..\core\Action\ActionTwoAtSameTime.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionScaleBy.cpp"> |     <ClCompile Include="..\..\core\Action\Animation.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionScaleTo.cpp"> |     <ClCompile Include="..\..\core\Base\Game.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Base</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionSequence.cpp"> |     <ClCompile Include="..\..\core\Base\Input.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Base</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionTwo.cpp"> |     <ClCompile Include="..\..\core\Base\Renderer.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Base</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EActionTwoAtSameTime.cpp"> |     <ClCompile Include="..\..\core\Base\Time.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Base</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Action\EAnimation.cpp"> |     <ClCompile Include="..\..\core\Base\Window.cpp"> | ||||||
|       <Filter>源文件\Action</Filter> |       <Filter>Base</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Manager\EActionManager.cpp"> |     <ClCompile Include="..\..\core\Common\Font.cpp"> | ||||||
|       <Filter>源文件\Manager</Filter> |       <Filter>Common</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Manager\EMsgManager.cpp"> |     <ClCompile Include="..\..\core\Common\Image.cpp"> | ||||||
|       <Filter>源文件\Manager</Filter> |       <Filter>Common</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Manager\EObjectManager.cpp"> |     <ClCompile Include="..\..\core\Common\Keyframe.cpp"> | ||||||
|       <Filter>源文件\Manager</Filter> |       <Filter>Common</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Manager\EPhysicsManager.cpp"> |     <ClCompile Include="..\..\core\Common\Object.cpp"> | ||||||
|       <Filter>源文件\Manager</Filter> |       <Filter>Common</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Manager\ETimerManager.cpp"> |     <ClCompile Include="..\..\core\Common\Scene.cpp"> | ||||||
|       <Filter>源文件\Manager</Filter> |       <Filter>Common</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListener.cpp"> |     <ClCompile Include="..\..\core\Common\String.cpp"> | ||||||
|       <Filter>源文件\Listener</Filter> |       <Filter>Common</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerKeyboard.cpp"> |     <ClCompile Include="..\..\core\Geometry\Circle.cpp"> | ||||||
|       <Filter>源文件\Listener</Filter> |       <Filter>Geometry</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerKeyboardPress.cpp"> |     <ClCompile Include="..\..\core\Geometry\Ellipse.cpp"> | ||||||
|       <Filter>源文件\Listener</Filter> |       <Filter>Geometry</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerMouse.cpp"> |     <ClCompile Include="..\..\core\Geometry\Geometry.cpp"> | ||||||
|       <Filter>源文件\Listener</Filter> |       <Filter>Geometry</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerMouseClick.cpp"> |     <ClCompile Include="..\..\core\Geometry\Rectangle.cpp"> | ||||||
|       <Filter>源文件\Listener</Filter> |       <Filter>Geometry</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerMouseDoubleClick.cpp"> |     <ClCompile Include="..\..\core\Event\PhysicsEvent.cpp"> | ||||||
|       <Filter>源文件\Listener</Filter> |       <Filter>Event</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerMouseDrag.cpp"> |     <ClCompile Include="..\..\core\Listener\Listener.cpp"> | ||||||
|       <Filter>源文件\Listener</Filter> |       <Filter>Listener</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerMousePress.cpp"> |     <ClCompile Include="..\..\core\Listener\ListenerPhysics.cpp"> | ||||||
|       <Filter>源文件\Listener</Filter> |       <Filter>Listener</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerPhysics.cpp"> |     <ClCompile Include="..\..\core\Listener\ListenerPhysicsCollision.cpp"> | ||||||
|       <Filter>源文件\Listener</Filter> |       <Filter>Listener</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Listener\EListenerPhysicsCollision.cpp"> |     <ClCompile Include="..\..\core\Manager\ActionManager.cpp"> | ||||||
|       <Filter>源文件\Listener</Filter> |       <Filter>Manager</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Common\EFont.cpp"> |     <ClCompile Include="..\..\core\Manager\ObjectManager.cpp"> | ||||||
|       <Filter>源文件\Common</Filter> |       <Filter>Manager</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Common\EObject.cpp"> |     <ClCompile Include="..\..\core\Manager\PhysicsManager.cpp"> | ||||||
|       <Filter>源文件\Common</Filter> |       <Filter>Manager</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Common\ESpriteFrame.cpp"> |     <ClCompile Include="..\..\core\Manager\SceneManager.cpp"> | ||||||
|       <Filter>源文件\Common</Filter> |       <Filter>Manager</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Common\EString.cpp"> |     <ClCompile Include="..\..\core\Manager\TimerManager.cpp"> | ||||||
|       <Filter>源文件\Common</Filter> |       <Filter>Manager</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Common\ETexture.cpp"> |     <ClCompile Include="..\..\core\Node\Button.cpp"> | ||||||
|       <Filter>源文件\Common</Filter> |       <Filter>Node</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Geometry\ECircle.cpp"> |     <ClCompile Include="..\..\core\Node\ButtonToggle.cpp"> | ||||||
|       <Filter>源文件\Geometry</Filter> |       <Filter>Node</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Geometry\EEllipse.cpp"> |     <ClCompile Include="..\..\core\Node\Menu.cpp"> | ||||||
|       <Filter>源文件\Geometry</Filter> |       <Filter>Node</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Geometry\EGeometry.cpp"> |     <ClCompile Include="..\..\core\Node\Node.cpp"> | ||||||
|       <Filter>源文件\Geometry</Filter> |       <Filter>Node</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Geometry\ERectangle.cpp"> |     <ClCompile Include="..\..\core\Node\Sprite.cpp"> | ||||||
|       <Filter>源文件\Geometry</Filter> |       <Filter>Node</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Win\MciPlayer.cpp"> |     <ClCompile Include="..\..\core\Node\Text.cpp"> | ||||||
|       <Filter>源文件\Win</Filter> |       <Filter>Node</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Win\winbase.cpp"> |     <ClCompile Include="..\..\core\Tool\Data.cpp"> | ||||||
|       <Filter>源文件\Win</Filter> |       <Filter>Tool</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Tool\EFileUtils.cpp"> |     <ClCompile Include="..\..\core\Tool\Music.cpp"> | ||||||
|       <Filter>源文件\Tool</Filter> |       <Filter>Tool</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Tool\EMusicUtils.cpp"> |     <ClCompile Include="..\..\core\Tool\Random.cpp"> | ||||||
|       <Filter>源文件\Tool</Filter> |       <Filter>Tool</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Tool\ERandom.cpp"> |     <ClCompile Include="..\..\core\Tool\Timer.cpp"> | ||||||
|       <Filter>源文件\Tool</Filter> |       <Filter>Tool</Filter> | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Tool\ETimer.cpp"> |  | ||||||
|       <Filter>源文件\Tool</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Node\EButton.cpp"> |  | ||||||
|       <Filter>源文件\Node</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Node\EButtonToggle.cpp"> |  | ||||||
|       <Filter>源文件\Node</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Node\EMenu.cpp"> |  | ||||||
|       <Filter>源文件\Node</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Node\ENode.cpp"> |  | ||||||
|       <Filter>源文件\Node</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Node\ESprite.cpp"> |  | ||||||
|       <Filter>源文件\Node</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Node\EText.cpp"> |  | ||||||
|       <Filter>源文件\Node</Filter> |  | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Transition\ETransition.cpp"> |     <ClCompile Include="..\..\core\Transition\ETransition.cpp"> | ||||||
|       <Filter>源文件\Transition</Filter> |       <Filter>Transition</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Transition\ETransitionEmerge.cpp"> |     <ClCompile Include="..\..\core\Transition\ETransitionEmerge.cpp"> | ||||||
|       <Filter>源文件\Transition</Filter> |       <Filter>Transition</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Transition\ETransitionFade.cpp"> |     <ClCompile Include="..\..\core\Transition\ETransitionFade.cpp"> | ||||||
|       <Filter>源文件\Transition</Filter> |       <Filter>Transition</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Transition\ETransitionMove.cpp"> |     <ClCompile Include="..\..\core\Transition\ETransitionMove.cpp"> | ||||||
|       <Filter>源文件\Transition</Filter> |       <Filter>Transition</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
| </Project> | </Project> | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  |  | ||||||
|  | Microsoft Visual Studio Solution File, Format Version 12.00 | ||||||
|  | # Visual Studio 2012 | ||||||
|  | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Easy2D", "Easy2D.vcxproj", "{722EA245-ADD5-4296-8C85-8FF42C0335D3}" | ||||||
|  | EndProject | ||||||
|  | Global | ||||||
|  | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
|  | 		Debug|Win32 = Debug|Win32 | ||||||
|  | 		Release|Win32 = Release|Win32 | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||||
|  | 		{722EA245-ADD5-4296-8C85-8FF42C0335D3}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||||
|  | 		{722EA245-ADD5-4296-8C85-8FF42C0335D3}.Debug|Win32.Build.0 = Debug|Win32 | ||||||
|  | 		{722EA245-ADD5-4296-8C85-8FF42C0335D3}.Release|Win32.ActiveCfg = Release|Win32 | ||||||
|  | 		{722EA245-ADD5-4296-8C85-8FF42C0335D3}.Release|Win32.Build.0 = Release|Win32 | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(SolutionProperties) = preSolution | ||||||
|  | 		HideSolutionNode = FALSE | ||||||
|  | 	EndGlobalSection | ||||||
|  | EndGlobal | ||||||
|  | @ -0,0 +1,160 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|  |   <ItemGroup Label="ProjectConfigurations"> | ||||||
|  |     <ProjectConfiguration Include="Debug|Win32"> | ||||||
|  |       <Configuration>Debug</Configuration> | ||||||
|  |       <Platform>Win32</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |     <ProjectConfiguration Include="Release|Win32"> | ||||||
|  |       <Configuration>Release</Configuration> | ||||||
|  |       <Platform>Win32</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ClInclude Include="..\..\core\eactions.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\easy2d.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\ebase.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\ecommon.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\egeometry.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\elisteners.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\emacros.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\emanagers.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\enodes.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\etools.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\etransitions.h" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ClCompile Include="..\..\core\Action\Action.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionCallback.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionDelay.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionGradual.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionLoop.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionMoveBy.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionMoveTo.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionOpacityBy.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionOpacityTo.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionRotateBy.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionRotateTo.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionScaleBy.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionScaleTo.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionSequence.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionTwo.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionTwoAtSameTime.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\Animation.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Game.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Input.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Time.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Window.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Font.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Image.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Keyframe.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Object.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Scene.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\String.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Event\PhysicsEvent.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Circle.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Ellipse.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Geometry.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Rectangle.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\Listener.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\ListenerPhysics.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\ListenerPhysicsCollision.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\ActionManager.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\ObjectManager.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\PhysicsManager.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\SceneManager.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\TimerManager.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Button.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\ButtonToggle.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Menu.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Node.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Sprite.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Text.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Data.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Music.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Random.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Timer.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransition.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionEmerge.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionFade.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionMove.cpp" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <PropertyGroup Label="Globals"> | ||||||
|  |     <ProjectGuid>{722EA245-ADD5-4296-8C85-8FF42C0335D3}</ProjectGuid> | ||||||
|  |     <Keyword>Win32Proj</Keyword> | ||||||
|  |     <RootNamespace>Easy2D</RootNamespace> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>StaticLibrary</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v110</PlatformToolset> | ||||||
|  |     <CharacterSet>Unicode</CharacterSet> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>StaticLibrary</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>false</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v110</PlatformToolset> | ||||||
|  |     <WholeProgramOptimization>false</WholeProgramOptimization> | ||||||
|  |     <CharacterSet>Unicode</CharacterSet> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||||||
|  |   <ImportGroup Label="ExtensionSettings"> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <PropertyGroup Label="UserMacros" /> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||||
|  |     <OutDir>$(SolutionDir)$(Platform)\</OutDir> | ||||||
|  |     <IntDir>$(Configuration)\$(Platform)\</IntDir> | ||||||
|  |     <TargetName>Easy2Ddw</TargetName> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||||
|  |     <OutDir>$(SolutionDir)$(Platform)\</OutDir> | ||||||
|  |     <IntDir>$(Configuration)\$(Platform)\</IntDir> | ||||||
|  |     <TargetName>Easy2Dw</TargetName> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||||
|  |     <ClCompile> | ||||||
|  |       <PrecompiledHeader>NotUsing</PrecompiledHeader> | ||||||
|  |       <WarningLevel>Level3</WarningLevel> | ||||||
|  |       <Optimization>Disabled</Optimization> | ||||||
|  |       <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||||
|  |       <SDLCheck>true</SDLCheck> | ||||||
|  |       <DebugInformationFormat>None</DebugInformationFormat> | ||||||
|  |       <MinimalRebuild>false</MinimalRebuild> | ||||||
|  |     </ClCompile> | ||||||
|  |     <Link> | ||||||
|  |       <SubSystem>Windows</SubSystem> | ||||||
|  |       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||||
|  |     </Link> | ||||||
|  |   </ItemDefinitionGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||||
|  |     <ClCompile> | ||||||
|  |       <WarningLevel>Level3</WarningLevel> | ||||||
|  |       <PrecompiledHeader> | ||||||
|  |       </PrecompiledHeader> | ||||||
|  |       <Optimization>MaxSpeed</Optimization> | ||||||
|  |       <FunctionLevelLinking> | ||||||
|  |       </FunctionLevelLinking> | ||||||
|  |       <IntrinsicFunctions>true</IntrinsicFunctions> | ||||||
|  |       <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||||
|  |       <SDLCheck>true</SDLCheck> | ||||||
|  |       <DebugInformationFormat>None</DebugInformationFormat> | ||||||
|  |     </ClCompile> | ||||||
|  |     <Link> | ||||||
|  |       <SubSystem>Windows</SubSystem> | ||||||
|  |       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||||
|  |       <EnableCOMDATFolding>true</EnableCOMDATFolding> | ||||||
|  |       <OptimizeReferences>true</OptimizeReferences> | ||||||
|  |     </Link> | ||||||
|  |   </ItemDefinitionGroup> | ||||||
|  |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||||
|  |   <ImportGroup Label="ExtensionTargets"> | ||||||
|  |   </ImportGroup> | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,215 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Filter Include="Action"> | ||||||
|  |       <UniqueIdentifier>{01311827-b639-4313-a5b6-61cd22fe8920}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Base"> | ||||||
|  |       <UniqueIdentifier>{e5c42dd3-2d56-4a95-8f88-45d059d58c21}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Common"> | ||||||
|  |       <UniqueIdentifier>{08126b0c-d139-48f9-8559-3d9d9e3a5940}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Event"> | ||||||
|  |       <UniqueIdentifier>{a00a6f30-ec6b-42be-93a2-c540466670a8}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Manager"> | ||||||
|  |       <UniqueIdentifier>{a8185fe2-5477-4293-97d6-d84f27d354bb}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Geometry"> | ||||||
|  |       <UniqueIdentifier>{dfaa8954-50d7-49c5-8aa6-7232c6d5c557}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Listener"> | ||||||
|  |       <UniqueIdentifier>{9b2673ff-9077-4d74-b7ec-b435e5540b66}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Node"> | ||||||
|  |       <UniqueIdentifier>{70412fec-4c60-425b-81c9-4547e5a1b78a}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Tool"> | ||||||
|  |       <UniqueIdentifier>{dacd05f1-3496-488b-af4d-b3ea7bce9515}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Transition"> | ||||||
|  |       <UniqueIdentifier>{337d5a0f-60fd-473a-83da-b2a3515affd9}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ClInclude Include="..\..\core\eactions.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\easy2d.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\ebase.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\ecommon.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\egeometry.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\elisteners.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\emacros.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\emanagers.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\enodes.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\etools.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\etransitions.h" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ClCompile Include="..\..\core\Action\Action.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionCallback.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionDelay.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionGradual.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionLoop.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionMoveBy.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionMoveTo.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionOpacityBy.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionOpacityTo.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionRotateBy.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionRotateTo.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionScaleBy.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionScaleTo.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionSequence.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionTwo.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionTwoAtSameTime.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\Animation.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Game.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Input.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Renderer.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Time.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Window.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Font.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Image.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Keyframe.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Object.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Scene.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\String.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Event\PhysicsEvent.cpp"> | ||||||
|  |       <Filter>Event</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\ActionManager.cpp"> | ||||||
|  |       <Filter>Manager</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\ObjectManager.cpp"> | ||||||
|  |       <Filter>Manager</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\PhysicsManager.cpp"> | ||||||
|  |       <Filter>Manager</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\SceneManager.cpp"> | ||||||
|  |       <Filter>Manager</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\TimerManager.cpp"> | ||||||
|  |       <Filter>Manager</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Circle.cpp"> | ||||||
|  |       <Filter>Geometry</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Ellipse.cpp"> | ||||||
|  |       <Filter>Geometry</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Geometry.cpp"> | ||||||
|  |       <Filter>Geometry</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Rectangle.cpp"> | ||||||
|  |       <Filter>Geometry</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\Listener.cpp"> | ||||||
|  |       <Filter>Listener</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\ListenerPhysics.cpp"> | ||||||
|  |       <Filter>Listener</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\ListenerPhysicsCollision.cpp"> | ||||||
|  |       <Filter>Listener</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Data.cpp"> | ||||||
|  |       <Filter>Tool</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Music.cpp"> | ||||||
|  |       <Filter>Tool</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Random.cpp"> | ||||||
|  |       <Filter>Tool</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Timer.cpp"> | ||||||
|  |       <Filter>Tool</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransition.cpp"> | ||||||
|  |       <Filter>Transition</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionEmerge.cpp"> | ||||||
|  |       <Filter>Transition</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionFade.cpp"> | ||||||
|  |       <Filter>Transition</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionMove.cpp"> | ||||||
|  |       <Filter>Transition</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Button.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\ButtonToggle.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Menu.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Node.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Sprite.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Text.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  |  | ||||||
|  | Microsoft Visual Studio Solution File, Format Version 12.00 | ||||||
|  | # Visual Studio 2013 | ||||||
|  | VisualStudioVersion = 12.0.21005.1 | ||||||
|  | MinimumVisualStudioVersion = 10.0.40219.1 | ||||||
|  | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Easy2D", "Easy2D.vcxproj", "{91DBDFCC-4083-427C-AAAD-55715118DB26}" | ||||||
|  | EndProject | ||||||
|  | Global | ||||||
|  | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
|  | 		Debug|Win32 = Debug|Win32 | ||||||
|  | 		Release|Win32 = Release|Win32 | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||||
|  | 		{91DBDFCC-4083-427C-AAAD-55715118DB26}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||||
|  | 		{91DBDFCC-4083-427C-AAAD-55715118DB26}.Debug|Win32.Build.0 = Debug|Win32 | ||||||
|  | 		{91DBDFCC-4083-427C-AAAD-55715118DB26}.Release|Win32.ActiveCfg = Release|Win32 | ||||||
|  | 		{91DBDFCC-4083-427C-AAAD-55715118DB26}.Release|Win32.Build.0 = Release|Win32 | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(SolutionProperties) = preSolution | ||||||
|  | 		HideSolutionNode = FALSE | ||||||
|  | 	EndGlobalSection | ||||||
|  | EndGlobal | ||||||
|  | @ -0,0 +1,160 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|  |   <ItemGroup Label="ProjectConfigurations"> | ||||||
|  |     <ProjectConfiguration Include="Debug|Win32"> | ||||||
|  |       <Configuration>Debug</Configuration> | ||||||
|  |       <Platform>Win32</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |     <ProjectConfiguration Include="Release|Win32"> | ||||||
|  |       <Configuration>Release</Configuration> | ||||||
|  |       <Platform>Win32</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <PropertyGroup Label="Globals"> | ||||||
|  |     <ProjectGuid>{91DBDFCC-4083-427C-AAAD-55715118DB26}</ProjectGuid> | ||||||
|  |     <Keyword>Win32Proj</Keyword> | ||||||
|  |     <RootNamespace>Win32Project1</RootNamespace> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>StaticLibrary</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v120</PlatformToolset> | ||||||
|  |     <CharacterSet>Unicode</CharacterSet> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>StaticLibrary</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>false</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v120</PlatformToolset> | ||||||
|  |     <WholeProgramOptimization>false</WholeProgramOptimization> | ||||||
|  |     <CharacterSet>Unicode</CharacterSet> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||||||
|  |   <ImportGroup Label="ExtensionSettings"> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <PropertyGroup Label="UserMacros" /> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||||
|  |     <OutDir>$(SolutionDir)$(Platform)\</OutDir> | ||||||
|  |     <IntDir>$(Configuration)\$(Platform)\</IntDir> | ||||||
|  |     <TargetName>Easy2Ddw</TargetName> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||||
|  |     <OutDir>$(SolutionDir)$(Platform)\</OutDir> | ||||||
|  |     <IntDir>$(Configuration)\$(Platform)\</IntDir> | ||||||
|  |     <TargetName>Easy2Dw</TargetName> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||||
|  |     <ClCompile> | ||||||
|  |       <PrecompiledHeader>NotUsing</PrecompiledHeader> | ||||||
|  |       <WarningLevel>Level3</WarningLevel> | ||||||
|  |       <Optimization>Disabled</Optimization> | ||||||
|  |       <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||||
|  |       <SDLCheck>true</SDLCheck> | ||||||
|  |       <DebugInformationFormat>None</DebugInformationFormat> | ||||||
|  |       <MinimalRebuild>false</MinimalRebuild> | ||||||
|  |     </ClCompile> | ||||||
|  |     <Link> | ||||||
|  |       <SubSystem>Windows</SubSystem> | ||||||
|  |       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||||
|  |     </Link> | ||||||
|  |   </ItemDefinitionGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||||
|  |     <ClCompile> | ||||||
|  |       <WarningLevel>Level3</WarningLevel> | ||||||
|  |       <PrecompiledHeader> | ||||||
|  |       </PrecompiledHeader> | ||||||
|  |       <Optimization>MaxSpeed</Optimization> | ||||||
|  |       <FunctionLevelLinking> | ||||||
|  |       </FunctionLevelLinking> | ||||||
|  |       <IntrinsicFunctions>true</IntrinsicFunctions> | ||||||
|  |       <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||||
|  |       <SDLCheck>true</SDLCheck> | ||||||
|  |       <DebugInformationFormat>None</DebugInformationFormat> | ||||||
|  |     </ClCompile> | ||||||
|  |     <Link> | ||||||
|  |       <SubSystem>Windows</SubSystem> | ||||||
|  |       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||||
|  |       <EnableCOMDATFolding>true</EnableCOMDATFolding> | ||||||
|  |       <OptimizeReferences>true</OptimizeReferences> | ||||||
|  |     </Link> | ||||||
|  |   </ItemDefinitionGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ClInclude Include="..\..\core\eactions.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\easy2d.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\ebase.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\ecommon.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\egeometry.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\elisteners.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\emacros.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\emanagers.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\enodes.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\etools.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\etransitions.h" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ClCompile Include="..\..\core\Action\Action.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionCallback.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionDelay.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionGradual.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionLoop.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionMoveBy.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionMoveTo.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionOpacityBy.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionOpacityTo.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionRotateBy.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionRotateTo.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionScaleBy.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionScaleTo.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionSequence.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionTwo.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionTwoAtSameTime.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\Animation.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Game.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Input.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Time.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Window.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Font.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Image.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Keyframe.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Object.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Scene.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Common\String.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Event\PhysicsEvent.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Circle.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Ellipse.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Geometry.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Rectangle.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\Listener.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\ListenerPhysics.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\ListenerPhysicsCollision.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\ActionManager.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\ObjectManager.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\PhysicsManager.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\SceneManager.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\TimerManager.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Button.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\ButtonToggle.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Menu.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Node.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Sprite.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Text.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Data.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Music.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Random.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Timer.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransition.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionEmerge.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionFade.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionMove.cpp" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||||
|  |   <ImportGroup Label="ExtensionTargets"> | ||||||
|  |   </ImportGroup> | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,215 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Filter Include="Action"> | ||||||
|  |       <UniqueIdentifier>{01311827-b639-4313-a5b6-61cd22fe8920}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Base"> | ||||||
|  |       <UniqueIdentifier>{e5c42dd3-2d56-4a95-8f88-45d059d58c21}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Common"> | ||||||
|  |       <UniqueIdentifier>{08126b0c-d139-48f9-8559-3d9d9e3a5940}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Event"> | ||||||
|  |       <UniqueIdentifier>{a00a6f30-ec6b-42be-93a2-c540466670a8}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Manager"> | ||||||
|  |       <UniqueIdentifier>{a8185fe2-5477-4293-97d6-d84f27d354bb}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Geometry"> | ||||||
|  |       <UniqueIdentifier>{dfaa8954-50d7-49c5-8aa6-7232c6d5c557}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Listener"> | ||||||
|  |       <UniqueIdentifier>{9b2673ff-9077-4d74-b7ec-b435e5540b66}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Node"> | ||||||
|  |       <UniqueIdentifier>{70412fec-4c60-425b-81c9-4547e5a1b78a}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Tool"> | ||||||
|  |       <UniqueIdentifier>{dacd05f1-3496-488b-af4d-b3ea7bce9515}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |     <Filter Include="Transition"> | ||||||
|  |       <UniqueIdentifier>{337d5a0f-60fd-473a-83da-b2a3515affd9}</UniqueIdentifier> | ||||||
|  |     </Filter> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ClInclude Include="..\..\core\eactions.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\easy2d.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\ebase.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\ecommon.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\egeometry.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\elisteners.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\emacros.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\emanagers.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\enodes.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\etools.h" /> | ||||||
|  |     <ClInclude Include="..\..\core\etransitions.h" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ClCompile Include="..\..\core\Action\Action.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionCallback.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionDelay.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionGradual.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionLoop.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionMoveBy.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionMoveTo.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionOpacityBy.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionOpacityTo.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionRotateBy.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionRotateTo.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionScaleBy.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionScaleTo.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionSequence.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionTwo.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\ActionTwoAtSameTime.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\Animation.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Game.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Input.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Renderer.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Time.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\Window.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Font.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Image.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Keyframe.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Object.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\Scene.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Common\String.cpp"> | ||||||
|  |       <Filter>Common</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Event\PhysicsEvent.cpp"> | ||||||
|  |       <Filter>Event</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\ActionManager.cpp"> | ||||||
|  |       <Filter>Manager</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\ObjectManager.cpp"> | ||||||
|  |       <Filter>Manager</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\PhysicsManager.cpp"> | ||||||
|  |       <Filter>Manager</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\SceneManager.cpp"> | ||||||
|  |       <Filter>Manager</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Manager\TimerManager.cpp"> | ||||||
|  |       <Filter>Manager</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Circle.cpp"> | ||||||
|  |       <Filter>Geometry</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Ellipse.cpp"> | ||||||
|  |       <Filter>Geometry</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Geometry.cpp"> | ||||||
|  |       <Filter>Geometry</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Geometry\Rectangle.cpp"> | ||||||
|  |       <Filter>Geometry</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\Listener.cpp"> | ||||||
|  |       <Filter>Listener</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\ListenerPhysics.cpp"> | ||||||
|  |       <Filter>Listener</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Listener\ListenerPhysicsCollision.cpp"> | ||||||
|  |       <Filter>Listener</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Data.cpp"> | ||||||
|  |       <Filter>Tool</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Music.cpp"> | ||||||
|  |       <Filter>Tool</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Random.cpp"> | ||||||
|  |       <Filter>Tool</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Tool\Timer.cpp"> | ||||||
|  |       <Filter>Tool</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransition.cpp"> | ||||||
|  |       <Filter>Transition</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionEmerge.cpp"> | ||||||
|  |       <Filter>Transition</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionFade.cpp"> | ||||||
|  |       <Filter>Transition</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Transition\ETransitionMove.cpp"> | ||||||
|  |       <Filter>Transition</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Button.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\ButtonToggle.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Menu.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Node.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Sprite.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Node\Text.cpp"> | ||||||
|  |       <Filter>Node</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
|  | @ -7,13 +7,20 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Easy2D", "Easy2D.vcxproj", | ||||||
| EndProject | EndProject | ||||||
| Global | Global | ||||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
|  | 		Debug|x64 = Debug|x64 | ||||||
| 		Debug|x86 = Debug|x86 | 		Debug|x86 = Debug|x86 | ||||||
|  | 		Release|x64 = Release|x64 | ||||||
| 		Release|x86 = Release|x86 | 		Release|x86 = Release|x86 | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||||
|  | 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
|  | 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.Build.0 = Debug|x64 | ||||||
|  | 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.Deploy.0 = Debug|x64 | ||||||
| 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.ActiveCfg = Debug|Win32 | 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.ActiveCfg = Debug|Win32 | ||||||
| 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.Build.0 = Debug|Win32 | 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.Build.0 = Debug|Win32 | ||||||
| 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.Deploy.0 = Debug|Win32 | 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.Deploy.0 = Debug|Win32 | ||||||
|  | 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x64.ActiveCfg = Release|x64 | ||||||
|  | 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x64.Build.0 = Release|x64 | ||||||
| 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x86.ActiveCfg = Release|Win32 | 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x86.ActiveCfg = Release|Win32 | ||||||
| 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x86.Build.0 = Release|Win32 | 		{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x86.Build.0 = Release|Win32 | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
|  |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue