增加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 bool s_bCollisionEnable = false; | ||||
| // 发生碰撞的节点
 | ||||
| static e2d::Node * s_pActiveNode = nullptr; | ||||
| static e2d::Node * s_pPassiveNode = nullptr; | ||||
| 
 | ||||
| 
 | ||||
| void e2d::ColliderManager::setEnable(bool enable) | ||||
|  | @ -84,6 +81,16 @@ void e2d::ColliderManager::__updateCollider(e2d::Collider * pActiveCollider) | |||
| 	Node* pActiveNode = pActiveCollider->_parentNode; | ||||
| 	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(); | ||||
| 
 | ||||
|  | @ -101,36 +108,23 @@ void e2d::ColliderManager::__updateCollider(e2d::Collider * pActiveCollider) | |||
| 			if (pPassiveNode && | ||||
| 				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)) | ||||
| 				{ | ||||
| 					// 判断两碰撞体交集情况
 | ||||
| 					Collider::Relation relation = pActiveCollider->getRelationWith(pPassiveCollider); | ||||
| 					// 忽略 UNKNOWN 和 DISJOINT 情况
 | ||||
| 					if (relation != Collider::Relation::UNKNOWN && relation != Collider::Relation::DISJOINT) | ||||
| 					// 忽略 UNKNOWN 和 DISJOIN 情况
 | ||||
| 					if (relation != Collider::Relation::UNKNOWN && relation != Collider::Relation::DISJOIN) | ||||
| 					{ | ||||
| 						s_pActiveNode = pActiveNode; | ||||
| 						s_pPassiveNode = pPassiveNode; | ||||
| 						pActiveNode->onCollide(pPassiveNode); | ||||
| 						pPassiveNode->onCollide(pActiveNode); | ||||
| 						pCurrentScene->onCollide(pActiveNode, pPassiveNode); | ||||
| 						Collision::__activeNode = pActiveNode; | ||||
| 						Collision::__passiveNode = pPassiveNode; | ||||
| 						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) | ||||
|  | @ -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) | ||||
| { | ||||
| 	if (pCollider) | ||||
|  |  | |||
|  | @ -905,14 +905,14 @@ bool e2d::Node::isPointIn(Point point) const | |||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| bool e2d::Node::isIntersectWith(const Node * node) const | ||||
| bool e2d::Node::isOverlappedWith(const Node * node) const | ||||
| { | ||||
| 	// 如果存在碰撞体,用碰撞体判断
 | ||||
| 	if (this->_collider && node->_collider) | ||||
| 	{ | ||||
| 		Collider::Relation relation = this->_collider->getRelationWith(node->_collider); | ||||
| 		if ((relation != Collider::Relation::UNKNOWN) && | ||||
| 			(relation != Collider::Relation::DISJOINT)) | ||||
| 			(relation != Collider::Relation::DISJOIN)) | ||||
| 		{ | ||||
| 			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; | ||||
| 
 | ||||
| // 碰撞体
 | ||||
|  | @ -28,7 +59,7 @@ public: | |||
| 	enum class Relation : int | ||||
| 	{ | ||||
| 		UNKNOWN = 0,		/* 关系不确定 */ | ||||
| 		DISJOINT = 1,		/* 没有交集 */ | ||||
| 		DISJOIN = 1,		/* 没有交集 */ | ||||
| 		IS_CONTAINED = 2,	/* 完全被包含 */ | ||||
| 		CONTAINS = 3,		/* 完全包含 */ | ||||
| 		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 Point | ||||
| { | ||||
| public: | ||||
|  | @ -32,7 +51,7 @@ public: | |||
| // 二维向量
 | ||||
| typedef Point Vector; | ||||
| 
 | ||||
| // 表示大小的结构体
 | ||||
| // 大小
 | ||||
| class Size | ||||
| { | ||||
| 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 | ||||
| { | ||||
|  | @ -622,12 +622,6 @@ public: | |||
| 	// 重写这个函数,它将在离开这个场景时自动执行
 | ||||
| 	virtual void onExit() {} | ||||
| 
 | ||||
| 	// 重写这个函数,它将在碰撞发生时自动执行
 | ||||
| 	virtual void onCollide( | ||||
| 		Node* pActiveNode,	/* 碰撞发生时的主动体 */ | ||||
| 		Node* pPassiveNode	/* 碰撞发生时的被动体 */ | ||||
| 	) {} | ||||
| 
 | ||||
| 	// 重写这个函数,它将在关闭窗口时执行(返回 false 将阻止窗口关闭)
 | ||||
| 	virtual bool onCloseWindow() { return true; } | ||||
| 
 | ||||
|  |  | |||
|  | @ -265,24 +265,6 @@ public: | |||
| 	// 停止所有监听器
 | ||||
| 	static void stopAll(); | ||||
| 
 | ||||
| 	// 获取碰撞发生时的主动体
 | ||||
| 	static Node * getActiveNode(); | ||||
| 
 | ||||
| 	// 获取碰撞发生时的被动体
 | ||||
| 	static Node * getPassiveNode(); | ||||
| 
 | ||||
| 	// 判断碰撞是否由该节点引发
 | ||||
| 	// 如果是,返回与其相撞的节点指针,否则返回空
 | ||||
| 	static Node * isCausedBy( | ||||
| 		Node * node | ||||
| 	); | ||||
| 
 | ||||
| 	// 判断发生碰撞的节点名称是否相同
 | ||||
| 	// 若相同,返回其指针,否则返回空
 | ||||
| 	static Node * isCausedBy( | ||||
| 		const String& name | ||||
| 	); | ||||
| 
 | ||||
| private: | ||||
| 	// 更新监听器
 | ||||
| 	static void __update(); | ||||
|  |  | |||
|  | @ -51,11 +51,6 @@ public: | |||
| 	// 渲染节点
 | ||||
| 	virtual void onRender() {} | ||||
| 
 | ||||
| 	// 碰撞处理
 | ||||
| 	virtual void onCollide( | ||||
| 		Node* node	/* 发生碰撞的节点 */ | ||||
| 	) {} | ||||
| 
 | ||||
| 	// 获取节点显示状态
 | ||||
| 	virtual bool isVisiable() const; | ||||
| 
 | ||||
|  | @ -64,8 +59,8 @@ public: | |||
| 		Point point | ||||
| 	) const; | ||||
| 
 | ||||
| 	// 判断两节点是否相交
 | ||||
| 	virtual bool isIntersectWith( | ||||
| 	// 判断两节点是否重叠
 | ||||
| 	virtual bool isOverlappedWith( | ||||
| 		const Node * node | ||||
| 	) const; | ||||
| 
 | ||||
|  |  | |||
|  | @ -223,6 +223,7 @@ | |||
|     <ClCompile Include="..\..\core\Collider\ColliderCircle.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Collider\ColliderEllipse.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Collider\ColliderRect.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Collider\Collision.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Common\Animation.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Common\Color.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Common\Function.cpp" /> | ||||
|  |  | |||
|  | @ -222,6 +222,9 @@ | |||
|     <ClCompile Include="..\..\core\Tool\Music.cpp"> | ||||
|       <Filter>Tool</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Collider\Collision.cpp"> | ||||
|       <Filter>Collider</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\..\core\easy2d.h" /> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue