自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于cocos2d-x幾種畫圖方法的用法與思考

移動開發(fā) iOS 游戲開發(fā)
Cocos2d-x中文論壇會員j1223jesus分享了cocos2d-x的幾種畫圖方法的用法和自己對其的理解。

CCRenderTexture

自己的理解

CCRenderTexture類似一張空白的“畫布“,用戶通過自定義筆刷(CCSprite*),在touch事件中把筆刷的移動痕跡“記錄”起來,從而“畫”出各種藝術(shù)效果。記錄方法很簡單,首先CCRenderTexture調(diào)用自己的begin()函數(shù),開啟“記錄”功能,然后調(diào)用筆刷->visit()把自己”畫“在這張畫布上,最后CCRenderTexture調(diào)用end()結(jié)束記錄,那就OK了。

這里我想CCRenderTexture是通過把筆刷的紋理疊加到自己的紋理(Texture)里,而不是不斷創(chuàng)建新紋理,所以消耗比較低,即使畫得很頻繁,幀數(shù)也能保持穩(wěn)定,是個很贊的類。

CCRenderTexture由于只要begin()開啟“記錄”功能后,任何之后的CCNode*對象只要調(diào)用了visit(),就能將自己“畫”在其身上。所以,一般游戲的截屏功能,完全可以使用CCRenderTexture的來實(shí)現(xiàn),具體可以看tests里例子,cocos2d-x已經(jīng)提供了相關(guān)例子,看看源代碼就能搞明白的。

優(yōu)點(diǎn)

用CCRenderTexture可以很簡單的實(shí)現(xiàn)出理想的畫圖效果(只要搞一張很小的筆刷圖,然后用CCSprite載入來,再適當(dāng)調(diào)用一個CCSprite的visit()就行了),幀數(shù)消耗低,還很方便實(shí)現(xiàn)出游戲的截屏功能,做《你畫我猜》這種項(xiàng)目,第一想到的應(yīng)該就是它了。

缺點(diǎn)

由于每個Android手機(jī)的硬件或者OpenGL版本不一樣,導(dǎo)致有些手機(jī)用CCRenderTexture會出現(xiàn)花屏,比如HTC。就算是官方提供的tests例子也難逃一花屏,這個致命的缺點(diǎn)導(dǎo)致用它來實(shí)現(xiàn)的《你畫我猜》不能跨手機(jī),比較坑爹…

這個Bug我想不是cocos2d-x引擎的問題,有牛人說是因?yàn)門exture在重復(fù)畫導(dǎo)致的(只畫一次沒問題,所以截屏功能應(yīng)該不受影響),也許是每臺Android手機(jī)的OpenGL不一樣吧,所以問題一直沒得到解決,只能等cocos2d-x或者有其他牛人以后可以把它Fixed掉。

因?yàn)榛ㄆ羻栴},現(xiàn)階段不推薦使用(如果有牛人解決了花屏問題,請教教我,謝謝)

[ 花屏參考圖 ]

例子

CCRenderTexture大概是大家比較熟悉的,tests里也有相關(guān)例子,要知道用法直接看tests的源代碼就可以了,效果如圖:

用OpenGL-ES實(shí)現(xiàn)畫圖

自己的理解

OpenGL-ES是OpenGL的精簡版,由于太精簡,很多OpenGL常用的函數(shù)都被“簡”掉了,導(dǎo)致有很多網(wǎng)上一搜一大把的畫圖算法用不上。所以用OpenGL-ES畫圖,這個感覺難度非常高。

在cocos2d-x中,OpenGL-ES一般在draw()這個函數(shù)里面調(diào)用其相關(guān)函數(shù)。當(dāng)然cocos2d-x也封裝了幾個常用的畫圖函數(shù):ccDrawLine,ccDrawCircle等,當(dāng)然cocos2d-x也提供了例子,在tests里可以輕松找到。

優(yōu)點(diǎn)

暫時沒想到,因?yàn)槲冶旧韺penGL-ES不熟…

缺點(diǎn)

實(shí)現(xiàn)難度大可以攔截一大批人了,感覺。因?yàn)椴荒芟馛CRenderTexture那樣在touch事件中進(jìn)行繪圖,所以一般會把要畫的CCPoint在touch事件的記錄下來,然后在draw()這個函數(shù)里遍歷之,以實(shí)現(xiàn)繪圖效果。

移動過的點(diǎn)一般都要保存下來,注意的是要全部保存,如果只保存當(dāng)前點(diǎn)的話,draw()就只會畫一個點(diǎn),畫出來的效果就像一個“光點(diǎn)”跟隨的鼠標(biāo)移動,而不是繪圖。一般畫一幅畫,鼠標(biāo)都會拖動出N個點(diǎn),如果只是簡單的vector保存的話,vector會超大,draw中遍歷它也很耗時,導(dǎo)致沒一會幀數(shù)就掉光了。具體怎么保存看數(shù)據(jù)結(jié)構(gòu)吧,同事以線段作為數(shù)據(jù)結(jié)構(gòu)來記錄點(diǎn),這樣消耗不大,幀數(shù)也能保持穩(wěn)定。

另外一個缺點(diǎn)就是如果算法實(shí)現(xiàn)不好,畫出來的效果很坑爹,同事的線段法雖然能很流暢的畫線,但是鋸齒問題很嚴(yán)重,開了OpenGL的抗鋸齒也沒效果。如果對OpenGL-ES很熟而且算法也很牛的話,也許draw()是最快最好的一種畫圖法了。

最后還一個超坑爹的缺點(diǎn):draw()在Google那臺三星手機(jī)上,始終畫在最頂層顯示,然后線條就會把游戲UI遮蓋住了,無論怎么設(shè)置z-Order都沒用,估計是Google的三星手機(jī)的OpenGL-ES做過什么特殊處理吧,導(dǎo)致“坑爹啊…”

[ 萬惡的鋸齒…]

例子

Cocos2d-x提供的相關(guān)例子(DrawPrimitivesTest),常見的畫直線、畫圓、畫Bezier線等,都有函數(shù)提供,具體還是自己打開tests看看源代碼吧,這里就不詳述了。

[ DrawPrimitivesTest ]

CCSpriteBatchNode

自己的理解

用CCSpriteBatchNode生成的CCSprite共用一個紋理,這樣的好處是生成很多相同的CCSprite很高效,幀數(shù)可以很高很穩(wěn)定。由于這個特點(diǎn),用來實(shí)現(xiàn)粒子效果是一個很好的選擇,不過我還沒有看過cocos2d-x粒子系統(tǒng)的實(shí)現(xiàn),這里不做推測,以免誤導(dǎo)大家。關(guān)于CCSpriteBatchNode的用法當(dāng)然還是tests里面有,有興趣的朋友可以自己看看。

優(yōu)點(diǎn)

由于draw()實(shí)現(xiàn)難度太高,而CCRenderTexture又有花屏的問題,所以嘗試用CCSpriteBatchNode來實(shí)現(xiàn)畫圖,繪圖效果很不錯,因?yàn)槭鞘褂肅CSprite做自定義筆刷嘛。幀數(shù)保持58-60,很穩(wěn)定(如果只是單純的創(chuàng)建CCSprite*,然后addChild到Layer里,掉幀會很嚴(yán)重的)

缺點(diǎn)

雖然CCSpriteBatchNode效果很不錯,不過也有一個致命的缺點(diǎn),就是CCSpriteBatchNode*對象不能addChild太多的CCSprite*對象,同事做了一下實(shí)驗(yàn),大概addChild到16000+個CCSprite后,CCSpriteBatchNode就不能addChild了,也就是說,畫圖畫到16000+個點(diǎn)后,畫筆就“沒墨水”,導(dǎo)致鼠標(biāo)再怎么拖都沒效果。

查看了一下源代碼,大概是CCSpriteBatchNode在addChild時會重新分配內(nèi)存,當(dāng)需要分配的內(nèi)存很大時,回導(dǎo)致內(nèi)存分配失敗,從而CCSpriteBatchNode會將這次addChild無效掉。

