cocos2dx之渲染树的绘制

来源:互联网 发布:java流程控制 编辑:程序博客网 时间:2024/05/22 12:27

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


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


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

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CCDirector::calculateDeltaTime(void)  
  2. {  
  3.     struct cc_timeval now;  
  4.   
  5.     if (CCTime::gettimeofdayCocos2d(&now, NULL) != 0)  
  6.     {  
  7.         CCLOG("error in gettimeofday");  
  8.         m_fDeltaTime = 0;  
  9.         return;  
  10.     }  
  11.   
  12.     // new delta time. Re-fixed issue #1277  
  13.     if (m_bNextDeltaTimeZero)  
  14.     {  
  15.         m_fDeltaTime = 0;  
  16.         m_bNextDeltaTimeZero = false;  
  17.     }  
  18.     else  
  19.     {  
  20.         m_fDeltaTime = (now.tv_sec - m_pLastUpdate->tv_sec) + (now.tv_usec - m_pLastUpdate->tv_usec) / 1000000.0f;  
  21.         m_fDeltaTime = MAX(0, m_fDeltaTime);  
  22.     }  
  23.   
  24. #ifdef DEBUG  
  25.     // If we are debugging our code, prevent big delta time  
  26.     if(m_fDeltaTime > 0.2f)  
  27.     {  
  28.         m_fDeltaTime = 1 / 60.0f;  
  29.     }  
  30. #endif  
  31.   
  32.     *m_pLastUpdate = now;  
  33. }  

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

原创粉丝点击