cocos2d-x的渲染树和CCNode类

在之前的文章中提到,cocos2d-x的主循环会在每帧刷新页面,而这个绘制就是以递归的方式对这个渲染树进行渲染。
// Draw the Scene
void CCDirector::drawScene(void)
{
    ...

    //绘制渲染场景
    if (m_pRunningScene)
    {
        m_pRunningScene->visit();
    }

    ...
}

由于cocos2d-x游戏中的内容都是附加在场景上,所以也就转换成了整个渲染就是对当前正在运行的场景进行渲染。之前的文章也说过,场景其实本质上就是一个节点(CCNode),只不过它被设置为了根节点,由导演控制,然后不断的在其上面附加内容,如层、精灵,文字等。

void CCNode::visit()
{
    // quick return if not visible. children won't be drawn.
    if (!m_bVisible)//如果节点被设置成不可见,则不绘制次节点
    {
        return;
    }
    kmGLPushMatrix();//矩阵入栈

     if (m_pGrid && m_pGrid->isActive())//是否处理Grid特效
     {
         m_pGrid->beforeDraw();
     }
     //坐标转换(在绘制时,cocos2d-x只把节点绘制在原点,但要正确的绘制在正确的坐标,旋转,缩放等,则要对其进行一系列的转换计算,而这个方法就是计算这些数据,然后才能把该节点显示在正确的地方)
    this->transform();

    CCNode* pNode = NULL;
    unsigned int i = 0;

    if(m_pChildren && m_pChildren->count() > 0)//遍历子节点,如果有的话
    {
        sortAllChildren();//按zOrder排序子节点
        // draw children zOrder < 0
        ccArray *arrayData = m_pChildren->data;
        //绘制zOrder小于0的子节点
        for( ; i < arrayData->num; i++ )
        {
            pNode = (CCNode*) arrayData->arr[i];

            if ( pNode && pNode->m_nZOrder < 0 ) 
            {
                pNode->visit();
            }
            else
            {
                break;
            }
        }
        // self draw
        //绘制自己
        this->draw();
        //绘制zOrder大于0的子节点
        for( ; i < arrayData->num; i++ )
        {
            pNode = (CCNode*) arrayData->arr[i];
            if (pNode)
            {
                pNode->visit();
            }
        }        
    }
    else
    {//没有子节点,直接绘制自己
        this->draw();
    }

    // reset for next frame
    //重置m_uOrderOfArrival(m_uOrderOfArrival用于节点的对zOrder的排序,当渲染完这一个节点后要把它还原,不然排序有问题)
    m_uOrderOfArrival = 0;
    //处理Grid特效
     if (m_pGrid && m_pGrid->isActive())
     {
         m_pGrid->afterDraw(this);
    }
     //矩阵出栈
    kmGLPopMatrix();
}

值得注意的是节点类CCNode的draw是空实现,也就是说如果想要绘制自定义的纹理,则重写它既可。
 void CCNode::draw()
 {
     //CCAssert(0);
     // override me
     // Only use- this function to draw your stuff.
     // DON'T draw your stuff outside this method
 }

由此可见,节点类在cocos2d-x中有着极其重要的作用,它让整个引擎保持着非常清晰的结构,所以它的功能也是相当的多。


从上图中可以看见CCNode衍生了很多子类,而其父类又是直接继承自与CCObject,这样引擎在管理内存便会简单很多。

CCNode的功能很多,但可以归纳如下:

1)与渲染相关的:缩放,坐标位置,旋转,渲染次序(zOrder),倾斜度,锚点,是否可见,尺寸等。

2)与节点树相关:增加子节点,删除节点,获取子节点,遍历子节点,子节点数量,设置/获取父节点等。

3)自定义存储数据。

4)事件处理。

5)动作管理。

6)定时器处理。

7)坐标转换处理。

8)组件相关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值