Magic_Game/Easy2D/Manager/EPhysicsManager.cpp

239 lines
5.1 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;
2017-10-29 23:48:32 +08:00
for (auto &geometry : s_vGeometries)
2017-10-28 18:48:21 +08:00
{
2017-10-29 23:48:32 +08:00
if (!geometry->getParentNode() ||
(geometry->getParentNode()->getParentScene() != EApp::getCurrentScene()))
continue;
2017-10-28 18:48:21 +08:00
// ֻ<>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>˱仯<CBB1>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
2017-10-29 23:48:32 +08:00
if (geometry->m_bTransformed)
{
// <20>жϱ<CFB1><E4BBAF><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PhysicsGeometryProc(geometry);
// ȡ<><C8A1><EFBFBD><EFBFBD><E4BBAF>־
geometry->m_bTransformed = false;
}
}
}
void e2d::EPhysicsManager::PhysicsGeometryProc(EGeometry * pActiveGeometry)
{
// pActiveGeometry Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EPhysicsMsg::s_pActiveGeometry = pActiveGeometry;
// <20>жϱ<CFB1><E4BBAF><EFBFBD><EFBFBD>״̬
for (auto &pPassiveGeometry : s_vGeometries)
{
if (!pPassiveGeometry->getParentNode() ||
(pPassiveGeometry->getParentNode()->getParentScene() != EApp::getCurrentScene()))
continue;
if (pActiveGeometry != pPassiveGeometry)
2017-10-28 18:48:21 +08:00
{
2017-10-29 23:48:32 +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)
2017-10-28 18:48:21 +08:00
{
2017-10-29 23:48:32 +08:00
// ִ<>м<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();
}
}
}
}
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++;
}
}
}