cocos2d x 原始碼剖析(17)

2021-06-20 21:31:20 字數 1703 閱讀 9179

/** draws a texture at a given point */

void drawatpoint(const ccpoint& point);

/** draws a texture inside a rect */

void drawinrect(const ccrect& rect);

這節之所以單獨來講,是因為這是整個2d引擎中最核心的所在——繪製一張。如果你是用原生的opengl來做到這一步,那是相當的繁瑣。但是現在cocos2d-x把那些髒活累活都做完了,顯示一張就變得很簡單了。我們使用cctexture來講的繪製,是為了以後講ccsprite做鋪墊。知道如何顯示,是了解如何顯示更複雜內容的基礎。先來看看**:

void cctexture2d::drawatpoint(const ccpoint& point); 

glfloat width = (glfloat)m_upixelswide * m_fmaxs,

height = (glfloat)m_upixelshigh * m_fmaxt;

glfloat vertices = ;

ccglenablevertexattribs( kccvertexattribflag_position | kccvertexattribflag_texcoords );

m_pshaderprogram->use();

m_pshaderprogram->setuniformsforbuiltins();

ccglbindtexture2d( m_uname );

#ifdef emscripten

setglbufferdata(vertices, 8 * sizeof(glfloat), 0);

glvertexattribpointer(kccvertexattrib_position, 2, gl_float, gl_false, 0, 0);

setglbufferdata(coordinates, 8 * sizeof(glfloat), 1);

glvertexattribpointer(kccvertexattrib_texcoords, 2, gl_float, gl_false, 0, 0);

#else

glvertexattribpointer(kccvertexattrib_position, 2, gl_float, gl_false, 0, vertices);

glvertexattribpointer(kccvertexattrib_texcoords, 2, gl_float, gl_false, 0, coordinates);

#endif // emscripten

gldrawarrays(gl_********_strip, 0, 4);

}

簡單的繪製乙個就是這個流程,如果沒有cocos2d-x的幫助,想要自己寫一套還真要費不少事情。當然這個api要到opengl的上下文中才能執行。而cocos2d-x的opengl上下文只有在node的draw中才有,所以我們寫乙個簡單的demo來看看效果,為了省事我直接拿hellocpp來改了,相關的函式如下:

bool helloworld::init()

void helloworld::draw()

同樣沒做錯誤處理,希望大家不要介意,下面是顯示效果:

cocos2d x 原始碼剖析(2)

上次講到cocos2d x的main loop是下面這句 我們來看看這個函式的內部實現 return0 看看,我沒有欺騙大家吧。這個函式在設計的時候想要參照main函式返回乙個int值來表示執行結果,但是你知道的外部呼叫中完全沒有進行處理,略坑爹。來深入這個函式的內部 void startmainl...

cocos2d x 原始碼剖析(1)

原文出處 我認為在看這些文章的時候,最好有一些cocos2d x的經驗。起碼能新建乙個cocos2d x的hello world工程。而且這些文章並不是用來入門和教你如何使用cocos2d x的,我的目標是看完這些文章之後,寫乙個完整的2d引擎將沒有問題。而且能夠為cocos2d x查漏補缺,看看那...

cocos2d x 原始碼剖析(8)

寫到第7節的時候,突然覺得cocos2d x還沒有我想的那麼大啊,或許在50節以內就要了結了。這節繼續看看ccnode這個節點,主要部分是action。雖然ccnode有不少的action相關的函式,起作用的實際上是actionmanager。這節雖說是從ccnode開始,但是真正的內容在actio...