120 lines
2.1 KiB
C++
120 lines
2.1 KiB
C++
#include "..\easy2d.h"
|
|
#include <assert.h>
|
|
|
|
Scene::Scene()
|
|
{
|
|
}
|
|
|
|
Scene::~Scene()
|
|
{
|
|
clearAllChildren();
|
|
}
|
|
|
|
void Scene::_exec()
|
|
{
|
|
// active 标志画面是否取得焦点
|
|
bool active = true;
|
|
// 逆序执行,最后绘制的节点(即位于画面最上方)最先被访问
|
|
for (int i = int(m_vChildren.size()) - 1; i >= 0; i--)
|
|
{
|
|
assert(m_vChildren[i]);
|
|
if (m_vChildren[i]->_exec(active)) // 执行节点程序
|
|
{
|
|
active = false; // 若子节点取得焦点,将标志置 false
|
|
}
|
|
}
|
|
}
|
|
|
|
void Scene::_onDraw()
|
|
{
|
|
// 绘制所有节点
|
|
for (auto child : m_vChildren)
|
|
{
|
|
assert(child);
|
|
child->_onDraw();
|
|
}
|
|
}
|
|
|
|
void Scene::onEnter()
|
|
{
|
|
// 将定时器与当前场景绑定
|
|
Timer::bindTimersWithScene(this);
|
|
MouseMsg::bindListenersWithScene(this);
|
|
KeyMsg::bindListenersWithScene(this);
|
|
ActionManager::bindActionsWithScene(this);
|
|
}
|
|
|
|
void Scene::onExit()
|
|
{
|
|
// 停止当前场景上运行的所有定时器
|
|
Timer::stopAllSceneTimers(this);
|
|
MouseMsg::clearAllSceneListeners(this);
|
|
KeyMsg::clearAllSceneListeners(this);
|
|
ActionManager::stopAllSceneActions(this);
|
|
}
|
|
|
|
void Scene::add(Node * child, int zOrder)
|
|
{
|
|
// 断言添加的节点非空
|
|
assert(child);
|
|
// 设置节点的父场景
|
|
child->setParentScene(this);
|
|
// 设置 z 轴顺序
|
|
child->setZOrder(zOrder);
|
|
// 对象的引用计数加一
|
|
child->retain();
|
|
|
|
// 按 z 轴顺序插入节点
|
|
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)
|
|
{
|
|
if (child == nullptr) return false;
|
|
|
|
// 寻找是否有相同节点
|
|
std::vector<Node*>::iterator iter;
|
|
for (iter = m_vChildren.begin(); iter != m_vChildren.end(); iter++)
|
|
{
|
|
// 找到相同节点
|
|
if (*iter == child)
|
|
{
|
|
// 对象的引用计数减一
|
|
(*iter)->release();
|
|
// 去掉该节点
|
|
m_vChildren.erase(iter);
|
|
return true;
|
|
}
|
|
}
|
|
// 未找到该节点返回 false
|
|
return false;
|
|
}
|
|
|
|
void Scene::clearAllChildren()
|
|
{
|
|
// 所有节点的引用计数减一
|
|
for (auto child : m_vChildren)
|
|
{
|
|
child->autoRelease();
|
|
child->release();
|
|
}
|
|
// 清空储存节点的容器
|
|
m_vChildren.clear();
|
|
} |