中心点默认位置改为(0,0);新增ENode::setDefaultPivot函数设置默认中心点;修复了启用或禁用按钮后按钮消失的bug;更新了判断点是否在节点内的算法;修复了切换开关按钮状态不执行回调函数的bug;修复了子节点与父节点相对位置错误的bug;修复了其他的一些小bug。
This commit is contained in:
		
							parent
							
								
									07abf5cf96
								
							
						
					
					
						commit
						ee796af1df
					
				|  | @ -1,35 +1,53 @@ | ||||||
| #include <easy2d.h> | #include <easy2d.h> | ||||||
| 
 | 
 | ||||||
|  | class Scene2 : | ||||||
|  | 	public EScene | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	Scene2() | ||||||
|  | 	{ | ||||||
|  | 		auto text = new EText(L"²âÊÔ°´Å¥"); | ||||||
|  | 		auto text2 = new EText(L"²âÊÔ°´Å¥", L"", 22, EColor::BLUE); | ||||||
|  | 		auto button = new EButton(text, text2, text); | ||||||
|  | 		button->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2); | ||||||
|  | 		button->setCallback([]() { | ||||||
|  | 			EApp::backScene(new ETransitionScaleEmerge(1, ETransitionScaleEmerge::ENTER)); | ||||||
|  | 		}); | ||||||
|  | 		this->add(button); | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class Scene : | ||||||
|  | 	public EScene | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	Scene() | ||||||
|  | 	{ | ||||||
|  | 		/*auto sprite = new ESprite(L"test2.png");
 | ||||||
|  | 		auto button = new EButton(sprite); | ||||||
|  | 		button->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2); | ||||||
|  | 		button->setCallback([]() { | ||||||
|  | 			EApp::enterScene(new Scene2(), new ETransitionScaleEmerge(1, ETransitionScaleEmerge::ENTER)); | ||||||
|  | 		}); | ||||||
|  | 		this->add(button);*/ | ||||||
|  | 		auto sprite = new ESprite(L"test2.png"); | ||||||
|  | 		sprite->setPivot(-1, 0); | ||||||
|  | 		sprite->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2); | ||||||
|  | 		this->add(sprite); | ||||||
|  | 
 | ||||||
|  | 		sprite->runAction(new EActionLoop(new EActionRotateBy(1, 60))); | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| int main() | int main() | ||||||
| { | { | ||||||
| 	EApp app; | 	EApp app; | ||||||
| 
 | 
 | ||||||
| 	if (app.init(L"Easy2D Demo", 640, 480)) | 	if (app.init(L"Easy2D Demo", 640, 480)) | ||||||
| 	{ | 	{ | ||||||
| 		app.showConsole(); | 		ENode::setDefaultPiovt(0.5f, 0.5f); | ||||||
| 		auto scene = new EScene(); |  | ||||||
| 
 |  | ||||||
| 		// 创建一个文本
 |  | ||||||
| 		auto btnNormal = new EText(L"开"); |  | ||||||
| 		auto btnSelected = new EText(L"开"); |  | ||||||
| 		btnSelected->movePosY(2); |  | ||||||
| 		auto btnNormal2 = new EText(L"关"); |  | ||||||
| 		auto btnSelected2 = new EText(L"关"); |  | ||||||
| 		btnSelected2->movePosY(2); |  | ||||||
| 		// 创建一个按钮
 |  | ||||||
| 		auto button = new EButtonToggle(btnNormal, btnNormal2, btnSelected, btnSelected2); |  | ||||||
| 		button->setCallback([=]() { |  | ||||||
| 			//button->setEnable(false);
 |  | ||||||
| 		}); |  | ||||||
| 		button->toggle(); |  | ||||||
| 		button->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2); |  | ||||||
| 		scene->add(button); |  | ||||||
| 
 |  | ||||||
| 		// 创建按钮
 |  | ||||||
| 		auto button2 = new EButton(new EText(L"关闭"), [=]() { button->setEnable(!button->isEnable()); }); |  | ||||||
| 		button2->setPos(40, 40); |  | ||||||
| 		scene->add(button2); |  | ||||||
| 
 | 
 | ||||||
|  | 		auto scene = new Scene(); | ||||||
| 		app.enterScene(scene); | 		app.enterScene(scene); | ||||||
| 
 | 
 | ||||||
| 		app.run(); | 		app.run(); | ||||||
|  |  | ||||||
|  | @ -15,8 +15,8 @@ e2d::EScene::EScene() | ||||||
| 	m_pRoot->retain(); | 	m_pRoot->retain(); | ||||||
| 	m_pRoot->_onEnter(); | 	m_pRoot->_onEnter(); | ||||||
| 	m_pRoot->_setParentScene(this); | 	m_pRoot->_setParentScene(this); | ||||||
|  | 	m_pRoot->setPivot(0, 0); | ||||||
| 	m_pRoot->_setSize(EApp::getWidth(), EApp::getHeight()); | 	m_pRoot->_setSize(EApp::getWidth(), EApp::getHeight()); | ||||||
| 	m_pRoot->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::EScene::~EScene() | e2d::EScene::~EScene() | ||||||
|  |  | ||||||
|  | @ -46,7 +46,7 @@ bool e2d::EFont::isItalic() const | ||||||
| 	return m_bItalic; | 	return m_bItalic; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::EFont::setFamily(EString fontFamily) | void e2d::EFont::setFamily(const EString & fontFamily) | ||||||
| { | { | ||||||
| 	m_sFontFamily = fontFamily; | 	m_sFontFamily = fontFamily; | ||||||
| 	m_bRecreateNeeded = true; | 	m_bRecreateNeeded = true; | ||||||
|  |  | ||||||
|  | @ -101,7 +101,7 @@ | ||||||
|       <Optimization>Disabled</Optimization> |       <Optimization>Disabled</Optimization> | ||||||
|       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> |       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||||
|       <SDLCheck>true</SDLCheck> |       <SDLCheck>true</SDLCheck> | ||||||
|       <DebugInformationFormat>EditAndContinue</DebugInformationFormat> |       <DebugInformationFormat>None</DebugInformationFormat> | ||||||
|       <MinimalRebuild>false</MinimalRebuild> |       <MinimalRebuild>false</MinimalRebuild> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|  |  | ||||||
|  | @ -4,8 +4,7 @@ | ||||||
| #include "..\Win\winbase.h" | #include "..\Win\winbase.h" | ||||||
| 
 | 
 | ||||||
| e2d::EGeometry::EGeometry() | e2d::EGeometry::EGeometry() | ||||||
| 	: m_bTransformed(false) | 	: m_nCategoryBitmask(0) | ||||||
| 	, m_nCategoryBitmask(0) |  | ||||||
| 	, m_nCollisionBitmask(0) | 	, m_nCollisionBitmask(0) | ||||||
| 	, m_bIsVisiable(true) | 	, m_bIsVisiable(true) | ||||||
| 	, m_nColor(EColor::RED) | 	, m_nColor(EColor::RED) | ||||||
|  | @ -105,7 +104,7 @@ void e2d::EGeometry::_transform() | ||||||
| 		// 根据父节点转换几何图形
 | 		// 根据父节点转换几何图形
 | ||||||
| 		GetFactory()->CreateTransformedGeometry( | 		GetFactory()->CreateTransformedGeometry( | ||||||
| 			_getD2dGeometry(), | 			_getD2dGeometry(), | ||||||
| 			m_pParentNode->m_Matri, | 			m_pParentNode->m_MatriFinal, | ||||||
| 			&m_pTransformedGeometry | 			&m_pTransformedGeometry | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -73,6 +73,7 @@ void e2d::EButton::setNormal(ENode * normal) | ||||||
| 			this->addChild(normal); | 			this->addChild(normal); | ||||||
| 		} | 		} | ||||||
| 		m_pNormal = normal; | 		m_pNormal = normal; | ||||||
|  | 
 | ||||||
| 		_updateVisiable(); | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -139,6 +140,7 @@ void e2d::EButton::setEnable(bool bEnable) | ||||||
| 	if (m_bEnable != bEnable) | 	if (m_bEnable != bEnable) | ||||||
| 	{ | 	{ | ||||||
| 		m_bEnable = bEnable; | 		m_bEnable = bEnable; | ||||||
|  | 		_updateVisiable(); | ||||||
| 		_updateStatus(); | 		_updateStatus(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -159,6 +161,12 @@ 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); | ||||||
|  |  | ||||||
|  | @ -63,9 +63,13 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma | ||||||
| 
 | 
 | ||||||
| void e2d::EButtonToggle::toggle() | void e2d::EButtonToggle::toggle() | ||||||
| { | { | ||||||
| 	m_bToggle = !m_bToggle; | 	// 设置按钮状态
 | ||||||
| 	_updateToggle(); | 	setToggle(!m_bToggle); | ||||||
| 	_updateVisiable(); | 	// 执行回调函数
 | ||||||
|  | 	if (m_Callback) | ||||||
|  | 	{ | ||||||
|  | 		m_Callback(); | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::EButtonToggle::isToggleOn() const | bool e2d::EButtonToggle::isToggleOn() const | ||||||
|  | @ -79,6 +83,7 @@ void e2d::EButtonToggle::setToggle(bool toggle) | ||||||
| 	{ | 	{ | ||||||
| 		m_bToggle = toggle; | 		m_bToggle = toggle; | ||||||
| 		_updateToggle(); | 		_updateToggle(); | ||||||
|  | 		_updateVisiable(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,6 +6,10 @@ | ||||||
| #include "..\Win\winbase.h" | #include "..\Win\winbase.h" | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| 
 | 
 | ||||||
|  | // 默认中心点位置
 | ||||||
|  | static float s_fDefaultPiovtX = 0; | ||||||
|  | static float s_fDefaultPiovtY = 0; | ||||||
|  | 
 | ||||||
| e2d::ENode::ENode() | e2d::ENode::ENode() | ||||||
| 	: m_nOrder(0) | 	: m_nOrder(0) | ||||||
| 	, m_fScaleX(1.0f) | 	, m_fScaleX(1.0f) | ||||||
|  | @ -15,9 +19,10 @@ e2d::ENode::ENode() | ||||||
| 	, m_fSkewAngleY(0) | 	, m_fSkewAngleY(0) | ||||||
| 	, m_fDisplayOpacity(1.0f) | 	, m_fDisplayOpacity(1.0f) | ||||||
| 	, m_fRealOpacity(1.0f) | 	, m_fRealOpacity(1.0f) | ||||||
| 	, m_fPivotX(0.5f) | 	, m_fPivotX(s_fDefaultPiovtX) | ||||||
| 	, m_fPivotY(0.5f) | 	, m_fPivotY(s_fDefaultPiovtY) | ||||||
| 	, m_Matri(D2D1::Matrix3x2F::Identity()) | 	, m_MatriInitial(D2D1::Matrix3x2F::Identity()) | ||||||
|  | 	, m_MatriFinal(D2D1::Matrix3x2F::Identity()) | ||||||
| 	, m_bVisiable(true) | 	, m_bVisiable(true) | ||||||
| 	, m_bDisplayedInScene(false) | 	, m_bDisplayedInScene(false) | ||||||
| 	, m_pGeometry(nullptr) | 	, m_pGeometry(nullptr) | ||||||
|  | @ -25,7 +30,7 @@ e2d::ENode::ENode() | ||||||
| 	, m_pParentScene(nullptr) | 	, m_pParentScene(nullptr) | ||||||
| 	, m_nHashName(0) | 	, m_nHashName(0) | ||||||
| 	, m_bSortChildrenNeeded(false) | 	, m_bSortChildrenNeeded(false) | ||||||
| 	, m_bTransformChildrenNeeded(false) | 	, m_bTransformNeeded(false) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -64,7 +69,7 @@ void e2d::ENode::_callOn() | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (m_bTransformChildrenNeeded) | 	if (m_bTransformNeeded) | ||||||
| 	{ | 	{ | ||||||
| 		_updateTransform(this); | 		_updateTransform(this); | ||||||
| 	} | 	} | ||||||
|  | @ -89,7 +94,7 @@ void e2d::ENode::_callOn() | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		GetRenderTarget()->SetTransform(m_Matri); | 		GetRenderTarget()->SetTransform(m_MatriFinal); | ||||||
| 		// 渲染自身
 | 		// 渲染自身
 | ||||||
| 		this->_onRender(); | 		this->_onRender(); | ||||||
| 
 | 
 | ||||||
|  | @ -99,7 +104,7 @@ void e2d::ENode::_callOn() | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		GetRenderTarget()->SetTransform(m_Matri); | 		GetRenderTarget()->SetTransform(m_MatriFinal); | ||||||
| 		// 渲染自身
 | 		// 渲染自身
 | ||||||
| 		this->_onRender(); | 		this->_onRender(); | ||||||
| 	} | 	} | ||||||
|  | @ -169,20 +174,15 @@ void e2d::ENode::_sortChildren() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::_updateTransformToReal() | void e2d::ENode::_updateTransform() | ||||||
| { | { | ||||||
| 	// 计算锚点坐标
 | 	// 计算中心点坐标
 | ||||||
| 	D2D1_POINT_2F pivot = D2D1::Point2F( | 	D2D1_POINT_2F pivot = D2D1::Point2F( | ||||||
| 		getRealWidth() * m_fPivotX, | 		getRealWidth() * m_fPivotX, | ||||||
| 		getRealHeight() * m_fPivotY | 		getRealHeight() * m_fPivotY | ||||||
| 	); | 	); | ||||||
| 	// 计算左上角坐标
 | 	// 初步的二维矩形变换,子节点将根据这个矩阵进行变换
 | ||||||
| 	D2D1_POINT_2F upperLeftCorner = D2D1::Point2F( | 	m_MatriInitial = D2D1::Matrix3x2F::Scale( | ||||||
| 		m_Pos.x - getRealWidth() * m_fPivotX, |  | ||||||
| 		m_Pos.y - getRealHeight() * m_fPivotY |  | ||||||
| 	); |  | ||||||
| 	// 二维矩形变换
 |  | ||||||
| 	m_Matri = D2D1::Matrix3x2F::Scale( |  | ||||||
| 		m_fScaleX, | 		m_fScaleX, | ||||||
| 		m_fScaleY, | 		m_fScaleY, | ||||||
| 		pivot | 		pivot | ||||||
|  | @ -194,9 +194,16 @@ void e2d::ENode::_updateTransformToReal() | ||||||
| 		m_fRotation, | 		m_fRotation, | ||||||
| 		pivot | 		pivot | ||||||
| 	) * D2D1::Matrix3x2F::Translation( | 	) * D2D1::Matrix3x2F::Translation( | ||||||
| 		upperLeftCorner.x, | 		m_Pos.x, | ||||||
| 		upperLeftCorner.y | 		m_Pos.y | ||||||
| 	); | 	); | ||||||
|  | 	// 和父节点矩阵相乘
 | ||||||
|  | 	if (m_pParent) | ||||||
|  | 	{ | ||||||
|  | 		m_MatriInitial = m_MatriInitial * m_pParent->m_MatriInitial; | ||||||
|  | 	} | ||||||
|  | 	// 根据自身中心点做最终变换
 | ||||||
|  | 	m_MatriFinal = m_MatriInitial * D2D1::Matrix3x2F::Translation(-pivot.x, -pivot.y); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::_updateChildrenTransform() | void e2d::ENode::_updateChildrenTransform() | ||||||
|  | @ -210,13 +217,8 @@ void e2d::ENode::_updateChildrenTransform() | ||||||
| void e2d::ENode::_updateTransform(ENode * node) | void e2d::ENode::_updateTransform(ENode * node) | ||||||
| { | { | ||||||
| 	// 计算自身的转换矩阵
 | 	// 计算自身的转换矩阵
 | ||||||
| 	node->_updateTransformToReal(); | 	node->_updateTransform(); | ||||||
| 	// 和父节点矩阵相乘
 | 	// 绑定于自身的形状也进行相应转换
 | ||||||
| 	if (node->m_pParent) |  | ||||||
| 	{ |  | ||||||
| 		node->m_Matri = node->m_Matri * node->m_pParent->m_Matri; |  | ||||||
| 	} |  | ||||||
| 	// 转换几何形状
 |  | ||||||
| 	if (node->m_pGeometry) | 	if (node->m_pGeometry) | ||||||
| 	{ | 	{ | ||||||
| 		node->m_pGeometry->_transform(); | 		node->m_pGeometry->_transform(); | ||||||
|  | @ -224,12 +226,7 @@ void e2d::ENode::_updateTransform(ENode * node) | ||||||
| 	// 遍历子节点下的所有节点
 | 	// 遍历子节点下的所有节点
 | ||||||
| 	node->_updateChildrenTransform(); | 	node->_updateChildrenTransform(); | ||||||
| 	// 标志已执行过变换
 | 	// 标志已执行过变换
 | ||||||
| 	node->m_bTransformChildrenNeeded = false; | 	node->m_bTransformNeeded = false; | ||||||
| 	// 绑定于自身的形状也进行相应转换
 |  | ||||||
| 	if (node->m_pGeometry) |  | ||||||
| 	{ |  | ||||||
| 		node->m_pGeometry->m_bTransformed = true; |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::_updateChildrenOpacity() | void e2d::ENode::_updateChildrenOpacity() | ||||||
|  | @ -376,7 +373,7 @@ void e2d::ENode::setPos(float x, float y) | ||||||
| 
 | 
 | ||||||
| 	m_Pos.x = x; | 	m_Pos.x = x; | ||||||
| 	m_Pos.y = y; | 	m_Pos.y = y; | ||||||
| 	m_bTransformChildrenNeeded = true; | 	m_bTransformNeeded = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::movePosX(float x) | void e2d::ENode::movePosX(float x) | ||||||
|  | @ -421,7 +418,7 @@ void e2d::ENode::_setSize(float width, float height) | ||||||
| 
 | 
 | ||||||
| 	m_Size.width = width; | 	m_Size.width = width; | ||||||
| 	m_Size.height = height; | 	m_Size.height = height; | ||||||
| 	m_bTransformChildrenNeeded = true; | 	m_bTransformNeeded = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::setScaleX(float scaleX) | void e2d::ENode::setScaleX(float scaleX) | ||||||
|  | @ -446,7 +443,7 @@ void e2d::ENode::setScale(float scaleX, float scaleY) | ||||||
| 
 | 
 | ||||||
| 	m_fScaleX = scaleX; | 	m_fScaleX = scaleX; | ||||||
| 	m_fScaleY = scaleY; | 	m_fScaleY = scaleY; | ||||||
| 	m_bTransformChildrenNeeded = true; | 	m_bTransformNeeded = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::setSkewX(float angleX) | void e2d::ENode::setSkewX(float angleX) | ||||||
|  | @ -466,7 +463,7 @@ void e2d::ENode::setSkew(float angleX, float angleY) | ||||||
| 
 | 
 | ||||||
| 	m_fSkewAngleX = angleX; | 	m_fSkewAngleX = angleX; | ||||||
| 	m_fSkewAngleY = angleY; | 	m_fSkewAngleY = angleY; | ||||||
| 	m_bTransformChildrenNeeded = true; | 	m_bTransformNeeded = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::setRotation(float angle) | void e2d::ENode::setRotation(float angle) | ||||||
|  | @ -475,7 +472,7 @@ void e2d::ENode::setRotation(float angle) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	m_fRotation = angle; | 	m_fRotation = angle; | ||||||
| 	m_bTransformChildrenNeeded = true; | 	m_bTransformNeeded = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::setOpacity(float opacity) | void e2d::ENode::setOpacity(float opacity) | ||||||
|  | @ -505,7 +502,7 @@ void e2d::ENode::setPivot(float pivotX, float pivotY) | ||||||
| 
 | 
 | ||||||
| 	m_fPivotX = min(max(pivotX, 0), 1); | 	m_fPivotX = min(max(pivotX, 0), 1); | ||||||
| 	m_fPivotY = min(max(pivotY, 0), 1); | 	m_fPivotY = min(max(pivotY, 0), 1); | ||||||
| 	m_bTransformChildrenNeeded = true; | 	m_bTransformNeeded = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ENode::setGeometry(EGeometry * geometry) | void e2d::ENode::setGeometry(EGeometry * geometry) | ||||||
|  | @ -547,8 +544,6 @@ void e2d::ENode::addChild(ENode * child, int order  /* = 0 */) | ||||||
| 
 | 
 | ||||||
| 		child->m_pParent = this; | 		child->m_pParent = this; | ||||||
| 
 | 
 | ||||||
| 		_updateOpacity(child); |  | ||||||
| 
 |  | ||||||
| 		if (this->m_pParentScene) | 		if (this->m_pParentScene) | ||||||
| 		{ | 		{ | ||||||
| 			child->_setParentScene(this->m_pParentScene); | 			child->_setParentScene(this->m_pParentScene); | ||||||
|  | @ -559,6 +554,11 @@ void e2d::ENode::addChild(ENode * child, int order  /* = 0 */) | ||||||
| 			child->_onEnter(); | 			child->_onEnter(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		// 更新子节点透明度
 | ||||||
|  | 		_updateOpacity(child); | ||||||
|  | 		// 更新节点转换
 | ||||||
|  | 		child->m_bTransformNeeded = true; | ||||||
|  | 		// 更新子节点排序
 | ||||||
| 		m_bSortChildrenNeeded = true; | 		m_bSortChildrenNeeded = true; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -710,27 +710,26 @@ void e2d::ENode::pauseAction(EAction * action) | ||||||
| 
 | 
 | ||||||
| bool e2d::ENode::isPointIn(EPoint point) | bool e2d::ENode::isPointIn(EPoint point) | ||||||
| { | { | ||||||
| 	if (m_bTransformChildrenNeeded) | 	if (m_bTransformNeeded) | ||||||
| 	{ | 	{ | ||||||
| 		_updateTransform(this); | 		_updateTransform(this); | ||||||
| 	} | 	} | ||||||
| 	// 保存节点所在矩形
 | 	// 为节点创建一个形状
 | ||||||
| 	D2D1_POINT_2F leftTop = m_Matri.TransformPoint( | 	ID2D1RectangleGeometry * rect; | ||||||
| 		D2D1::Point2F(0, 0) | 	GetFactory()->CreateRectangleGeometry( | ||||||
|  | 		D2D1::RectF(0, 0, getRealWidth(), getRealHeight()), | ||||||
|  | 		&rect | ||||||
| 	); | 	); | ||||||
| 	D2D1_POINT_2F rightBottom = m_Matri.TransformPoint( | 	// 判断点是否在形状内
 | ||||||
| 		D2D1::Point2F(getRealWidth(), getRealHeight()) | 	BOOL ret; | ||||||
|  | 	rect->FillContainsPoint( | ||||||
|  | 		D2D1::Point2F( | ||||||
|  | 			point.x, | ||||||
|  | 			point.y), | ||||||
|  | 		&m_MatriFinal, | ||||||
|  | 		&ret | ||||||
| 	); | 	); | ||||||
| 	D2D1_RECT_F rt = D2D1::RectF( | 	if (ret) | ||||||
| 		leftTop.x, |  | ||||||
| 		leftTop.y, |  | ||||||
| 		rightBottom.x, |  | ||||||
| 		rightBottom.y |  | ||||||
| 	); |  | ||||||
| 	if (point.x >= rt.left && |  | ||||||
| 		point.x <= rt.right && |  | ||||||
| 		point.y >= rt.top && |  | ||||||
| 		point.y <= rt.bottom) |  | ||||||
| 	{ | 	{ | ||||||
| 		return true; | 		return true; | ||||||
| 	} | 	} | ||||||
|  | @ -743,6 +742,12 @@ bool e2d::ENode::isPointIn(EPoint point) | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void e2d::ENode::setDefaultPiovt(float defaultPiovtX, float defaultPiovtY) | ||||||
|  | { | ||||||
|  | 	s_fDefaultPiovtX = min(max(defaultPiovtX, 0), 1); | ||||||
|  | 	s_fDefaultPiovtY = min(max(defaultPiovtY, 0), 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void e2d::ENode::stopAction(EAction * action) | void e2d::ENode::stopAction(EAction * action) | ||||||
| { | { | ||||||
| 	if (action->getTarget() == this) | 	if (action->getTarget() == this) | ||||||
|  |  | ||||||
|  | @ -10,44 +10,44 @@ e2d::ETransitionScaleEmerge::ETransitionScaleEmerge(float duration, SCALE_EMERGE | ||||||
| 
 | 
 | ||||||
| void e2d::ETransitionScaleEmerge::_setTarget(EScene * prev, EScene * next, bool & transitional) | void e2d::ETransitionScaleEmerge::_setTarget(EScene * prev, EScene * next, bool & transitional) | ||||||
| { | { | ||||||
| 	float prevScaleTo; | 	float prevScaleBy; | ||||||
| 	float nextScaleStart; | 	float nextScaleBy; | ||||||
| 	if (m_Mode == SCALE_EMERGE_MODE::ENTER) | 	if (m_Mode == SCALE_EMERGE_MODE::ENTER) | ||||||
| 	{ | 	{ | ||||||
| 		prevScaleTo = 1.2f; | 		prevScaleBy = 0.2f; | ||||||
| 		nextScaleStart = 0.8f; | 		nextScaleBy = -0.2f; | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		prevScaleTo = 0.8f; | 		prevScaleBy = -0.2f; | ||||||
| 		nextScaleStart = 1.2f; | 		nextScaleBy = 0.2f; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// 初始化场景属性
 | 	// 初始化场景属性
 | ||||||
| 	next->getRoot()->setScale(nextScaleStart); | 	next->getRoot()->setScale(next->getRoot()->getScaleX() - nextScaleBy, next->getRoot()->getScaleY() - nextScaleBy); | ||||||
| 	next->getRoot()->setOpacity(0); | 	next->getRoot()->setOpacity(0); | ||||||
| 
 | 
 | ||||||
| 	// 第一个场景淡出
 | 	// 第一个场景淡出
 | ||||||
| 	auto prevActionFadeOut = new EActionFadeOut(m_fDuration); | 	auto prevActionFadeOut = new EActionFadeOut(m_fDuration); | ||||||
| 	auto prevActionScaleTo = new EActionScaleTo(m_fDuration, prevScaleTo); | 	auto prevActionScaleBy = new EActionScaleBy(m_fDuration, prevScaleBy); | ||||||
| 	auto action1 = new EActionTwoAtSameTime( | 	auto action1 = new EActionTwoAtSameTime( | ||||||
| 		prevActionFadeOut, | 		prevActionFadeOut, | ||||||
| 		prevActionScaleTo); | 		prevActionScaleBy); | ||||||
| 	if (prev) | 	if (prev) | ||||||
| 	{ | 	{ | ||||||
| 		prevActionFadeOut->setTarget(prev->getRoot()); | 		prevActionFadeOut->setTarget(prev->getRoot()); | ||||||
| 		prevActionScaleTo->setTarget(prev->getRoot()); | 		prevActionScaleBy->setTarget(prev->getRoot()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// 第二个场景淡入
 | 	// 第二个场景淡入
 | ||||||
| 	auto nextActionFadeOut = new EActionFadeIn(m_fDuration); | 	auto nextActionFadeOut = new EActionFadeIn(m_fDuration); | ||||||
| 	auto nextActionScaleTo = new EActionScaleTo(m_fDuration, 1); | 	auto nextActionScaleBy = new EActionScaleBy(m_fDuration, nextScaleBy); | ||||||
| 	auto action2 = new EActionTwoAtSameTime( | 	auto action2 = new EActionTwoAtSameTime( | ||||||
| 		nextActionFadeOut, | 		nextActionFadeOut, | ||||||
| 		nextActionScaleTo); | 		nextActionScaleBy); | ||||||
| 
 | 
 | ||||||
| 	nextActionFadeOut->setTarget(next->getRoot()); | 	nextActionFadeOut->setTarget(next->getRoot()); | ||||||
| 	nextActionScaleTo->setTarget(next->getRoot()); | 	nextActionScaleBy->setTarget(next->getRoot()); | ||||||
| 
 | 
 | ||||||
| 	// 标志动画结束
 | 	// 标志动画结束
 | ||||||
| 	auto action3 = new EActionCallback([&, prev, next] { | 	auto action3 = new EActionCallback([&, prev, next] { | ||||||
|  |  | ||||||
|  | @ -395,7 +395,7 @@ public: | ||||||
| 
 | 
 | ||||||
| 	// ÉèÖÃ×ÖÌå
 | 	// ÉèÖÃ×ÖÌå
 | ||||||
| 	void setFamily( | 	void setFamily( | ||||||
| 		EString fontFamily | 		const EString & fontFamily | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// ÉèÖÃ×ÖºÅ
 | 	// ÉèÖÃ×ÖºÅ
 | ||||||
|  |  | ||||||
|  | @ -69,7 +69,6 @@ protected: | ||||||
| 	virtual ID2D1Geometry * _getD2dGeometry() const = 0; | 	virtual ID2D1Geometry * _getD2dGeometry() const = 0; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	bool	m_bTransformed; |  | ||||||
| 	bool	m_bIsVisiable; | 	bool	m_bIsVisiable; | ||||||
| 	UINT32	m_nCategoryBitmask; | 	UINT32	m_nCategoryBitmask; | ||||||
| 	UINT32	m_nCollisionBitmask; | 	UINT32	m_nCollisionBitmask; | ||||||
|  |  | ||||||
|  | @ -68,10 +68,10 @@ public: | ||||||
| 	// 获取节点大小(不考虑缩放)
 | 	// 获取节点大小(不考虑缩放)
 | ||||||
| 	virtual ESize getRealSize() const; | 	virtual ESize getRealSize() const; | ||||||
| 
 | 
 | ||||||
| 	// 获取节点的锚点
 | 	// 获取节点的中心点
 | ||||||
| 	virtual float getPivotX() const; | 	virtual float getPivotX() const; | ||||||
| 
 | 
 | ||||||
| 	// 获取节点的锚点
 | 	// 获取节点的中心点
 | ||||||
| 	virtual float getPivotY() const; | 	virtual float getPivotY() const; | ||||||
| 
 | 
 | ||||||
| 	// 获取节点大小
 | 	// 获取节点大小
 | ||||||
|  | @ -226,20 +226,20 @@ public: | ||||||
| 		float opacity | 		float opacity | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置支点的横向位置
 | 	// 设置中心点的横向位置
 | ||||||
| 	// 默认为 0.5f, 范围 [0, 1]
 | 	// 默认为 0, 范围 [0, 1]
 | ||||||
| 	virtual void setPivotX( | 	virtual void setPivotX( | ||||||
| 		float pivotX | 		float pivotX | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置支点的纵向位置
 | 	// 设置中心点的纵向位置
 | ||||||
| 	// 默认为 0.5f, 范围 [0, 1]
 | 	// 默认为 0, 范围 [0, 1]
 | ||||||
| 	virtual void setPivotY( | 	virtual void setPivotY( | ||||||
| 		float pivotY | 		float pivotY | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 设置支点位置
 | 	// 设置中心点位置
 | ||||||
| 	// 默认为 (0.5f, 0.5f), 范围 [0, 1]
 | 	// 默认为 (0, 0), 范围 [0, 1]
 | ||||||
| 	virtual void setPivot( | 	virtual void setPivot( | ||||||
| 		float pivotX, | 		float pivotX, | ||||||
| 		float pivotY | 		float pivotY | ||||||
|  | @ -306,6 +306,12 @@ public: | ||||||
| 		EPoint point | 		EPoint point | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | 	// 修改节点的默认中心点位置
 | ||||||
|  | 	static void setDefaultPiovt( | ||||||
|  | 		float defaultPiovtX, | ||||||
|  | 		float defaultPiovtY | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 	// 访问节点
 | 	// 访问节点
 | ||||||
| 	virtual void _callOn(); | 	virtual void _callOn(); | ||||||
|  | @ -330,14 +336,14 @@ protected: | ||||||
| 		EScene * scene | 		EScene * scene | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 只考虑自身进行二维矩阵变换
 | 	// 对自身进行二维矩阵变换
 | ||||||
| 	void _updateTransformToReal(); | 	virtual void _updateTransform(); | ||||||
| 
 | 
 | ||||||
| 	// 更新所有子节点矩阵
 | 	// 更新所有子节点矩阵
 | ||||||
| 	void _updateChildrenTransform(); | 	virtual void _updateChildrenTransform(); | ||||||
| 
 | 
 | ||||||
| 	// 更新所有子节点透明度
 | 	// 更新所有子节点透明度
 | ||||||
| 	void _updateChildrenOpacity(); | 	virtual void _updateChildrenOpacity(); | ||||||
| 
 | 
 | ||||||
| 	// 更新节点矩阵
 | 	// 更新节点矩阵
 | ||||||
| 	static void _updateTransform(ENode * node); | 	static void _updateTransform(ENode * node); | ||||||
|  | @ -384,11 +390,12 @@ protected: | ||||||
| 	bool		m_bVisiable; | 	bool		m_bVisiable; | ||||||
| 	bool		m_bDisplayedInScene; | 	bool		m_bDisplayedInScene; | ||||||
| 	bool		m_bSortChildrenNeeded; | 	bool		m_bSortChildrenNeeded; | ||||||
| 	bool		m_bTransformChildrenNeeded; | 	bool		m_bTransformNeeded; | ||||||
| 	EGeometry * m_pGeometry; | 	EGeometry * m_pGeometry; | ||||||
| 	EScene *	m_pParentScene; | 	EScene *	m_pParentScene; | ||||||
| 	ENode *		m_pParent; | 	ENode *		m_pParent; | ||||||
| 	D2D1::Matrix3x2F	m_Matri; | 	D2D1::Matrix3x2F	m_MatriInitial; | ||||||
|  | 	D2D1::Matrix3x2F	m_MatriFinal; | ||||||
| 	EVector<ENode*>		m_vChildren; | 	EVector<ENode*>		m_vChildren; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -646,6 +653,9 @@ protected: | ||||||
| 	// 设置按钮状态
 | 	// 设置按钮状态
 | ||||||
| 	virtual void _setStatus(STATUS status); | 	virtual void _setStatus(STATUS status); | ||||||
| 
 | 
 | ||||||
|  | 	// 对自身进行二维矩阵变换
 | ||||||
|  | 	virtual void _updateTransform() override; | ||||||
|  | 
 | ||||||
| 	// 刷新按钮显示
 | 	// 刷新按钮显示
 | ||||||
| 	virtual void _updateVisiable(); | 	virtual void _updateVisiable(); | ||||||
| 
 | 
 | ||||||
|  | @ -715,13 +725,14 @@ public: | ||||||
| 		const BUTTON_CLICK_CALLBACK & callback = nullptr | 		const BUTTON_CLICK_CALLBACK & callback = nullptr | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 切换开关状态
 | 	// 切换开关状态,并执行回调函数
 | ||||||
| 	void toggle(); | 	void toggle(); | ||||||
| 
 | 
 | ||||||
| 	// 获取开关状态
 | 	// 获取开关状态
 | ||||||
| 	bool isToggleOn() const; | 	bool isToggleOn() const; | ||||||
| 
 | 
 | ||||||
| 	// 打开或关闭开关
 | 	// 打开或关闭开关
 | ||||||
|  | 	// 仅设置按钮状态,不执行回调函数
 | ||||||
| 	void setToggle( | 	void setToggle( | ||||||
| 		bool toggle | 		bool toggle | ||||||
| 	); | 	); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue