1. 程式人生 > >COCOS學習筆記--自定義繪製

COCOS學習筆記--自定義繪製

Cocos2dx3.0版本後渲染引入了OpenGlES3.0相關特性,使用了DrawNode類來進行繪製,那麼我們就來看看DrawNode類具體是如何繪製點線面的

我們在DrawNode.cpp中可以看到DrawNode類提供了畫點drawPoint()、畫線drawLine()、畫矩形drawRect()、畫多邊形drawPoly()、畫矩形面drawSolidRect()、畫多邊形面drawSolidPoly()等等方法。

接下來我們以drawLine()這個方法為例,看下cocos到底是如何繪製圖形的:

void DrawNode::drawLine(const Vec2 &origin, const Vec2 &destination, const Color4F &color)
{
    ensureCapacityGLLine(2);
    
    V2F_C4B_T2F *point = (V2F_C4B_T2F*)(_bufferGLLine + _bufferCountGLLine);
    
    V2F_C4B_T2F a = {origin, Color4B(color), Tex2F(0.0, 0.0)};
    V2F_C4B_T2F b = {destination, Color4B(color), Tex2F(0.0, 0.0)};
    
    *point = a;
    *(point+1) = b;
    
    _bufferCountGLLine += 2;
    _dirtyGLLine = true;
}

該方法引數為終點、起點座標、顏色值。

首先把引數傳來的值賦給了V2F_C4B_T2F型別的變數,這個V2F_C4B_T2F是什麼型別呢?我們看看:我們在ccTypes.h檔案中可以找到對V2F_C4B_T2F的定義:

struct V2F_C4B_T2F
{
    /// vertices (2F)
    Vec2       vertices;
    /// colors (4B)
    Color4B        colors;
    /// tex coords (2F)
    Tex2F          texCoords;
};

原來V2F_C4B_T2F是一個結構體,裡面點座標、顏色值還有個

Tex2F型別的成員。

回過頭來,剛剛只是把繪製資訊儲存起來,那麼drawLine具體繪製的方法在哪裡呢?

我們可以在DrawNode.cpp中找到onDrawGLLine()方法,繪製線就是在這個方法裡面進行的:

void DrawNode::onDrawGLLine(const Mat4 &transform, uint32_t flags)
{                                                                                                                                                                //得到用於儲存管理GL程式設計物件的shader著色器單例
    auto glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_LENGTH_TEXTURE_COLOR);
    //使用shader
    glProgram->use();
    //設定shader的一些內建uniform
    glProgram->setUniformsForBuiltins(transform);
    GL::blendFunc(_blendFunc.src, _blendFunc.dst);
 
    if (_dirtyGLLine)
    {	                                                                                                                                                          //繫結一個新緩衝區
        //同時把之前的一些緩衝區資料清掉
        glBindBuffer(GL_ARRAY_BUFFER, _vboGLLine);
        //去申請存放傳來資料的相關記憶體
        glBufferData(GL_ARRAY_BUFFER, sizeof(V2F_C4B_T2F)*_bufferCapacityGLLine, _bufferGLLine, GL_STREAM_DRAW);
        _dirtyGLLine = false;
}
    //根據VAO還是VBO的頂點繪製方式進行不同處理
    //在OpenGL2.0時只有VBO頂點繪製方式,VAO是OpenGL3.0後的特性
    //VAO比VBO即省記憶體又提高渲染效率
    if (Configuration::getInstance()->supportsShareableVAO())
    {
        GL::bindVAO(_vaoGLLine);
    }
    else
    {
        glBindBuffer(GL_ARRAY_BUFFER, _vboGLLine);
        //啟用attribute
        GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX);
        // 給vertex指定資料來源
        glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(V2F_C4B_T2F), (GLvoid *)offsetof(V2F_C4B_T2F, vertices));
        // 給color指定資料來源
        glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V2F_C4B_T2F), (GLvoid *)offsetof(V2F_C4B_T2F, colors));
        // 給texcood指定資料來源
        glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V2F_C4B_T2F), (GLvoid *)offsetof(V2F_C4B_T2F, texCoords));
}
    //設定線的寬度
    glLineWidth(_lineWidth);
 
    glDrawArrays(GL_LINES, 0, _bufferCountGLLine);
    
    if (Configuration::getInstance()->supportsShareableVAO())
    {
        GL::bindVAO(0);
    }
    
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    
    CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,_bufferCountGLLine);
    CHECK_GL_ERROR_DEBUG();
}

好了,其他的圖形繪製方法基本大同小異都是這個流程,如果你想深入理解,最好學習一下OpenGL的相關知識。

