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