解決思路有一個,就是來個計數(shù),當(dāng)CCSpriteBatchNode它addChild到10000個后,用CCRenderTexture截個圖保存當(dāng)前的畫圖記錄,然后清空CCSpriteBatchNode和把計數(shù)置零,再來畫圖。這個操作會有延遲,所以沒有實(shí)現(xiàn)。

CCRibbon

自己的理解

CCRibbon應(yīng)該說是一個線段集吧,與上述方法不同的是,它只能是單一顏色。就是說,你將它setColor為紅,那么你畫過的線條就全部為紅,為藍(lán)的話,則線條全部為藍(lán)。

生成一個CCRibbon*對象需要指定:筆刷的寬度,筆刷的圖片,線段的長度,筆刷的顏色等參數(shù)(Fade最后這個參數(shù)暫時還沒搞懂意思…)。

CCRibbon提供addPointAt(CCPoint location, float width),將點(diǎn)以多寬加入到CCRibbon中,這里cocos2d-x對這個點(diǎn)的大小進(jìn)行計算,從而使線條達(dá)到“頭尾窄,身體寬”的效果。這個可以說是優(yōu)點(diǎn)也可以說是缺點(diǎn)吧,“頭尾窄,身體寬”看起來比較像筆刷,不過想做出均勻的畫筆就不行了。

優(yōu)點(diǎn)

幀數(shù)穩(wěn)定,筆刷效果不錯。因?yàn)镃CRibbon也是用draw()進(jìn)行畫圖,所以不用擔(dān)心CCRenderTexture那樣的花屏問題,CCRibbon目前感覺是比較理想的畫圖方法了。

缺點(diǎn)

如果在(100,100)點(diǎn)上一個點(diǎn),然后跑去(400,400)再點(diǎn)一個點(diǎn),CCRibbon會自動將兩個點(diǎn)連起來,如果用戶想做出平常畫圖那種“刷刷刷“的排線法,CCRibbon就不行了。解決方法就是每次TouchBegan都生成一個CCRibbon,這樣就不會出現(xiàn)這個問題了,不過生成太多的CCRibbon不知道會不會出現(xiàn)其他問題,比如CCSpriteBatchNode那個…

由于CCRibbon是單一顏色的,所以想畫彩色圖是不行的。解決方法當(dāng)然還是像上面那樣,生個多個CCRibbon*對象,每個CCRibbon*對象的顏色不同就行了。

最后感覺不太人性化的就是畫筆只能“頭尾窄,身體寬“,如果想畫出”頭身尾均勻“的線條,用CCRibbon也許做不了。

例子

Cocos2d-x沒有直接給出CCRibbon的例子,所以這個不能夠在tests上看到使用方法,不過自己稍稍嘗試一下就行了,用法挺簡單。

責(zé)任編輯:佚名 來源: Cocos2d-x中文論壇
相關(guān)推薦

2011-12-12 10:40:08

Cocos2d-X游戲開發(fā)開發(fā)環(huán)境

2013-05-22 15:49:46

2012-04-17 12:44:38

cocos2d-x

2012-04-17 12:38:46

cocos2d-x

2013-04-16 10:02:47

cocos2d-x懶人Android開發(fā)

2013-12-03 10:58:50

Cocos2D-X磚塊地圖

2012-04-19 10:03:12

Cocos2d-x

2014-07-31 16:57:30

2013-05-22 14:38:44

iOS開發(fā)Cocos2d-x坐標(biāo)系統(tǒng)

2012-04-17 12:58:44

Cocos2D-X

2013-06-03 17:04:20

CocoStudioCocos2D-X添加CocoStudi

2012-02-19 20:10:23

Cocos2d-x fCocos2dWindows Pho

2012-04-17 13:12:00

2012-04-17 10:06:08

cocos2d-x

2012-04-17 10:59:31

cocos2d-x

2012-04-17 12:47:27

cocos2d-x

2013-11-13 16:31:32

Cocos2d-x

2012-05-09 10:09:57

Cocos2d-xAndroidiOS

2013-06-07 14:06:52

移動開發(fā)Android開發(fā)cocos2d-x

2014-08-13 10:07:02

游戲引擎
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號