01--从根源种子CCNode说起
CCNode作为渲染框架的基类(暂且这样理解,CCObject为引擎基类)其中定义了绘制游戏元素相关的属性以及相关方法。属性当中需要注意的一个是Z坐标,在渲染框架中用来表示元素的遮挡关系,其值越小越容易被遮挡。而在元素的操作方面提供三类方法:对节点的操作、定时器的使用、执行动作。
1)节点的操作
引擎将游戏元素组织成树的结构,这也是CCNode命名中Node的来源。对树的操作无非就是添加节点、移除节点等等,但我们也要看到节点操作中引起的其他操作。如在运行状态(何为运行状态,在执行动作?执行定时器的回调函数?自己先mark一下)的节点添加子节点调用onEnter(进入场景)和onEnterTransitionDidFinsh(场景转换完成)函数。另外在移除节点函数中有一个bool类型的参数cleanup,书中将其理解为“清除”。初看也不甚明白,还是看看代码吧:
void CCNode::removeChild(CCNode* child, bool cleanup)
{
// explicit nil handling
if (m_pChildren == NULL)
{
return;
} if ( m_pChildren->containsObject(child) )
{
this->detachChild(child,cleanup);
}
} void CCNode::detachChild(CCNode *child, bool doCleanup)
{
// IMPORTANT:
// -1st do onExit
// -2nd cleanup
if (m_bIsRunning)
{
child->onExitTransitionDidStart();
child->onExit();
} // If you don't do cleanup, the child's actions will not get removed and the
// its scheduledSelectors_ dict will not get released!
if (doCleanup)
{
child->cleanup();
} // set parent nil at the end
child->setParent(NULL); m_pChildren->removeObject(child);
}
void CCNode::cleanup()
{
// actions
this->stopAllActions();
this->unscheduleAllSelectors(); if ( m_eScriptType != kScriptTypeNone)
{
CCScriptEngineManager::sharedManager()->getScriptEngine()->executeNodeEvent(this, kCCNodeOnCleanup);
} // timers
arrayMakeObjectsPerformSelector(m_pChildren, cleanup, CCNode*);
}// 上面代码已经相当明白就是停止当前节点所有动作和定时器,释放相关资源
函数removeAllChildrenWithCleanup用于清除当前节点的所有的子节点并停止动作和计时器。看到这个函数让我明白书中对节点操作中使用“移除”一词而没有使用“删除”,其实上面 代码也有体现。移除仅仅将节点从树结构中摘下,但该节点任然在存在于内存中,以后我们还可以使用。我想这也是cleanup参数存在的原因之一。
2)CCNode中的定时器
根源种子包含一个默认的定时器,定时器采用循环执行的方式。这点就像winForm中的Timer控件,知道我们发出停止的命令要不就一直循环。定时器的操作主要包含启动、取消、暂停与恢复,从函数名称已经能理解他的功能和作用。但还是有一个 参数值得记录一下:int类型的priority用于表示定时器执行的优先级,其值越小表示优先权越高。默认的定时器其值为0表示最高优先权,将在每次引擎循环周期(??)中调用。
动作执行和场景转换前面还讲得比较少就先不记录了,最后还是上一张CCNode子类图:
CCNode几个重要的子类,从左向右依次场景、图层、菜单、精灵和粒子系统类。
最新文章
- cron 定时器简单入门
- P 1080 Human Gene Functions
- sticky组件的改进实现
- HighCharts学习笔记(一)HighCharts入门
- thinkphp 联表查询,排序
- Dell vsotro 14 3000系列从win10重装win7
- 9 I/O复用
- border-radius几种写法的原理剖析
- Android 框架简介--Java环境(转)
- async await 异步编程杂记
- Oracle10g、 Oracle11g完美共存
- JavaScript设计模式之命令模式
- C# Html网页生成图片解决方案1
- Visual Studio/vs2013 正忙
- AFNetworiking与ASIHttpRequest对比
- ES6 字符串的扩展
- VxWorks各部分初始化流程
- Window 无法完成请求的更改,找不到引用的汇编,错误代码 0X80073701
- js模块化规范—AMD规范
- 万物互联之~RPC专栏
热门文章
- dede分页
- CSAPP--虚拟存储器
- sql语句读取所有父子标签
- AMS1117典型电路
- baike并行计算概念
- QA笑话----杂思
- 用Update Select批量更新某一字段的值[可以跨库]
- 浅谈c语言中的堆
- Android Studio:Error:Execution failed for task ':app:mergeDebugResources'. >; Some file crunching failed, see logs for details
- JavaScript闭包函数的写法