1. 程式人生 > >cocos2d-x的渲染樹和CCNode類

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)元件相關。

相關推薦

cocos2d-x渲染CCNode

在之前的文章中提到,cocos2d-x的主迴圈會在每幀重新整理頁面,而這個繪製就是以遞迴的方式對這個渲染樹進行渲染。// Draw the Scene void CCDirector::drawScene(void) { ... //繪製渲染場景

cocos2d-x 關於旋轉移動的一點小技巧

小白 get posit seq sso 解釋 pre create ron 你犯困嗎,恩。給你講個笑話提提神~ 一對情侶去從林遊玩。被食人族捉住。食人族首領心情非常好。說你們假設想活命,就吃掉對方的大便。在他們回來的路上。女人終於忍不住停下。坐到石頭上哭起來。男人

【瀏覽器渲染原理】 渲染頁面渲染

display 順序 情況下 有一個 所有 覆蓋 isp ID span 來自:https://blog.csdn.net/qq243541844/article/details/51922947 【瀏覽器渲染原理】 渲染樹和頁面渲染 我們主要討論以下列出的幾個問題: 什

cocos2d-x getVisibleSize , getVisibleOrigin 坐標位置

opengl es log DC detail callback reat origin 控件 instance getWinSize : 獲取設備屏幕大小. getVisibleSize:獲得視口(可視區域)的大小,若是DesignResolutionSize跟屏幕尺寸一

Cocos2d-x 渲染器Renderer與6種RenderCommand詳解

Cocos2d-x 渲染器Renderer 宣告:本文使用的是cocos2d-x-3.17的程式碼 在《Cocos場景遍歷與渲染》中已講解了Cocos2d 在渲染時會先遍歷場景,遍歷時會生成渲染命令,渲染器再處理渲染命令繪製出圖形。這篇文章主要是講解渲染器如何處理

cocos2d-x渲染框架

渲染框架 包括 CCDirector CCScene CCLayer CCSprinte 四類 CCDirector 核心類 導演與場景有關的函式  // Scene Management     /** Enters the Director's main loop w

Cocos2d-x Sprite 執行 CCFade~ 這透明度變化動作的一些有關問題

Cocos2d-x Sprite 執行 CCFade~ 這類透明度變化動作的一些問題 在引擎中提供了幾個有關透明度變化的動作:CCFadeIn,CCFadeOut,CCFadeTo CCFadeIn:the opacity from 0 to 255 CCFadeO

Cocos2d-x 專案新建自定義後編譯錯誤:打不開自定義標頭檔案錯誤解決方案

現在Cocos2dx新建工程需要執行Python指令碼來建立,不再提供Cocos2dx模板。一般我們使用VS2010編譯完Cocos2dx後,可以開始使用Cocos2dx目錄下\tools\project-creator\create_project.py來建立工程。 命

cocos2d-x 3.4 之 三消遊戲——萬聖大作戰(附加篇)

***************************************轉載請註明出處:http://blog.csdn.net/lttree******************************************** 三消遊戲——萬聖大作戰,應該是

Cocos2d-x 的onEnter() onEnterTransitionDidFinish() 場景延時跳轉

onEnter()   是在進入場景的一瞬間就開始執行了。 onEnterTransitionDidFinish() 是在完全進入場景後開始執行的。 因為在弄場景的延時跳轉,遊戲一開始顯示公司Logo,然後顯示遊戲場景介面。 在第一個場景welcomScene的

cocos2d-x的場景生命週期

在上一篇的文章已經通過程式碼分析了場景的跳轉是在主迴圈中setNextScene進行呼叫的,那麼在跳轉時便會開始呼叫生命週期函式。主要由以下四個函式組成 onEnter、onEnterTransitionDidFinish、onExitTransitionDidStart、

Cocos2D-x權威指南: CCNode方法:

5.1.4 繪圖節點CCNode和圖層CCLayer CCNode中提供的方法,在public塊中的方法主要有以下幾個部分: 1、針對節點顯示的屬性資訊讀寫 2、針對節點變換的屬性資訊讀寫 3、針對子節點的管理相關方法 4、針對節點資料繫結的相關方法 5、針對節點生命週期的

【複習筆記】 cocos2d-x 2.x 渲染特效實現 五 節點的模糊效果

到目前為止,我們實現的模糊都是在單張貼圖上的,只是針對當前這一張貼圖對其模糊,因而當圖片中的內容就在圖片邊緣的時候,其模糊在圖片邊緣是被“截斷”的,因此,我們需要一個比原貼圖大,但又包含原本顏色資訊的圖來做模糊。另外,有時候我們需要的模糊並不只是在一張貼圖上,可能當某個單位

Cocos2d-x 影象渲染動畫——序列幀動畫

建立方法 手動新增序列幀到Animation類 在建立Animation例項時會用到以下幾個介面: addSpriteFrame,新增精靈幀到Animation例項 setDelayUnits,設定每一幀持續時間,以秒為單位 setRestoreOr

Cocos2d-x遊戲開發之lua編輯器 Sublime 搭建,集成cocos2dLuaApi自有

系統 下一個 下載 tail mil 命令 term 小寫 一次 版權聲明:本文為博主原創文章。未經博主同意不得轉載。 https://blog.csdn.net/wisdom605768

關於cocos2d-x 安卓之間的相互調用

using with font android bject deb 交流 sta log 近期在研究cocos2d遊戲移植安卓須要調用非常多方法。所以在研究之中寫下它們之間相互調用 首先,cocos2d調用安卓 在一個.h文件裏加入頭文件 #include &l

寶爺Debug小記——Cocos2d-x(3.13之前的版本)底層BUG導致Spine渲染花屏

lec point ror 排除 再看 加載 莫名奇妙 city .cn 最近在工作中碰到不少棘手的BUG,其中的一個是Spine骨骼的渲染花屏,在戰鬥中派發出大量士兵之後有概率出現花屏閃爍(如下圖所示),這種莫名奇妙且難以重現的BUG最為蛋疼。 前段時間為了提

cocos2d-x CCScrollViewCCTableView的使用

滾動視圖 ddl position 手勢滑動 mar efi rgb process soft 在遊戲和應用中常常要實現左右滑動展示遊戲幫助、以列表顯示內容的UI效果,就像android中的Gallery和ListView。本文通過CCScrollView和CCTab

cocos2d-x-3.3rc2-003 cocos中的引用計數自己主動釋放池

all post clas popu https -o git 打開鏈接 自己 點擊打開鏈接 cocos2d-x-3.3rc2-003 cocos中的引用計數和自己主動釋放池

Cocos2d-x】坐標系圖層

pac 多說 pan art world 地圖 分辨 play instance 在Cocos2D-X中,存在四種坐標系: 1、OpenGL坐標系:該坐標系原點在屏幕左下角。x軸向右,y軸向上。這也就是cocos2dx中用到的坐標系所以沒啥好說的。 2、屏幕坐標系(UI