Magic_Game/Easy2D/Manager/EPhysicsManager.cpp

225 lines
4.9 KiB
C++
Raw Normal View History

#include "..\emanagers.h"
2017-10-28 18:48:21 +08:00
#include "..\enodes.h"
#include "..\elisteners.h"
#include "..\egeometry.h"
2017-10-28 18:48:21 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2017-11-03 12:51:01 +08:00
e2d::EVector<e2d::EListenerPhysics*> s_vListeners;
2017-10-28 18:48:21 +08:00
// <20><>״<EFBFBD><D7B4><EFBFBD><EFBFBD>
e2d::EVector<e2d::EGeometry*> s_vGeometries;
2017-10-28 18:48:21 +08:00
2017-10-31 17:19:13 +08:00
void e2d::EPhysicsManager::PhysicsGeometryProc(EGeometry * pActiveGeometry)
2017-10-28 18:48:21 +08:00
{
if (s_vListeners.empty() || s_vGeometries.empty() || EApp::isPaused())
return;
2017-10-29 23:48:32 +08:00
// pActiveGeometry Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EPhysicsMsg::s_pActiveGeometry = pActiveGeometry;
// <20>жϱ<CFB1><E4BBAF><EFBFBD><EFBFBD>״̬
for (auto &pPassiveGeometry : s_vGeometries)
{
2017-10-31 17:19:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
2017-10-29 23:48:32 +08:00
if (!pPassiveGeometry->getParentNode() ||
(pPassiveGeometry->getParentNode()->getParentScene() != EApp::getCurrentScene()))
continue;
if (pActiveGeometry != pPassiveGeometry)
2017-10-28 18:48:21 +08:00
{
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><E0BBA5>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (pActiveGeometry->m_nCollisionBitmask & pPassiveGeometry->m_nCategoryBitmask)
2017-10-28 18:48:21 +08:00
{
// pPassiveGeometry Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EPhysicsMsg::s_pPassiveGeometry = pPassiveGeometry;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD>ϵ
EPhysicsMsg::s_nRelation = pActiveGeometry->_intersectWith(pPassiveGeometry);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>Ϊδ֪<CEB4><D6AA><EFBFBD>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (EPhysicsMsg::s_nRelation != EPhysicsMsg::UNKNOWN &&
EPhysicsMsg::s_nRelation != EPhysicsMsg::DISJOINT)
{
// ִ<>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
PhysicsListenerProc();
}
2017-10-28 18:48:21 +08:00
}
}
}
}
void e2d::EPhysicsManager::PhysicsListenerProc()
{
2017-10-28 18:48:21 +08:00
// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (size_t i = 0; i < s_vListeners.size(); i++)
{
auto &listener = s_vListeners[i];
if (listener->isRunning())
{
if (listener->getParentNode() &&
listener->getParentNode()->getParentScene() == EApp::getCurrentScene())
{
listener->_callOn();
}
}
}
}
2017-11-03 12:51:01 +08:00
void e2d::EPhysicsManager::bindListener(EListenerPhysics * listener, EScene * pParentScene)
2017-10-28 18:48:21 +08:00
{
EPhysicsManager::bindListener(listener, pParentScene->getRoot());
}
2017-11-03 12:51:01 +08:00
void e2d::EPhysicsManager::bindListener(EListenerPhysics * listener, ENode * pParentNode)
2017-10-28 18:48:21 +08:00
{
2017-11-03 12:51:01 +08:00
WARN_IF(listener == nullptr, "EListenerPhysics NULL pointer exception!");
WARN_IF(pParentNode == nullptr, "EListenerPhysics add to a NULL ENode pointer!");
2017-10-28 18:48:21 +08:00
if (listener && pParentNode)
{
ASSERT(
2017-10-28 18:48:21 +08:00
!listener->m_pParentNode,
"The listener is already binded, it cannot bind again!"
);
2017-10-28 18:48:21 +08:00
listener->retain();
listener->start();
listener->m_pParentNode = pParentNode;
s_vListeners.push_back(listener);
}
}
2017-10-31 17:19:13 +08:00
void e2d::EPhysicsManager::_addGeometry(EGeometry * geometry)
2017-10-28 18:48:21 +08:00
{
if (geometry)
{
geometry->retain();
s_vGeometries.push_back(geometry);
}
}
2017-10-31 17:19:13 +08:00
void e2d::EPhysicsManager::_delGeometry(EGeometry * geometry)
2017-10-28 18:48:21 +08:00
{
if (geometry)
{
for (size_t i = 0; i < s_vGeometries.size(); i++)
{
if (s_vGeometries[i] == geometry)
{
2017-10-31 17:19:13 +08:00
SafeRelease(&geometry);
2017-10-28 18:48:21 +08:00
s_vGeometries.erase(s_vGeometries.begin() + i);
return;
}
}
}
}
void e2d::EPhysicsManager::startListeners(const EString & name)
{
2017-10-28 18:48:21 +08:00
for (auto listener : s_vListeners)
{
if (listener->getName() == name)
{
listener->start();
}
}
}
void e2d::EPhysicsManager::stopListeners(const EString & name)
{
for (auto listener : s_vListeners)
{
if (listener->getName() == name)
{
listener->stop();
}
}
}
void e2d::EPhysicsManager::delListeners(const EString & name)
{
2017-11-03 12:51:01 +08:00
EVector<EListenerPhysics*>::iterator iter;
2017-10-28 18:48:21 +08:00
for (iter = s_vListeners.begin(); iter != s_vListeners.end();)
{
if ((*iter)->getName() == name)
{
2017-10-31 17:19:13 +08:00
SafeRelease(&(*iter));
2017-10-28 18:48:21 +08:00
iter = s_vListeners.erase(iter);
}
else
{
iter++;
}
}
}
void e2d::EPhysicsManager::startAllListenersBindedWith(EScene * pParentScene)
{
EPhysicsManager::startAllListenersBindedWith(pParentScene->getRoot());
}
void e2d::EPhysicsManager::stopAllListenersBindedWith(EScene * pParentScene)
{
EPhysicsManager::stopAllListenersBindedWith(pParentScene->getRoot());
}
void e2d::EPhysicsManager::startAllListenersBindedWith(ENode * pParentNode)
{
for (auto listener : s_vListeners)
{
if (listener->getParentNode() == pParentNode)
{
listener->start();
}
}
for (auto child : pParentNode->getChildren())
{
EPhysicsManager::startAllListenersBindedWith(child);
}
}
void e2d::EPhysicsManager::stopAllListenersBindedWith(ENode * pParentNode)
{
for (auto listener : s_vListeners)
{
if (listener->getParentNode() == pParentNode)
{
listener->stop();
}
}
for (auto child : pParentNode->getChildren())
{
EPhysicsManager::stopAllListenersBindedWith(child);
}
}
void e2d::EPhysicsManager::startAllListeners()
{
EPhysicsManager::startAllListenersBindedWith(EApp::getCurrentScene());
}
void e2d::EPhysicsManager::stopAllListeners()
{
EPhysicsManager::stopAllListenersBindedWith(EApp::getCurrentScene());
}
void e2d::EPhysicsManager::_clearManager()
{
s_vListeners.clear();
}
void e2d::EPhysicsManager::_clearAllListenersBindedWith(ENode * pParentNode)
{
for (size_t i = 0; i < s_vListeners.size();)
{
auto listener = s_vListeners[i];
if (listener->getParentNode() == pParentNode)
{
2017-10-31 17:19:13 +08:00
SafeRelease(&listener);
2017-10-28 18:48:21 +08:00
s_vListeners.erase(s_vListeners.begin() + i);
}
else
{
i++;
}
}
}