zoukankan      html  css  js  c++  java
  • 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子类图:

                                                                               image

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

  • 相关阅读:
    poj 3280 Cheapest Palindrome(区间DP)
    POJ 2392 Space Elevator(多重背包)
    HDU 1285 定比赛名次(拓扑排序)
    HDU 2680 Choose the best route(最短路)
    hdu 2899 Strange fuction (三分)
    HDU 4540 威威猫系列故事――打地鼠(DP)
    HDU 3485 Count 101(递推)
    POJ 1315 Don't Get Rooked(dfs)
    脱离eclipse,手动写一个servlet
    解析xml,几种方式
  • 原文地址:https://www.cnblogs.com/BlueBeauty/p/3679415.html
Copyright © 2011-2022 走看看