接下來我們就使用DrawNode類來進行一些圖形繪製

//建立DrawNode物件
auto dNode = DrawNode::create();
//將DrawNode物件新增到HelloWorld的layer上
this->addChild(dNode);

1.繪製點

//繪製點
//引數:座標、大小、顏色
//Color4F的4個引數:R、B、G、alpha,範圍0~1
dNode->drawPoint(Vec2(200,200),20,Color4F(1,0,0,1));

2.繪製線

//繪製線
//引數:起點座標、終點座標、顏色
dNode->drawLine(Vec2(200,200),Vec2(400,400),Color4F(0,0,1,1));

3.繪製Bezier曲線

//繪製Bezier曲線
//引數:起點座標、控制點座標、終點座標、段數、顏色
//CCRANDOM_0_1()為獲得0~1之間隨機數的巨集
                                                                                                                                                          //二級貝塞爾曲線
dNode->drawQuadBezier(Vec2(200, 200), Vec2(100, 300), Vec2(500, 200), 15, Color4F(0, 1, 0, 1));
                                                                                                                                                          //高階貝塞爾曲線
dNode->drawCubicBezier(Vec2(200, 200), Vec2(300, 300), Vec2(450, 200), Vec2(150, 100), 10, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));

4.繪製三角形

//繪製三角形
//引數:頂點座標、顏色
dNode->drawTriangle(Vec2(200, 300), Vec2(400, 300), Vec2(300, 400), Color4F(1, 0, 0, 1));

5.繪製矩形

//繪製矩形
//引數:左下角頂點座標、右上角頂點座標、顏色
dNode->drawRect(Vec2(300, 300), Vec2(400, 400), Color4F(1, 0, 0, 1));

6.繪製圓形

//繪製圓形
//引數:圓心座標、半徑、角度(弧度)、段數、是否有線連到圓心、橫、縱座標縮放、顏色
dNode->drawCircle(Vec2(480, 320), 100, CC_DEGREES_TO_RADIANS(90), 20, true, 1, 1, Color4F(1, 0, 0, 1));

7.繪製多邊形

//繪製多邊形
//引數:頂點座標陣列、頂點數、是否封閉、顏色
Vec2 vertices[] = { Vec2(100, 100), Vec2(150, 150), Vec2(200, 150), Vec2(200,200), Vec2(150, 200)};
dNode->drawPoly(vertices, 5, true, Color4F(1, 0, 0, 1));

8.繪製矩形面

//繪製矩形面
//引數:左下角頂點座標、右上角頂點座標、顏色
dNode->drawSolidRect(Vec2(300, 300), Vec2(400, 400), Color4F(1, 0, 0, 1));

 其他繪製面的方法基本也和繪製線的相同,引數基本一樣,只是方法名多了“Solid”。

以上。

相關推薦

COCOS學習筆記--定義繪製

Cocos2dx3.0版本後渲染引入了OpenGlES3.0相關特性,使用了DrawNode類來進行繪製,那麼我們就來看看DrawNode類具體是如何繪製點線面的: 我們在DrawNode.cpp中可以看到DrawNode類提供了畫點drawPoint()、畫線drawLi

MySQL學習筆記-定義函數

自定義函數 signed mysql pwm begin 多個 2個 list ive MySQL學習筆記-自定義函數 1.自定義函數簡介 自定義函數:用戶自定義函數(user-defined function,UDF)是一種對MySQL擴展的途徑,其用法與內置函數相同

Python3學習筆記——定義模塊

brush print 學習 sys.path append 路徑 nbsp highlight PE import sys import os print(__file__) #打印相對路徑 base_dir = os.path.dirname(os.path.dir

安卓學習筆記定義介面卡

BaseAdapter:是所有介面卡類的父類,可以對列表項進行最大限度的定製 1.1 自定義介面卡中的方法 getCount getView getItem getItemId 1.2 LayoutInflater(佈局解析器) –LayoutInflater有三種獲得

Spring Security學習筆記-定義決策

SpringSecutiry-自定義決策   當用戶身份認證通過後,會呼叫決策管理器判斷是否可以繼續訪問,圖中的AccessDecisionManager就是SpringSecurity的角色管理器,AbstractAccessDecisionManager,而我們要自定義角色管理器的

Objective-C學習筆記-定義

1.OC中一個類由.h檔案和.m檔案組成,.h檔案負責宣告介面,.m檔案負責具體實現 2.在.h檔案中@interface後面的格式為類名:基類名 3.成員變數需要寫在大括號內,最好使用下劃線開頭,使用成員變數需要寫存取方法,為了開發效率,目前推薦使用屬性代替成員變數,屬

JS學習筆記 - 定義右鍵選單、文字框只能輸入數字

  <script> // 事件總共有2個部分, //1.點選滑鼠右鍵的表現 oncontextmenu 2.點選滑鼠左鍵的表現(即普通點選onclick) // 點選右鍵,div位置定位到滑鼠所在位置, 且阻止滑鼠右鍵的預設選單 // 點選左

學習筆記-定義密碼輸入框和定義數字密碼軟鍵盤

      最近專案裡有一個支付功能,需要自定義鍵盤,於是我在網上搜了一下,發現這個和我需求很相符,等專案完工,打算分享給大家,卻找不到專案的博主了,這裡還是感謝博主,我就直接貼程式碼分享給大家了; XNumberKeyboardView.java import andr

python學習筆記——定義模組匯入

一.pycharm的相關知識 Step1:檢視pycharm的執行配置 這是pycharm執行的配置介面,圖中的每個條目的具體意義可以參考:pycharm執行配置說明文件 要注意的是,兩個打勾的條目,裡面提到了兩個名詞content roots和source roots,

Android學習筆記-定義仿支付寶ProgressBar動畫

最近開始學習自定義控制元件,看到支付寶支付的ProgressBar動畫感覺不錯,就學著也做一個這樣的ProgressBar。 首先看效果圖 原理:  一個執行緒無限改變進度畫弧形,當外部告知結束,通過判斷結果呈現成功或者失敗動畫,通過path座標緩慢變化就可以實現動畫效

Vuejs2.0學習筆記-定義指令

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

WebGL three.js學習筆記 定義頂點建立幾何體

auto getchild clear wid charset dem idt process 初始 自定義頂點建立幾何體與克隆 Three.js本身已經有很多的網格模型,基本已經夠我們的使用,但是如果我們還是想自己根據頂點坐標來建立幾何模型的話,Three.js也是可以的

筆記定義View之DrawText文字繪製

一 canvas 繪製文字的方式 1 drawText(String text, float x, float y, Paint paint) 2 drawTextRun() 它和 drawText() 一樣都是繪製文字,但加入了兩項額外的設定——上下文

struts2學習(6)定義攔截器-登錄驗證攔截器

back tps class res urn fff .com space war 需求:對登錄進行驗證,用戶名cy 密碼123456才能登錄進去;   登錄進去後,將用戶存在session中; 其他鏈接要來訪問(除了登錄鏈接),首先驗證

odoo開發筆記-定義發送郵件模板

.cn 定義 圖片 image bsp img cnblogs clas 開發者模式 1. 首先激活開發者模式 2. 點擊設置 - Email - 模板 - “選擇你需要修改的模板” 我們這裏以報價單的為例:quote order 3

MVC路由學習定義路由參數(用戶看不到參數名),重新定義路由規則

route sys 工具 str optional href clas local amp 一,項目有需求將項目地址中的參數名不顯示給用戶看 在MVC定義一個方法:     public ActionResult GetUserInfo(string Name, str

Vue2.0筆記——定義指令

Vue自定義指令 自定義指令主要用於,除系統提供外,自己對DOM的底層操作。例如當頁面加載時需要將一個文本框為自動獲得焦點。只要你在打開這個頁面後還沒點擊過任何內容,這個輸入框就應當還是處於聚焦狀態。 我們通過全局自定義指令和局部自定義指令來講解autofouce案例。 全局自定義指令 在全局API中通過Vu

日常學習隨筆-定義了一個MyArrayListDefin集合(數組擴容+叠代器+JDK1.8新方法+詳細說明)

fin array rgs def spl 三種 叠代 ldd ner 一、自定義了一個ArrayList的模擬集合(源碼+詳細說明)   前段時間分析了下ArrayList集合的源碼,總覺得如果不自己定義一個的話,好像缺了點什麽,所以有了如下的代碼。  代碼可以說是逐行註

日常學習隨筆-定義了一個雙鏈表(註釋蠻詳細的)

明顯 ret 含義 合法性 如何 author 移除 rev for 一、雙鏈表結構   最近總會抽出一些零碎的時間片段,嘗試按照自己的想法自定一了一個雙鏈表結構的集合。我發現,數組、單鏈表或者雙鏈表,乃至其他結構,本質上就是一種思想,只要遵循結構的核心思想,實現方法會有很

openERP筆記 定義模塊開發

oom size 創建工程 for 編號 文檔 姓名 use python ##需求描述 輸入和查詢課程,把信息儲存到課程對象裏 課程包含以下信息:名稱,價格,天數,開始日期,教師,學員 每個課程可以有多個學員,要記錄學員的姓名、電話、電子郵件 課程可以添加教材和作業等