| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | #include "..\emanagers.h"
 | 
					
						
							|  |  |  |  | #include "..\enodes.h"
 | 
					
						
							|  |  |  |  | #include "..\eshape.h"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // <20><>״<EFBFBD><D7B4><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2018-03-13 13:13:26 +08:00
										 |  |  |  | static std::vector<e2d::Shape*> s_vShapes; | 
					
						
							|  |  |  |  | // <20><>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD>״̬
 | 
					
						
							|  |  |  |  | static bool s_bCollisionEnable = false; | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-13 13:13:26 +08:00
										 |  |  |  | void e2d::ShapeManager::setCollisionEnable(bool bEnable) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	s_bCollisionEnable = bEnable; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  |  | void e2d::ShapeManager::__updateShape(e2d::Shape * pActiveShape) | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-13 13:13:26 +08:00
										 |  |  |  | 	// <20>ж<EFBFBD><D0B6><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	if (!s_bCollisionEnable) | 
					
						
							|  |  |  |  | 		return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  |  | 	Node* pActiveNode = pActiveShape->m_pParentNode; | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | 	if (pActiveNode) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  |  | 		Scene* pCurrentScene = pActiveNode->getParentScene(); | 
					
						
							| 
									
										
										
										
											2018-03-13 13:13:26 +08:00
										 |  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | 		// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2018-03-13 13:13:26 +08:00
										 |  |  |  | 		for (size_t i = 0; i < s_vShapes.size(); i++) | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-03-13 13:13:26 +08:00
										 |  |  |  | 			auto pPassiveShape = s_vShapes[i]; | 
					
						
							|  |  |  |  | 			// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 			if (pActiveShape == pPassiveShape) | 
					
						
							|  |  |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | 			// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><E0BBA5>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 			if (pActiveShape->m_nCollisionBitmask & pPassiveShape->m_nCategoryBitmask) | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ײ<EFBFBD>ڵ<EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  |  | 				Node* pPassiveNode = pPassiveShape->m_pParentNode; | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | 				// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 				if (pPassiveNode && | 
					
						
							|  |  |  |  | 					pPassiveNode->getParentScene() == pCurrentScene) | 
					
						
							|  |  |  |  | 				{ | 
					
						
							|  |  |  |  | 					// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 					int relation = pActiveShape->getRelationWith(pPassiveShape); | 
					
						
							|  |  |  |  | 					// <20><><EFBFBD><EFBFBD> UNKNOWN <20><> DISJOINT <20><><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  |  | 					if (relation != Relation::UNKNOWN && relation != Relation::DISJOINT) | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | 					{ | 
					
						
							|  |  |  |  | 						pActiveNode->onCollide(pPassiveNode, relation); | 
					
						
							|  |  |  |  | 						pPassiveNode->onCollide(pActiveNode, pPassiveShape->getRelationWith(pActiveShape)); | 
					
						
							|  |  |  |  | 						pCurrentScene->onCollide(pActiveNode, pPassiveNode); | 
					
						
							|  |  |  |  | 					} | 
					
						
							|  |  |  |  | 				} | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-13 13:13:26 +08:00
										 |  |  |  | void e2d::ShapeManager::__add(Shape * pShape) | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	if (pShape) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-03-07 20:14:58 +08:00
										 |  |  |  | 		if (pShape->m_pParentNode) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-03-13 13:13:26 +08:00
										 |  |  |  | 			WARN_IF(true, "ShapeManager::__add Failed! The shape is already added."); | 
					
						
							| 
									
										
										
										
											2018-03-07 20:14:58 +08:00
										 |  |  |  | 			return; | 
					
						
							|  |  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | 		pShape->retain(); | 
					
						
							|  |  |  |  | 		s_vShapes.push_back(pShape); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-13 13:13:26 +08:00
										 |  |  |  | void e2d::ShapeManager::__remove(Shape * pShape) | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	if (pShape) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		for (size_t i = 0; i < s_vShapes.size(); i++) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			if (s_vShapes[i] == pShape) | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				SafeRelease(&pShape); | 
					
						
							|  |  |  |  | 				s_vShapes.erase(s_vShapes.begin() + i); | 
					
						
							|  |  |  |  | 				return; | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } |