增加Collision类,去除Node::onCollide和Scene::onCollide方法
This commit is contained in:
		
							parent
							
								
									551cbaa2b2
								
							
						
					
					
						commit
						ec1cbaec13
					
				|  | @ -0,0 +1,34 @@ | ||||||
|  | #include "..\e2dcollider.h" | ||||||
|  | #include "..\e2dnode.h" | ||||||
|  | 
 | ||||||
|  | e2d::Node * e2d::Collision::__activeNode = nullptr; | ||||||
|  | e2d::Node * e2d::Collision::__passiveNode = nullptr; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | e2d::Node * e2d::Collision::getActiveNode() | ||||||
|  | { | ||||||
|  | 	return __activeNode; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::Node * e2d::Collision::getPassiveNode() | ||||||
|  | { | ||||||
|  | 	return __passiveNode; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::Node* e2d::Collision::isCausedBy(Node * node) | ||||||
|  | { | ||||||
|  | 	if (__activeNode == node) | ||||||
|  | 		return __passiveNode; | ||||||
|  | 	if (__passiveNode == node) | ||||||
|  | 		return __activeNode; | ||||||
|  | 	return nullptr; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | e2d::Node* e2d::Collision::isCausedBy(const String& name) | ||||||
|  | { | ||||||
|  | 	if (__activeNode->getName() == name) | ||||||
|  | 		return __activeNode; | ||||||
|  | 	if (__passiveNode->getName() == name) | ||||||
|  | 		return __passiveNode; | ||||||
|  | 	return nullptr; | ||||||
|  | } | ||||||
|  | @ -42,9 +42,6 @@ static std::vector<e2d::Collider*> s_vColliders; | ||||||
| static std::vector<Listener*> s_vListeners; | static std::vector<Listener*> s_vListeners; | ||||||
| // 碰撞触发状态
 | // 碰撞触发状态
 | ||||||
| static bool s_bCollisionEnable = false; | static bool s_bCollisionEnable = false; | ||||||
| // 发生碰撞的节点
 |  | ||||||
| static e2d::Node * s_pActiveNode = nullptr; |  | ||||||
| static e2d::Node * s_pPassiveNode = nullptr; |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void e2d::ColliderManager::setEnable(bool enable) | void e2d::ColliderManager::setEnable(bool enable) | ||||||
|  | @ -84,6 +81,16 @@ void e2d::ColliderManager::__updateCollider(e2d::Collider * pActiveCollider) | ||||||
| 	Node* pActiveNode = pActiveCollider->_parentNode; | 	Node* pActiveNode = pActiveCollider->_parentNode; | ||||||
| 	if (pActiveNode) | 	if (pActiveNode) | ||||||
| 	{ | 	{ | ||||||
|  | 		// 判断两物体是否是相互冲突的物体
 | ||||||
|  | 		auto IsCollideWith = [](Node * active, Node * passive) -> bool | ||||||
|  | 		{ | ||||||
|  | 			unsigned int hash = passive->getHashName(); | ||||||
|  | 			for (auto collider : active->_colliders) | ||||||
|  | 				if (collider == hash) | ||||||
|  | 					return true; | ||||||
|  | 			return false; | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
| 		// 获取节点所在场景
 | 		// 获取节点所在场景
 | ||||||
| 		Scene* pCurrentScene = pActiveNode->getParentScene(); | 		Scene* pCurrentScene = pActiveNode->getParentScene(); | ||||||
| 
 | 
 | ||||||
|  | @ -101,36 +108,23 @@ void e2d::ColliderManager::__updateCollider(e2d::Collider * pActiveCollider) | ||||||
| 			if (pPassiveNode && | 			if (pPassiveNode && | ||||||
| 				pPassiveNode->getParentScene() == pCurrentScene) | 				pPassiveNode->getParentScene() == pCurrentScene) | ||||||
| 			{ | 			{ | ||||||
| 				// 判断两物体是否是相互冲突的物体
 |  | ||||||
| 				auto IsCollideWith = [](Node * active, Node * passive) -> bool |  | ||||||
| 				{ |  | ||||||
| 					unsigned int hash = passive->getHashName(); |  | ||||||
| 					for (auto collider : active->_colliders) |  | ||||||
| 						if (collider == hash) |  | ||||||
| 							return true; |  | ||||||
| 					return false; |  | ||||||
| 				}; |  | ||||||
| 
 |  | ||||||
| 				if (IsCollideWith(pActiveNode, pPassiveNode)) | 				if (IsCollideWith(pActiveNode, pPassiveNode)) | ||||||
| 				{ | 				{ | ||||||
| 					// 判断两碰撞体交集情况
 | 					// 判断两碰撞体交集情况
 | ||||||
| 					Collider::Relation relation = pActiveCollider->getRelationWith(pPassiveCollider); | 					Collider::Relation relation = pActiveCollider->getRelationWith(pPassiveCollider); | ||||||
| 					// 忽略 UNKNOWN 和 DISJOINT 情况
 | 					// 忽略 UNKNOWN 和 DISJOIN 情况
 | ||||||
| 					if (relation != Collider::Relation::UNKNOWN && relation != Collider::Relation::DISJOINT) | 					if (relation != Collider::Relation::UNKNOWN && relation != Collider::Relation::DISJOIN) | ||||||
| 					{ | 					{ | ||||||
| 						s_pActiveNode = pActiveNode; | 						Collision::__activeNode = pActiveNode; | ||||||
| 						s_pPassiveNode = pPassiveNode; | 						Collision::__passiveNode = pPassiveNode; | ||||||
| 						pActiveNode->onCollide(pPassiveNode); |  | ||||||
| 						pPassiveNode->onCollide(pActiveNode); |  | ||||||
| 						pCurrentScene->onCollide(pActiveNode, pPassiveNode); |  | ||||||
| 						ColliderManager::__update(); | 						ColliderManager::__update(); | ||||||
| 					} | 					} | ||||||
|  | 					Collision::__activeNode = nullptr; | ||||||
|  | 					Collision::__passiveNode = nullptr; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	s_pActiveNode = nullptr; |  | ||||||
| 	s_pPassiveNode = nullptr; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ColliderManager::add(const Function& func, const String& name, bool paused) | void e2d::ColliderManager::add(const Function& func, const String& name, bool paused) | ||||||
|  | @ -196,34 +190,6 @@ void e2d::ColliderManager::stopAll() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Node * e2d::ColliderManager::getActiveNode() |  | ||||||
| { |  | ||||||
| 	return s_pActiveNode; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::Node * e2d::ColliderManager::getPassiveNode() |  | ||||||
| { |  | ||||||
| 	return s_pPassiveNode; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::Node* e2d::ColliderManager::isCausedBy(Node * node) |  | ||||||
| { |  | ||||||
| 	if (s_pActiveNode == node) |  | ||||||
| 		return s_pPassiveNode; |  | ||||||
| 	if (s_pPassiveNode == node) |  | ||||||
| 		return s_pActiveNode; |  | ||||||
| 	return nullptr; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| e2d::Node* e2d::ColliderManager::isCausedBy(const String& name) |  | ||||||
| { |  | ||||||
| 	if (s_pActiveNode->getName() == name) |  | ||||||
| 		return s_pActiveNode; |  | ||||||
| 	if (s_pPassiveNode->getName() == name) |  | ||||||
| 		return s_pPassiveNode; |  | ||||||
| 	return nullptr; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void e2d::ColliderManager::__addCollider(Collider * pCollider) | void e2d::ColliderManager::__addCollider(Collider * pCollider) | ||||||
| { | { | ||||||
| 	if (pCollider) | 	if (pCollider) | ||||||
|  |  | ||||||
|  | @ -905,14 +905,14 @@ bool e2d::Node::isPointIn(Point point) const | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::Node::isIntersectWith(const Node * node) const | bool e2d::Node::isOverlappedWith(const Node * node) const | ||||||
| { | { | ||||||
| 	// 如果存在碰撞体,用碰撞体判断
 | 	// 如果存在碰撞体,用碰撞体判断
 | ||||||
| 	if (this->_collider && node->_collider) | 	if (this->_collider && node->_collider) | ||||||
| 	{ | 	{ | ||||||
| 		Collider::Relation relation = this->_collider->getRelationWith(node->_collider); | 		Collider::Relation relation = this->_collider->getRelationWith(node->_collider); | ||||||
| 		if ((relation != Collider::Relation::UNKNOWN) && | 		if ((relation != Collider::Relation::UNKNOWN) && | ||||||
| 			(relation != Collider::Relation::DISJOINT)) | 			(relation != Collider::Relation::DISJOIN)) | ||||||
| 		{ | 		{ | ||||||
| 			return true; | 			return true; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -6,6 +6,37 @@ namespace e2d | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | // 碰撞事件
 | ||||||
|  | class Collision | ||||||
|  | { | ||||||
|  | 	friend ColliderManager; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 	// 获取碰撞发生时的主动体
 | ||||||
|  | 	static Node * getActiveNode(); | ||||||
|  | 
 | ||||||
|  | 	// 获取碰撞发生时的被动体
 | ||||||
|  | 	static Node * getPassiveNode(); | ||||||
|  | 
 | ||||||
|  | 	// 判断碰撞是否由该节点引发
 | ||||||
|  | 	// 如果是,返回与其相撞的节点指针,否则返回空
 | ||||||
|  | 	static Node * isCausedBy( | ||||||
|  | 		Node * node | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 判断发生碰撞的节点名称是否相同
 | ||||||
|  | 	// 若相同,返回其指针,否则返回空
 | ||||||
|  | 	static Node * isCausedBy( | ||||||
|  | 		const String& name | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	static Node * __activeNode; | ||||||
|  | 	static Node * __passiveNode; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class ColliderManager; | class ColliderManager; | ||||||
| 
 | 
 | ||||||
| // 碰撞体
 | // 碰撞体
 | ||||||
|  | @ -28,7 +59,7 @@ public: | ||||||
| 	enum class Relation : int | 	enum class Relation : int | ||||||
| 	{ | 	{ | ||||||
| 		UNKNOWN = 0,		/* 关系不确定 */ | 		UNKNOWN = 0,		/* 关系不确定 */ | ||||||
| 		DISJOINT = 1,		/* 没有交集 */ | 		DISJOIN = 1,		/* 没有交集 */ | ||||||
| 		IS_CONTAINED = 2,	/* 完全被包含 */ | 		IS_CONTAINED = 2,	/* 完全被包含 */ | ||||||
| 		CONTAINS = 3,		/* 完全包含 */ | 		CONTAINS = 3,		/* 完全包含 */ | ||||||
| 		OVERLAP = 4			/* 部分重叠 */ | 		OVERLAP = 4			/* 部分重叠 */ | ||||||
|  |  | ||||||
|  | @ -6,9 +6,28 @@ namespace e2d | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | // 方向
 | ||||||
|  | enum class Direction : int | ||||||
|  | { | ||||||
|  | 	UP,			/* 上 */ | ||||||
|  | 	DOWN,		/* 下 */ | ||||||
|  | 	LEFT,		/* 左 */ | ||||||
|  | 	RIGHT		/* 右 */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // 线条相交样式
 | ||||||
|  | enum class LineJoin : int | ||||||
|  | { | ||||||
|  | 	MITER = 0,	/* 斜切 */ | ||||||
|  | 	BEVEL = 1,	/* 斜角 */ | ||||||
|  | 	ROUND = 2	/* 圆角 */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| class Size; | class Size; | ||||||
| 
 | 
 | ||||||
| // 表示坐标的结构体
 | // 坐标
 | ||||||
| class Point | class Point | ||||||
| { | { | ||||||
| public: | public: | ||||||
|  | @ -32,7 +51,7 @@ public: | ||||||
| // 二维向量
 | // 二维向量
 | ||||||
| typedef Point Vector; | typedef Point Vector; | ||||||
| 
 | 
 | ||||||
| // 表示大小的结构体
 | // 大小
 | ||||||
| class Size | class Size | ||||||
| { | { | ||||||
| public: | public: | ||||||
|  | @ -295,25 +314,6 @@ public: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // 方向
 |  | ||||||
| enum class Direction : int |  | ||||||
| { |  | ||||||
| 	UP,			/* 上 */ |  | ||||||
| 	DOWN,		/* 下 */ |  | ||||||
| 	LEFT,		/* 左 */ |  | ||||||
| 	RIGHT		/* 右 */ |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 线条相交样式
 |  | ||||||
| enum class LineJoin : int |  | ||||||
| { |  | ||||||
| 	MITER = 0, |  | ||||||
| 	BEVEL = 1, |  | ||||||
| 	ROUND = 2 |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // 函数对象
 | // 函数对象
 | ||||||
| class Function | class Function | ||||||
| { | { | ||||||
|  | @ -622,12 +622,6 @@ public: | ||||||
| 	// 重写这个函数,它将在离开这个场景时自动执行
 | 	// 重写这个函数,它将在离开这个场景时自动执行
 | ||||||
| 	virtual void onExit() {} | 	virtual void onExit() {} | ||||||
| 
 | 
 | ||||||
| 	// 重写这个函数,它将在碰撞发生时自动执行
 |  | ||||||
| 	virtual void onCollide( |  | ||||||
| 		Node* pActiveNode,	/* 碰撞发生时的主动体 */ |  | ||||||
| 		Node* pPassiveNode	/* 碰撞发生时的被动体 */ |  | ||||||
| 	) {} |  | ||||||
| 
 |  | ||||||
| 	// 重写这个函数,它将在关闭窗口时执行(返回 false 将阻止窗口关闭)
 | 	// 重写这个函数,它将在关闭窗口时执行(返回 false 将阻止窗口关闭)
 | ||||||
| 	virtual bool onCloseWindow() { return true; } | 	virtual bool onCloseWindow() { return true; } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -265,24 +265,6 @@ public: | ||||||
| 	// 停止所有监听器
 | 	// 停止所有监听器
 | ||||||
| 	static void stopAll(); | 	static void stopAll(); | ||||||
| 
 | 
 | ||||||
| 	// 获取碰撞发生时的主动体
 |  | ||||||
| 	static Node * getActiveNode(); |  | ||||||
| 
 |  | ||||||
| 	// 获取碰撞发生时的被动体
 |  | ||||||
| 	static Node * getPassiveNode(); |  | ||||||
| 
 |  | ||||||
| 	// 判断碰撞是否由该节点引发
 |  | ||||||
| 	// 如果是,返回与其相撞的节点指针,否则返回空
 |  | ||||||
| 	static Node * isCausedBy( |  | ||||||
| 		Node * node |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 判断发生碰撞的节点名称是否相同
 |  | ||||||
| 	// 若相同,返回其指针,否则返回空
 |  | ||||||
| 	static Node * isCausedBy( |  | ||||||
| 		const String& name |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| private: | private: | ||||||
| 	// 更新监听器
 | 	// 更新监听器
 | ||||||
| 	static void __update(); | 	static void __update(); | ||||||
|  |  | ||||||
|  | @ -51,11 +51,6 @@ public: | ||||||
| 	// 渲染节点
 | 	// 渲染节点
 | ||||||
| 	virtual void onRender() {} | 	virtual void onRender() {} | ||||||
| 
 | 
 | ||||||
| 	// 碰撞处理
 |  | ||||||
| 	virtual void onCollide( |  | ||||||
| 		Node* node	/* 发生碰撞的节点 */ |  | ||||||
| 	) {} |  | ||||||
| 
 |  | ||||||
| 	// 获取节点显示状态
 | 	// 获取节点显示状态
 | ||||||
| 	virtual bool isVisiable() const; | 	virtual bool isVisiable() const; | ||||||
| 
 | 
 | ||||||
|  | @ -64,8 +59,8 @@ public: | ||||||
| 		Point point | 		Point point | ||||||
| 	) const; | 	) const; | ||||||
| 
 | 
 | ||||||
| 	// 判断两节点是否相交
 | 	// 判断两节点是否重叠
 | ||||||
| 	virtual bool isIntersectWith( | 	virtual bool isOverlappedWith( | ||||||
| 		const Node * node | 		const Node * node | ||||||
| 	) const; | 	) const; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -223,6 +223,7 @@ | ||||||
|     <ClCompile Include="..\..\core\Collider\ColliderCircle.cpp" /> |     <ClCompile Include="..\..\core\Collider\ColliderCircle.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Collider\ColliderEllipse.cpp" /> |     <ClCompile Include="..\..\core\Collider\ColliderEllipse.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Collider\ColliderRect.cpp" /> |     <ClCompile Include="..\..\core\Collider\ColliderRect.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Collider\Collision.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Animation.cpp" /> |     <ClCompile Include="..\..\core\Common\Animation.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Color.cpp" /> |     <ClCompile Include="..\..\core\Common\Color.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Function.cpp" /> |     <ClCompile Include="..\..\core\Common\Function.cpp" /> | ||||||
|  |  | ||||||
|  | @ -222,6 +222,9 @@ | ||||||
|     <ClCompile Include="..\..\core\Tool\Music.cpp"> |     <ClCompile Include="..\..\core\Tool\Music.cpp"> | ||||||
|       <Filter>Tool</Filter> |       <Filter>Tool</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Collider\Collision.cpp"> | ||||||
|  |       <Filter>Collider</Filter> | ||||||
|  |     </ClCompile> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="..\..\core\easy2d.h" /> |     <ClInclude Include="..\..\core\easy2d.h" /> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue