2017-09-10 23:56:52 +08:00
|
|
|
|
#include "easy2d.h"
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
|
|
|
|
Scene::Scene()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Scene::~Scene()
|
|
|
|
|
|
{
|
|
|
|
|
|
clearAllChildren();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Scene::_exec()
|
|
|
|
|
|
{
|
|
|
|
|
|
// active <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ȡ<EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|
|
|
|
|
bool active = true;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ִ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƵĽڵ㣨<DAB5><E3A3A8>λ<EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD><C8B1><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
for (int i = int(m_vChildren.size()) - 1; i >= 0; i--)
|
|
|
|
|
|
{
|
|
|
|
|
|
assert(m_vChildren[i]);
|
|
|
|
|
|
if (m_vChildren[i]->_exec(active)) // ִ<>нڵ<D0BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
active = false; // <20><><EFBFBD>ӽڵ<D3BD>ȡ<EFBFBD>ý<EFBFBD><C3BD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD>־<EFBFBD><D6BE> false
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Scene::_onDraw()
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>нڵ<D0BD>
|
|
|
|
|
|
for (auto child : m_vChildren)
|
|
|
|
|
|
{
|
|
|
|
|
|
assert(child);
|
|
|
|
|
|
child->_onDraw();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-18 23:59:08 +08:00
|
|
|
|
void Scene::onEnter()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Scene::onExit()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-10 23:56:52 +08:00
|
|
|
|
void Scene::add(Node * child, int zOrder)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵĽڵ<C4BD><DAB5>ǿ<EFBFBD>
|
|
|
|
|
|
assert(child);
|
|
|
|
|
|
// <20><><EFBFBD>ýڵ<C3BD><DAB5>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
child->setParentScene(this);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> z <20><>˳<EFBFBD><CBB3>
|
|
|
|
|
|
child->setZOrder(zOrder);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
|
|
|
|
|
|
child->retain();
|
|
|
|
|
|
|
|
|
|
|
|
// <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)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vChildren.push_back(child);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
auto temp = m_vChildren.at(i);
|
|
|
|
|
|
if (temp->getZOrder() > zOrder)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vChildren.insert(m_vChildren.begin() + i, child);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool Scene::del(Node * child)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>Խڵ<D4BD><DAB5>ǿ<EFBFBD>
|
|
|
|
|
|
assert(child);
|
|
|
|
|
|
|
|
|
|
|
|
// Ѱ<><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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// δ<>ҵ<EFBFBD><D2B5>ýڵ㷵<DAB5><E3B7B5> false
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Scene::clearAllChildren()
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>нڵ<D0BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
|
|
|
|
|
|
for (auto child : m_vChildren)
|
|
|
|
|
|
{
|
|
|
|
|
|
child->release();
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
m_vChildren.clear();
|
|
|
|
|
|
}
|