Magic_Game/Easy2D/Node/BatchNode.cpp

191 lines
2.9 KiB
C++
Raw Normal View History

2017-09-10 23:56:52 +08:00
#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
BatchNode::BatchNode()
{
}
BatchNode::~BatchNode()
{
clearAllChildren();
}
bool BatchNode::_exec(bool active)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ
if (!m_bDisplay)
{
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
for (int i = int(m_vChildren.size() - 1); i >= 0; i--)
{
if (m_vChildren[i]->_exec(active))
{
active = false;
}
}
// <20><><EFBFBD>ӽڵ<D3BD>ȡ<EFBFBD><C8A1><EFBFBD>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><E3A3AC><EFBFBD>ýڵ<C3BD>Ҳȡ<D2B2><C8A1><EFBFBD>˽<EFBFBD><CBBD><EFBFBD>
return !active;
}
void BatchNode::_onDraw()
{
// <20>ڵ<EFBFBD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ
if (!m_bDisplay)
{
return;
}
for (auto child : m_vChildren)
{
2017-10-09 01:16:08 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
2017-09-10 23:56:52 +08:00
child->_onDraw();
}
}
void BatchNode::add(Node * child, int z_Order)
{
2017-09-27 17:56:28 +08:00
if (child == nullptr) return;
2017-09-10 23:56:52 +08:00
// <20><><EFBFBD>ýڵ<C3BD><DAB5>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>
child->setParentScene(this->getParentScene());
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>е<EFBFBD> z <20><>˳<EFBFBD><CBB3>
child->setZOrder(z_Order);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
child->retain();
2017-10-09 10:26:36 +08:00
// <20>޸<EFBFBD><DEB8>ӽڵ<D3BD>λ<EFBFBD><CEBB>
child->move(getPos());
2017-09-10 23:56:52 +08:00
// <20><> z <20><>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
size_t size = m_vChildren.size();
for (unsigned i = 0; i <= size; i++)
{
if (i != size)
{
if (z_Order < m_vChildren.at(i)->getZOrder())
{
m_vChildren.insert(m_vChildren.begin() + i, child);
break;
}
}
else
{
m_vChildren.push_back(child);
break;
}
}
}
bool BatchNode::del(Node * child)
{
2017-09-27 17:56:28 +08:00
if (child == nullptr) return false;
2017-09-10 23:56:52 +08:00
// Ѱ<><D1B0><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ڵ<EFBFBD>
std::vector<Node*>::iterator iter;
for (iter = m_vChildren.begin(); iter != m_vChildren.end(); iter++)
{
// <20>ҵ<EFBFBD><D2B5><EFBFBD>ͬ<EFBFBD>ڵ<EFBFBD>
if ((*iter) == child)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
(*iter)->release();
// ȥ<><C8A5><EFBFBD>ýڵ<C3BD>
m_vChildren.erase(iter);
return true;
}
}
return false;
}
2017-10-09 14:35:29 +08:00
int BatchNode::getCount()
{
return (int)m_vChildren.size();
}
std::vector<Node*>& BatchNode::getChildren()
{
return m_vChildren;
}
2017-09-10 23:56:52 +08:00
void BatchNode::clearAllChildren()
{
// <20><><EFBFBD>нڵ<D0BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
for (auto child : m_vChildren)
{
child->autoRelease();
2017-09-10 23:56:52 +08:00
child->release();
}
// <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_vChildren.clear();
}
2017-10-09 10:26:36 +08:00
void BatchNode::setX(int x)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>λ<EFBFBD><CEBB>
int var = x - getX();
// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
for (auto child : m_vChildren)
{
child->move(var, 0);
}
Node::setX(x);
}
void BatchNode::setY(int y)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>λ<EFBFBD><CEBB>
int var = y - getY();
// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
for (auto child : m_vChildren)
{
child->move(0, var);
}
2017-10-09 10:42:20 +08:00
Node::setY(y);
2017-10-09 10:26:36 +08:00
}
void BatchNode::setPos(int x, int y)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>λ<EFBFBD><CEBB>
CPoint var(x - getX(), y - getY());
// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
for (auto child : m_vChildren)
{
child->move(var);
}
Node::setPos(x, y);
}
void BatchNode::setPos(CPoint p)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>λ<EFBFBD><CEBB>
CPoint var(p - getPos());
// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
for (auto child : m_vChildren)
{
child->move(var);
}
Node::setPos(p);
}
void BatchNode::move(int x, int y)
{
// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
for (auto child : m_vChildren)
{
child->move(x, y);
}
2017-10-09 10:42:20 +08:00
Node::move(x, y);
2017-10-09 10:26:36 +08:00
}
void BatchNode::move(CVector v)
{
// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
for (auto child : m_vChildren)
{
child->move(v);
}
2017-10-09 10:42:20 +08:00
Node::move(v);
2017-10-09 10:26:36 +08:00
}