cocos2dx之渲染树的绘制

来源:互联网 发布:net就业前景 知乎 编辑:程序博客网 时间:2024/05/25 20:00

无论如何复杂的游戏场景也都是精灵通过不同的层次、位置组合构成的,因此只要可以把精灵按照前后层次,在不同的位置绘制出来就完成了游戏场景的绘制。(这里仅考虑由精灵构成的简单游戏,复杂的游戏也许会包含其他游戏元素,但是原理上并不冲突。)在第3章学习游戏元素时,我们曾接触过Cocos2d-x的渲染树结构,渲染树是由各种游戏元素按照层次关系构成的树结构,它展示了Cocos2d-x游戏的绘制层次,因此游戏的渲染顺序就是由渲染树决定的。


回顾Cocos2d-x游戏的层次:导演类CCDirector直接控制渲染树的根节点--场景(CCScene),场景包含多个层(CCLayer),层中包含多个精灵(CCSprite)。实际上,每一个上述的游戏元素都在渲染树中表示为节点(CCNode),游戏元素的归属关系就转换为了节点间的归属关系,进而形成树结构。


 CCNode的visit方法实现了对一棵渲染树的绘制。为了绘制树中的一个节点,就需要绘制自己的子节点,直到没有子节点可以绘制时再结束这个过程。因此,为了每一帧都绘制一次渲染树,就需要调用渲染树的根节点。换句话说,当前场景的visit方法在每一帧都会被调用一次。这个调用是由游戏主循环完成的,Cocos2d-x的调度原理,在游戏的每一帧都会运行一次主循环,并在主循环中实现对渲染树的渲染。

void CCDirector::calculateDeltaTime(void){    struct cc_timeval now;    if (CCTime::gettimeofdayCocos2d(&now, NULL) != 0)    {        CCLOG("error in gettimeofday");        m_fDeltaTime = 0;        return;    }    // new delta time. Re-fixed issue #1277    if (m_bNextDeltaTimeZero)    {        m_fDeltaTime = 0;        m_bNextDeltaTimeZero = false;    }    else    {        m_fDeltaTime = (now.tv_sec - m_pLastUpdate->tv_sec) + (now.tv_usec - m_pLastUpdate->tv_usec) / 1000000.0f;        m_fDeltaTime = MAX(0, m_fDeltaTime);    }#ifdef DEBUG    // If we are debugging our code, prevent big delta time    if(m_fDeltaTime > 0.2f)    {        m_fDeltaTime = 1 / 60.0f;    }#endif    *m_pLastUpdate = now;}

绘制父节点时会引起子节点的绘制,同时,子节点的绘制方式与父节点的属性也有关。例如,父节点设置了放大比例,则子节点也会随之放大;父节点移动一段距离,则子节点会随之移动并保持相对位置不变。显而易见,绘制渲染树是一个递归的过程,可以研究CCNode::vist()





0 0