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是一個結構體,裡面點座標、顏色值還有個
回過頭來,剛剛只是把繪製資訊儲存起來,那麼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 ##需求描述 輸入和查詢課程,把信息儲存到課程對象裏 課程包含以下信息:名稱,價格,天數,開始日期,教師,學員 每個課程可以有多個學員,要記錄學員的姓名、電話、電子郵件 課程可以添加教材和作業等