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几个重要的子类,从左向右依次场景、图层、菜单、精灵和粒子系统类。

  • 相关阅读:
    Qt快速入门学习笔记(基础篇)
    IDEA 创建文件夹总默认根节点问题解决
    SpringBoot 集成MyBatis 中的@MapperScan注解
    Springboot项目下mybatis报错:Invalid bound statement (not found)
    IDEA maven项目查自动查看依赖关系,解决包冲突问题
    Mybatis-generator/通用Mapper/Mybatis-Plus对比
    Mybatis
    在一个已经使用mybatis的项目里引入mybatis-plus,结果不能共存
    springboot整合图像数据库Neo4j
    Spring Boot:Boot2.0版本整合Neo4j
  • 原文地址:https://www.cnblogs.com/BlueBeauty/p/3679415.html
Copyright © 2011-2022 走看看