Collision判断方式重做
This commit is contained in:
parent
f5c1d58134
commit
198ff09eaa
|
|
@ -1,10 +1,51 @@
|
||||||
#include "..\e2dcollider.h"
|
#include "..\e2dcollider.h"
|
||||||
#include "..\e2dnode.h"
|
#include "..\e2dnode.h"
|
||||||
|
|
||||||
|
typedef std::pair<UINT, UINT> HashPair;
|
||||||
|
|
||||||
e2d::Node * e2d::Collision::__activeNode = nullptr;
|
e2d::Node * e2d::Collision::__activeNode = nullptr;
|
||||||
e2d::Node * e2d::Collision::__passiveNode = nullptr;
|
e2d::Node * e2d::Collision::__passiveNode = nullptr;
|
||||||
|
static std::set<HashPair> __collisionList;
|
||||||
|
|
||||||
|
|
||||||
|
void e2d::Collision::addName(const String & name1, const String & name2)
|
||||||
|
{
|
||||||
|
if (!name1.isEmpty() && !name2.isEmpty())
|
||||||
|
{
|
||||||
|
__collisionList.insert(HashPair(name1.getHashCode(), name2.getHashCode()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::Collision::addName(const std::vector<std::pair<String, String> >& names)
|
||||||
|
{
|
||||||
|
for (auto& name : names)
|
||||||
|
{
|
||||||
|
if (!name.first.isEmpty() && !name.second.isEmpty())
|
||||||
|
{
|
||||||
|
__collisionList.insert(HashPair(name.first.getHashCode(), name.second.getHashCode()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool e2d::Collision::isCollidable(Node * node1, Node * node2)
|
||||||
|
{
|
||||||
|
return Collision::isCollidable(node1->getName(), node2->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool e2d::Collision::isCollidable(const String & name1, const String & name2)
|
||||||
|
{
|
||||||
|
UINT hashName1 = name1.getHashCode(), hashName2 = name2.getHashCode();
|
||||||
|
HashPair pair1 = HashPair(hashName1, hashName2), pair2 = HashPair(hashName2, hashName1);
|
||||||
|
for (auto& pair : __collisionList)
|
||||||
|
{
|
||||||
|
if (pair == pair1 || pair == pair2)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
e2d::Node * e2d::Collision::getActiveNode()
|
e2d::Node * e2d::Collision::getActiveNode()
|
||||||
{
|
{
|
||||||
return __activeNode;
|
return __activeNode;
|
||||||
|
|
|
||||||
|
|
@ -43,16 +43,10 @@ void e2d::ActionManager::__add(Action * action)
|
||||||
|
|
||||||
void e2d::ActionManager::__remove(Action * action)
|
void e2d::ActionManager::__remove(Action * action)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < s_vActions.size();)
|
auto iter = std::find(s_vActions.begin(), s_vActions.end(), action);
|
||||||
|
if (iter != s_vActions.end())
|
||||||
{
|
{
|
||||||
if (s_vActions[i] == action)
|
s_vActions.erase(iter);
|
||||||
{
|
|
||||||
s_vActions.erase(s_vActions.begin() + i);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -105,17 +99,8 @@ void e2d::ActionManager::start(Action * action, Node * target, bool paused)
|
||||||
|
|
||||||
if (action && target)
|
if (action && target)
|
||||||
{
|
{
|
||||||
ASSERT([](Action * newAction)
|
auto iter = std::find(s_vRunningActions.begin(), s_vRunningActions.end(), action);
|
||||||
{
|
ASSERT(iter == s_vRunningActions.end(), "Action has begun!");
|
||||||
for (const auto& action : s_vRunningActions)
|
|
||||||
{
|
|
||||||
if (newAction == action)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}(action), "action already be added!");
|
|
||||||
|
|
||||||
action->_startWithTarget(target);
|
action->_startWithTarget(target);
|
||||||
action->retain();
|
action->retain();
|
||||||
|
|
|
||||||
|
|
@ -81,16 +81,6 @@ void e2d::ColliderManager::__updateCollider(e2d::Collider * pActiveCollider)
|
||||||
Node* pActiveNode = pActiveCollider->_parentNode;
|
Node* pActiveNode = pActiveCollider->_parentNode;
|
||||||
if (pActiveNode)
|
if (pActiveNode)
|
||||||
{
|
{
|
||||||
// 判断两物体是否是相互冲突的物体
|
|
||||||
auto IsCollideWith = [](Node * active, Node * passive) -> bool
|
|
||||||
{
|
|
||||||
unsigned int hash = passive->getHashName();
|
|
||||||
for (auto collider : active->_colliders)
|
|
||||||
if (collider == hash)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 获取节点所在场景
|
// 获取节点所在场景
|
||||||
Scene* pCurrentScene = pActiveNode->getParentScene();
|
Scene* pCurrentScene = pActiveNode->getParentScene();
|
||||||
|
|
||||||
|
|
@ -108,7 +98,8 @@ void e2d::ColliderManager::__updateCollider(e2d::Collider * pActiveCollider)
|
||||||
if (pPassiveNode &&
|
if (pPassiveNode &&
|
||||||
pPassiveNode->getParentScene() == pCurrentScene)
|
pPassiveNode->getParentScene() == pCurrentScene)
|
||||||
{
|
{
|
||||||
if (IsCollideWith(pActiveNode, pPassiveNode))
|
// 判断两物体是否是相互冲突的物体
|
||||||
|
if (Collision::isCollidable(pActiveNode, pPassiveNode))
|
||||||
{
|
{
|
||||||
// 判断两碰撞体交集情况
|
// 判断两碰撞体交集情况
|
||||||
Collider::Relation relation = pActiveCollider->getRelationWith(pPassiveCollider);
|
Collider::Relation relation = pActiveCollider->getRelationWith(pPassiveCollider);
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
// ĬÈÏÖÐÐĵãλÖÃ
|
// ĬÈÏÖÐÐĵãλÖÃ
|
||||||
static float s_fDefaultPiovtX = 0;
|
static float s_fDefaultPiovtX = 0;
|
||||||
static float s_fDefaultPiovtY = 0;
|
static float s_fDefaultPiovtY = 0;
|
||||||
static bool s_fDefaultColliderEnabled = true;
|
static bool s_fDefaultColliderEnabled = false;
|
||||||
|
|
||||||
e2d::Node::Node()
|
e2d::Node::Node()
|
||||||
: _nOrder(0)
|
: _nOrder(0)
|
||||||
|
|
@ -584,36 +584,18 @@ void e2d::Node::setCollider(Collider * pCollider)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Node::addColliableName(const String& collliderName)
|
|
||||||
{
|
|
||||||
unsigned int hash = collliderName.getHashCode();
|
|
||||||
_colliders.insert(hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Node::addColliableName(const std::vector<String>& colliderNames)
|
|
||||||
{
|
|
||||||
for (const auto &name : colliderNames)
|
|
||||||
{
|
|
||||||
this->addColliableName(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Node::removeColliableName(const String& collliderName)
|
|
||||||
{
|
|
||||||
unsigned int hash = collliderName.getHashCode();
|
|
||||||
_colliders.erase(hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Node::addChild(Node * child, int order /* = 0 */)
|
void e2d::Node::addChild(Node * child, int order /* = 0 */)
|
||||||
{
|
{
|
||||||
WARN_IF(child == nullptr, "Node::addChild NULL pointer exception.");
|
WARN_IF(child == nullptr, "Node::addChild NULL pointer exception.");
|
||||||
|
|
||||||
if (child)
|
if (child)
|
||||||
{
|
{
|
||||||
|
// TODO: 抛出一个异常
|
||||||
ASSERT(child->_parent == nullptr, "Node already added. It can't be added again!");
|
ASSERT(child->_parent == nullptr, "Node already added. It can't be added again!");
|
||||||
|
|
||||||
for (Node * parent = this; parent != nullptr; parent = parent->getParent())
|
for (Node * parent = this; parent != nullptr; parent = parent->getParent())
|
||||||
{
|
{
|
||||||
|
// TODO: 抛出一个异常
|
||||||
ASSERT(child != parent, "A Node cannot be the child of his own children!");
|
ASSERT(child != parent, "A Node cannot be the child of his own children!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -717,12 +699,10 @@ bool e2d::Node::removeChild(Node * child)
|
||||||
|
|
||||||
if (child)
|
if (child)
|
||||||
{
|
{
|
||||||
size_t size = _children.size();
|
auto iter = std::find(_children.begin(), _children.end(), child);
|
||||||
for (size_t i = 0; i < size; ++i)
|
if (iter != _children.end())
|
||||||
{
|
{
|
||||||
if (_children[i] == child)
|
_children.erase(iter);
|
||||||
{
|
|
||||||
_children.erase(_children.begin() + i);
|
|
||||||
child->_parent = nullptr;
|
child->_parent = nullptr;
|
||||||
|
|
||||||
if (child->_parentScene)
|
if (child->_parentScene)
|
||||||
|
|
@ -734,7 +714,6 @@ bool e2d::Node::removeChild(Node * child)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -793,7 +772,7 @@ void e2d::Node::runAction(Action * action)
|
||||||
|
|
||||||
void e2d::Node::resumeAction(const String& strActionName)
|
void e2d::Node::resumeAction(const String& strActionName)
|
||||||
{
|
{
|
||||||
auto actions = ActionManager::get(strActionName);
|
auto& actions = ActionManager::get(strActionName);
|
||||||
for (auto action : actions)
|
for (auto action : actions)
|
||||||
{
|
{
|
||||||
if (action->getTarget() == this)
|
if (action->getTarget() == this)
|
||||||
|
|
@ -805,7 +784,7 @@ void e2d::Node::resumeAction(const String& strActionName)
|
||||||
|
|
||||||
void e2d::Node::pauseAction(const String& strActionName)
|
void e2d::Node::pauseAction(const String& strActionName)
|
||||||
{
|
{
|
||||||
auto actions = ActionManager::get(strActionName);
|
auto& actions = ActionManager::get(strActionName);
|
||||||
for (auto action : actions)
|
for (auto action : actions)
|
||||||
{
|
{
|
||||||
if (action->getTarget() == this)
|
if (action->getTarget() == this)
|
||||||
|
|
@ -817,7 +796,7 @@ void e2d::Node::pauseAction(const String& strActionName)
|
||||||
|
|
||||||
void e2d::Node::stopAction(const String& strActionName)
|
void e2d::Node::stopAction(const String& strActionName)
|
||||||
{
|
{
|
||||||
auto actions = ActionManager::get(strActionName);
|
auto& actions = ActionManager::get(strActionName);
|
||||||
for (auto action : actions)
|
for (auto action : actions)
|
||||||
{
|
{
|
||||||
if (action->getTarget() == this)
|
if (action->getTarget() == this)
|
||||||
|
|
@ -829,7 +808,7 @@ void e2d::Node::stopAction(const String& strActionName)
|
||||||
|
|
||||||
e2d::Action * e2d::Node::getAction(const String& strActionName)
|
e2d::Action * e2d::Node::getAction(const String& strActionName)
|
||||||
{
|
{
|
||||||
auto actions = ActionManager::get(strActionName);
|
auto& actions = ActionManager::get(strActionName);
|
||||||
for (auto action : actions)
|
for (auto action : actions)
|
||||||
{
|
{
|
||||||
if (action->getTarget() == this)
|
if (action->getTarget() == this)
|
||||||
|
|
@ -840,24 +819,6 @@ e2d::Action * e2d::Node::getAction(const String& strActionName)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<e2d::Action*> e2d::Node::getActions(const String& strActionName)
|
|
||||||
{
|
|
||||||
std::vector<Action*>::iterator iter;
|
|
||||||
auto actions = ActionManager::get(strActionName);
|
|
||||||
for (iter = actions.begin(); iter != actions.end();)
|
|
||||||
{
|
|
||||||
if ((*iter)->getTarget() != this)
|
|
||||||
{
|
|
||||||
iter = actions.erase(iter);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
++iter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return std::move(actions);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool e2d::Node::isPointIn(Point point) const
|
bool e2d::Node::isPointIn(Point point) const
|
||||||
{
|
{
|
||||||
BOOL ret = 0;
|
BOOL ret = 0;
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,7 @@ public:
|
||||||
// 弹出提示窗口
|
// 弹出提示窗口
|
||||||
static void info(
|
static void info(
|
||||||
const String& text, /* 内容 */
|
const String& text, /* 内容 */
|
||||||
const String& title = L"Prompt" /* ´°¿Ú±êÌâ */
|
const String& title = L"Infomation" /* ´°¿Ú±êÌâ */
|
||||||
);
|
);
|
||||||
|
|
||||||
// 弹出警告窗口
|
// 弹出警告窗口
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,29 @@ class Collision
|
||||||
friend ColliderManager;
|
friend ColliderManager;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
// 添加可互相碰撞物体的名称
|
||||||
|
static void addName(
|
||||||
|
const String& name1,
|
||||||
|
const String& name2
|
||||||
|
);
|
||||||
|
|
||||||
|
// 添加可互相碰撞物体的名称
|
||||||
|
static void addName(
|
||||||
|
const std::vector<std::pair<String, String> >& names
|
||||||
|
);
|
||||||
|
|
||||||
|
// 判断两个物体是否是可碰撞的
|
||||||
|
static bool isCollidable(
|
||||||
|
Node * node1,
|
||||||
|
Node * node2
|
||||||
|
);
|
||||||
|
|
||||||
|
// 判断两个物体是否是可碰撞的
|
||||||
|
static bool isCollidable(
|
||||||
|
const String& name1,
|
||||||
|
const String& name2
|
||||||
|
);
|
||||||
|
|
||||||
// 获取碰撞发生时的主动体
|
// 获取碰撞发生时的主动体
|
||||||
static Node * getActiveNode();
|
static Node * getActiveNode();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -344,21 +344,6 @@ public:
|
||||||
Collider * pCollider
|
Collider * pCollider
|
||||||
);
|
);
|
||||||
|
|
||||||
// 添加可碰撞节点的名称
|
|
||||||
virtual void addColliableName(
|
|
||||||
const String& collliderName
|
|
||||||
);
|
|
||||||
|
|
||||||
// 添加多个可碰撞节点的名称
|
|
||||||
virtual void addColliableName(
|
|
||||||
const std::vector<String>& colliderNames /* 名称数组 */
|
|
||||||
);
|
|
||||||
|
|
||||||
// 移除可碰撞节点的名称
|
|
||||||
virtual void removeColliableName(
|
|
||||||
const String& collliderName
|
|
||||||
);
|
|
||||||
|
|
||||||
// 添加子节点
|
// 添加子节点
|
||||||
virtual void addChild(
|
virtual void addChild(
|
||||||
Node * child,
|
Node * child,
|
||||||
|
|
@ -391,16 +376,11 @@ public:
|
||||||
const String& strActionName
|
const String& strActionName
|
||||||
);
|
);
|
||||||
|
|
||||||
// 获取名称相同的动作
|
// 获取动作
|
||||||
virtual Action * getAction(
|
virtual Action * getAction(
|
||||||
const String& strActionName
|
const String& strActionName
|
||||||
);
|
);
|
||||||
|
|
||||||
// 获取所有名称相同的动作
|
|
||||||
virtual std::vector<Action*> getActions(
|
|
||||||
const String& strActionName
|
|
||||||
);
|
|
||||||
|
|
||||||
// 继续所有暂停动作
|
// 继续所有暂停动作
|
||||||
virtual void resumeAllActions();
|
virtual void resumeAllActions();
|
||||||
|
|
||||||
|
|
@ -416,7 +396,7 @@ public:
|
||||||
double defaultPiovtY
|
double defaultPiovtY
|
||||||
);
|
);
|
||||||
|
|
||||||
// 设置节点是否包含默认碰撞体(默认打开)
|
// 设置节点是否包含默认碰撞体(默认关闭)
|
||||||
static void setDefaultColliderEnable(
|
static void setDefaultColliderEnable(
|
||||||
bool enable
|
bool enable
|
||||||
);
|
);
|
||||||
|
|
@ -478,7 +458,6 @@ protected:
|
||||||
Node * _parent;
|
Node * _parent;
|
||||||
D2D1::Matrix3x2F _initialMatri;
|
D2D1::Matrix3x2F _initialMatri;
|
||||||
D2D1::Matrix3x2F _finalMatri;
|
D2D1::Matrix3x2F _finalMatri;
|
||||||
std::set<unsigned int> _colliders;
|
|
||||||
std::vector<Node*> _children;
|
std::vector<Node*> _children;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue