Magic_Game/Easy2D/Manager/EPhysicsManager.cpp

227 lines
4.7 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>
e2d::EVector<e2d::EPhysicsListener*> s_vListeners;
// <20><>״<EFBFBD><D7B4><EFBFBD><EFBFBD>
e2d::EVector<e2d::EGeometry*> s_vGeometries;
2017-10-28 18:48:21 +08:00
void e2d::EPhysicsManager::PhysicsProc()
{
if (s_vListeners.empty() || s_vGeometries.empty() || EApp::isPaused())
return;
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><D7B4><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>
for (auto &g1 : s_vGeometries)
{
// ֻ<>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>˱仯<CBB1>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (g1->m_bTransformNeeded)
{
// <20><EFBFBD><E4BBAF><EFBFBD><EFBFBD>
g1->_transform();
// g1 Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EPhysicsMsg::s_pActiveGeometry = g1;
// <20>жϱ<CFB1><E4BBAF><EFBFBD><EFBFBD>״̬
for (auto &g2 : s_vGeometries)
{
if (g1 != g2)
{
// g2 Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EPhysicsMsg::s_pPassiveGeometry = g2;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD>ϵ
EPhysicsMsg::s_nRelation = g1->_intersectWith(g2);
// <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)
{
PhysicsListenerProc();
}
}
}
}
}
}
void e2d::EPhysicsManager::PhysicsListenerProc()
{
2017-10-28 18:48:21 +08:00
if (s_vListeners.empty()) return;
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();
}
}
}
}
void e2d::EPhysicsManager::bindListener(EPhysicsListener * listener, EScene * pParentScene)
{
EPhysicsManager::bindListener(listener, pParentScene->getRoot());
}
void e2d::EPhysicsManager::bindListener(EPhysicsListener * listener, ENode * pParentNode)
{
WARN_IF(listener == nullptr, "EPhysicsListener NULL pointer exception!");
WARN_IF(pParentNode == nullptr, "EPhysicsListener add to a NULL ENode pointer!");
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);
}
}
void e2d::EPhysicsManager::addGeometry(EGeometry * geometry)
{
if (geometry)
{
geometry->retain();
s_vGeometries.push_back(geometry);
}
}
2017-10-28 18:48:21 +08:00
void e2d::EPhysicsManager::delGeometry(EGeometry * geometry)
{
if (geometry)
{
for (size_t i = 0; i < s_vGeometries.size(); i++)
{
if (s_vGeometries[i] == geometry)
{
SafeReleaseAndClear(&geometry);
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)
{
EVector<EPhysicsListener*>::iterator iter;
for (iter = s_vListeners.begin(); iter != s_vListeners.end();)
{
if ((*iter)->getName() == name)
{
SafeReleaseAndClear(&(*iter));
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)
{
SafeReleaseAndClear(&listener);
s_vListeners.erase(s_vListeners.begin() + i);
}
else
{
i++;
}
}
}