diff --git a/Easy2D/Easy2D.vcxproj b/Easy2D/Easy2D.vcxproj index 2415a343..28fede94 100644 --- a/Easy2D/Easy2D.vcxproj +++ b/Easy2D/Easy2D.vcxproj @@ -219,7 +219,7 @@ - + diff --git a/Easy2D/Easy2D.vcxproj.filters b/Easy2D/Easy2D.vcxproj.filters index 4cd196cf..d012d305 100644 --- a/Easy2D/Easy2D.vcxproj.filters +++ b/Easy2D/Easy2D.vcxproj.filters @@ -198,9 +198,6 @@ Listener - - Listener - Common @@ -210,6 +207,9 @@ Common + + Listener + diff --git a/Easy2D/Geometry/EGeometry.cpp b/Easy2D/Geometry/EGeometry.cpp index 0978ddba..b00babf7 100644 --- a/Easy2D/Geometry/EGeometry.cpp +++ b/Easy2D/Geometry/EGeometry.cpp @@ -6,7 +6,7 @@ e2d::EGeometry::EGeometry() : m_bTransformed(false) , m_nCategoryBitmask(0) - ,m_nContactBitmask(0) + , m_nCollisionBitmask(0) , m_bIsVisiable(true) , m_nColor(EColor::RED) , m_fOpacity(1) @@ -20,11 +20,6 @@ e2d::EGeometry::~EGeometry() SafeReleaseInterface(&m_pTransformedGeometry); } -bool e2d::EGeometry::isContactWith(EGeometry * geometry) -{ - return ((this->m_nContactBitmask & geometry->m_nCategoryBitmask) != 0); -} - e2d::ENode * e2d::EGeometry::getParentNode() const { return m_pParentNode; @@ -35,9 +30,9 @@ UINT32 e2d::EGeometry::getCategoryBitmask() const return m_nCategoryBitmask; } -UINT32 e2d::EGeometry::getContactBitmask() const +UINT32 e2d::EGeometry::getCollisionBitmask() const { - return m_nContactBitmask; + return m_nCollisionBitmask; } void e2d::EGeometry::setCategoryBitmask(UINT32 mask) @@ -45,9 +40,9 @@ void e2d::EGeometry::setCategoryBitmask(UINT32 mask) m_nCategoryBitmask = mask; } -void e2d::EGeometry::setContactBitmask(UINT32 mask) +void e2d::EGeometry::setCollisionBitmask(UINT32 mask) { - m_nContactBitmask = mask; + m_nCollisionBitmask = mask; } void e2d::EGeometry::setVisiable(bool bVisiable) diff --git a/Easy2D/Listener/EListenerPhysicsContact.cpp b/Easy2D/Listener/EListenerPhysicsCollision.cpp similarity index 55% rename from Easy2D/Listener/EListenerPhysicsContact.cpp rename to Easy2D/Listener/EListenerPhysicsCollision.cpp index 3d78c900..0b8511d4 100644 --- a/Easy2D/Listener/EListenerPhysicsContact.cpp +++ b/Easy2D/Listener/EListenerPhysicsCollision.cpp @@ -1,29 +1,29 @@ #include "..\elisteners.h" #include "..\egeometry.h" -e2d::EListenerPhysicsContact::EListenerPhysicsContact() +e2d::EListenerPhysicsCollision::EListenerPhysicsCollision() : EListenerPhysics() { } -e2d::EListenerPhysicsContact::EListenerPhysicsContact(const EString & name) +e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const EString & name) : EListenerPhysics(name) { } -e2d::EListenerPhysicsContact::EListenerPhysicsContact(const COLLISION_LISTENER_CALLBACK & callback) +e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const COLLISION_LISTENER_CALLBACK & callback) : EListenerPhysics() { this->m_Callback = callback; } -e2d::EListenerPhysicsContact::EListenerPhysicsContact(const EString & name, const COLLISION_LISTENER_CALLBACK & callback) +e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const EString & name, const COLLISION_LISTENER_CALLBACK & callback) : EListenerPhysics(name) { this->m_Callback = callback; } -void e2d::EListenerPhysicsContact::_callOn() +void e2d::EListenerPhysicsCollision::_callOn() { if (EPhysicsMsg::getMsg() == EPhysicsMsg::OVERLAP || EPhysicsMsg::getMsg() == EPhysicsMsg::CONTAINS || diff --git a/Easy2D/Manager/EPhysicsManager.cpp b/Easy2D/Manager/EPhysicsManager.cpp index bf6cb5a9..5a312d68 100644 --- a/Easy2D/Manager/EPhysicsManager.cpp +++ b/Easy2D/Manager/EPhysicsManager.cpp @@ -26,19 +26,20 @@ void e2d::EPhysicsManager::PhysicsGeometryProc(EGeometry * pActiveGeometry) if (pActiveGeometry != pPassiveGeometry) { - // 判断两物体是否会产生接触消息 - if (!pActiveGeometry->isContactWith(pPassiveGeometry)) - continue; - // pPassiveGeometry 为被动方 - EPhysicsMsg::s_pPassiveGeometry = pPassiveGeometry; - // 获取两方的关系 - EPhysicsMsg::s_nRelation = pActiveGeometry->_intersectWith(pPassiveGeometry); - // 如果关系不为未知或无交集,响应监听器 - if (EPhysicsMsg::s_nRelation != EPhysicsMsg::UNKNOWN && - EPhysicsMsg::s_nRelation != EPhysicsMsg::DISJOINT) + // 判断两物体是否是相互冲突的物体 + if (pActiveGeometry->m_nCollisionBitmask & pPassiveGeometry->m_nCategoryBitmask) { - // 执行监听器 - PhysicsListenerProc(); + // pPassiveGeometry 为被动方 + EPhysicsMsg::s_pPassiveGeometry = pPassiveGeometry; + // 获取两方的关系 + EPhysicsMsg::s_nRelation = pActiveGeometry->_intersectWith(pPassiveGeometry); + // 如果关系不为未知或无交集,响应监听器 + if (EPhysicsMsg::s_nRelation != EPhysicsMsg::UNKNOWN && + EPhysicsMsg::s_nRelation != EPhysicsMsg::DISJOINT) + { + // 执行监听器 + PhysicsListenerProc(); + } } } } diff --git a/Easy2D/egeometry.h b/Easy2D/egeometry.h index fd081321..27b0e53a 100644 --- a/Easy2D/egeometry.h +++ b/Easy2D/egeometry.h @@ -49,27 +49,22 @@ public: virtual ~EGeometry(); - // 判断是否可以和另一几何图形产生接触消息 - bool isContactWith( - EGeometry * geometry - ); - // 获取父节点 ENode * getParentNode() const; // 获取类别掩码 UINT32 getCategoryBitmask() const; - // 获取接触掩码 - UINT32 getContactBitmask() const; + // 获取冲突掩码 + UINT32 getCollisionBitmask() const; // 设置类别掩码 void setCategoryBitmask( UINT32 mask ); - // 设置接触掩码 - void setContactBitmask( + // 设置冲突掩码 + void setCollisionBitmask( UINT32 mask ); @@ -106,7 +101,7 @@ protected: bool m_bTransformed; bool m_bIsVisiable; UINT32 m_nCategoryBitmask; - UINT32 m_nContactBitmask; + UINT32 m_nCollisionBitmask; UINT32 m_nColor; float m_fOpacity; ENode * m_pParentNode; diff --git a/Easy2D/elisteners.h b/Easy2D/elisteners.h index 7afba958..f447ac6f 100644 --- a/Easy2D/elisteners.h +++ b/Easy2D/elisteners.h @@ -328,12 +328,6 @@ protected: }; -// 物理世界消息监听器回调函数(参数:主动方、被动方、两方关系) -typedef std::function PHYSICS_LISTENER_CALLBACK; - -// 碰撞消息监听器回调函数(参数:主动方、被动方) -typedef std::function COLLISION_LISTENER_CALLBACK; - // 物理世界消息监听器 class EListenerPhysics : public EListener @@ -380,23 +374,22 @@ protected: }; -class EListenerPhysicsContact : +// 几何体冲突消息监听器 +class EListenerPhysicsCollision : public EListenerPhysics { - friend EMsgManager; - public: - EListenerPhysicsContact(); + EListenerPhysicsCollision(); - EListenerPhysicsContact( + EListenerPhysicsCollision( const EString &name ); - EListenerPhysicsContact( + EListenerPhysicsCollision( const COLLISION_LISTENER_CALLBACK &callback ); - EListenerPhysicsContact( + EListenerPhysicsCollision( const EString &name, const COLLISION_LISTENER_CALLBACK &callback ); diff --git a/Easy2D/etypedef.h b/Easy2D/etypedef.h index 091fb6e7..9e273ed9 100644 --- a/Easy2D/etypedef.h +++ b/Easy2D/etypedef.h @@ -103,13 +103,19 @@ struct EWindowStyle } }; +// 二维向量 typedef EPoint EVec; +// 字符串 typedef std::wstring EString; +// Vector 容器 template using EVector = std::vector; + +class ENode; + // 定时器回调函数(参数为该定时器被调用的次数,从 0 开始) typedef std::function TIMER_CALLBACK; @@ -134,4 +140,10 @@ typedef MOUSE_CLICK_LISTENER_CALLBACK MOUSE_DBLCLK_LISTENER_CALLBACK; // 鼠标拖动消息监听回调函数(参数为拖动前位置和拖动后位置) typedef std::function MOUSE_DRAG_LISTENER_CALLBACK; +// 物理世界消息监听器回调函数(参数:主动方、被动方、两方关系) +typedef std::function PHYSICS_LISTENER_CALLBACK; + +// 碰撞消息监听器回调函数(参数:主动方、被动方) +typedef std::function COLLISION_LISTENER_CALLBACK; + } \ No newline at end of file