深秋

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

        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子类图:

                                                                           image

CCNode几个重要的子类,从左向右依次场景、图层、菜单、精灵和粒子系统类。

posted on 2014-04-21 22:50  深秋  阅读(412)  评论(0编辑  收藏  举报