cocos2d框架介紹

 

 原帖:http://blog.csdn.net/liangneo/article/details/6770543


 

cocos2d引擎

 

2.0 cocos2d簡介

       Cocos2d最初的版本是用python寫的,之後被改成objectiveC,應用於iphone上,之後國內某人又根據該設計理念,將其改爲C++版本cocos2dX,該版本可以在iphone,widnows,andriod三個平臺上運行.最新的版本是1.0.0,該引擎C++的版本還引入了lua腳本系統.cocos2d是完全開源的引擎,開發者可以任意使用該代碼而不用公開源代碼.cocos2d被廣泛的使用,其中包括Zynga,南宮夢等知名遊戲公司.Cocos2d不僅僅只是一個2D圖形引擎庫,他還提供了一些對遊戲邏輯支持的系統.cocos2d提供了一個簡單的聲音引擎,支持播放mp3,wave,ogg等文件格式的音樂.cocos2d可以和物理引擎box2d配合使用,實現碰撞等物理效果.cocos2d引擎的結構清晰,文檔和實例比較豐富.易學易用.

2.1 cocos2d 基本結構

       Cocos2d採用場景樹結構來管理遊戲對象,把一個遊戲劃分爲不同的場景,場景又可以分爲不同的層,一個層又可以擁有任意個可見的遊戲對象.遊戲對象又可以執行Action來修改其屬性.每一個時刻都有一個場景在獨立運行,通過切換不同的場景來完成一個遊戲流程.cocos2d還採用了引用計數的方式來管理內存,基本上所有的類都派生於擁有引用計數的機制的CCObject.其基本框架類圖如下: 

a.      CCApplication,負責平臺相關的初始化,消息處理等,是一個單件類

b.      CCDirector,主要職責是管理場景和切換場景,遊戲暫停等.另外他還負責初始化openes相關的一東西.也是一個單件類

c.      CCNode,節點類,是遊戲中最重要的對象,在cocos2dk中,任何可見的或不可以的遊戲邏輯對象都是一個節點,節點有以下特點:

a)        是一個容器,可以包含任意多個其它節點.

b)        可以執行一個行爲(CCAction)

c)        可以執行一定時的任務回調

d)        擁有座標變換(transform)信息,如postion,scale,rotation等

e)        由於一個節點可以添加任意個子節點,所有的節點組成一個樹狀結構,因此父節點的座標變換會影響子節點在世界座標系中的座標,一個節點只能擁有一個父節點

d.      CCAction,動作類,CCAtion就好像指派給CCNode的命令一樣,在特定時間(或立即)內修改CCNode的屬性,例如位置,旋轉,縮放等

e.      CCScene,場景類,和PL中的stage類似,遊戲場景一般是指在某個時刻能獨立運行的部分,包括可見的怪物,地形和不可見的邏輯腳本等.例如一個遊戲的一個特定關卡,遊戲菜單,過場動畫等都是一個獨立的場景.cocos2d中的場景又由不同的層(CCLayer)組成.由於CCScene是CCNode的子類,因此可以可以用CCAction來修改其屬性

f.       CCLayer類,場景中的層類,一個場景可以擁有多個層,如HUD層,遊戲對象層,背景層,天空層等,層是一個可以繪製的區域.可以將ui,sprite等對象添加到其中.除此之外,層還接收輸入消息,可以在層的類中處理輸入消息,和CCScene一樣,CClayer是CCNode的子類,也可以用CCAction來修改其屬性

2.2資源管理與文件系統

         資源管理可以分爲兩個方面,一是管理一些原生(Raw)的資源,例如模型,貼圖,腳本,字體等.另外一種資源是在遊戲運行時分配的遊戲對象.他們需要能被快速的訪問.一般來說,沒有被引用的遊戲對象一般不會立即被釋放,會先緩存到某個地方.在加載新的場景時.纔會被釋放.在一些大型的渲染系統中,資源會被分爲三個階段,硬盤,內存,顯存資源,分別採用不同的策略和cache機制來管理,cocos2d沒有明顯的提出資源管理的概念,但使用了一些cache的機制來緩存已經加載了的紋理,frame,animation等.對於運行時分配的遊戲對象,cocos2d也提供了一個autorelease的機制,在遊戲切換場景時,將會對autorelease的對象進行內存回收.由於cocos2d採用了引用計數的機制.循環引用是一個需要關注的問題.

         對於文件系統,cocos2d封裝了一個簡單的類CCFileUtils,該類除了能讀取普通的文件之外,還可以從zip文件讀取文件.該類還讀取plist文件生成一個CCDictionary對象.

2.3 sprite與渲染系統

                    Cocos2d的Sprite由Texure,frame,和animation組成,由openes負責渲染主要的類關係如下:

a.      Sprite 可以看成是某一時刻,一個2d的圖片的一個剪輯部分

b.      frame由texture和一個矩形(quad)組成

c.      texture代表一個可以被繪製的2維的紋理

d.      imgae對應硬盤中不同類型的圖片,例如jpg,png,tga等.它知道如何從文件中讀取不同類型的圖片,生成緩衝數據,供texture使用

e.      CCAnimation由一系列的frame組成,類似於電影的膠片集合

f.       CCAnimate,動畫action,實現在指定時間內在sprite上播放指定的動畫(CCAnimation)

2.3.1 Texture與Image

         Cocos2d中的CCTexture2D用來描述一個2d的紋理,它知道如何將自己繪製到屏幕上.通過該類還可以設置紋理過濾,抗鋸齒等參數.該類還提供了一個接口,將字符串創建成紋理.該類所包含的紋理大小必須是2^n.因此紋理的大小不一定就等於圖片的大小.CCTexture2D以下成員:

a.      name,指向紋理在顯存中的地址

b.      pixelFormat,描述紋理的格式,例如RGBA888,或RGB565等

c.      pixelWidth,pixelHeight,紋理的寬高

d.      maxS,maxT,紋理的最大座標

既然已經有了CCTexture2D這樣的類紋理的渲染,那麼還需要Imgae類做什麼呢?因爲圖片的格式多樣,不同的格式,不同平臺下有不同的加載方法,因此cocos2d使用了一個CCImage類封裝不同格式的圖片在不同平臺下的加載.如果說CCImage中的buffer對應的是內在資源,那麼CCTexture2D對應的buffer是顯存資源.

2.3.2 Frame與Animation

         上面講過,Frame保存了一個紋理和矩形,在cocos2d中,一般都會給frame起個名字,以字典的形式保存在CCSpriteFrameCache中,方便隨時讀取.CCSpriteFrameCache支持從plist(類似於xml)文件讀取圖片,根據文件生成一系列的frame,並且給每個frame都生成一個名字. plist的文件可以使用很多第三方工具生成,例如Zwoptex(http://zwoptexapp.com/),TexturePacker(http://code-and-web.de/texturepacker);

CCAnimation類用來在CCspreite對象上實現動畫.他保存了一系列的frame.和frame之間的延時.可以通過使用CCAnimationaction來在sprite上播放一個動畫.

2.3.3 渲染流程

         由於cocos2d只處理2d圖形,渲染採用了固定流水線的方式.當時也可以直接使用openes的函數來完成一些高級的特效.和渲染相關的類有CCTexutre2D,CCTexutreAtlas, CCSprite,CCRenderTexture,CCRenderTexture支持將數據渲染到紋理上.另外CCNode還一個相機類,但一般情況都不使用.只有在實現一些3D特效的時候,才使用相機的一些特性.

2.4 粒子系統

Cocos2d支持兩種類型的粒子系統,點狀(CCParticleSystemPoint)和方形(CCParticleQuadSsytem)粒子系統,Quad類型的系統支持一些額外的特性

a.      可以旋轉

b.      可以是任何大小的,而point的尺寸不能超過64

c.      Quad類型的粒子系統可以被整體縮放

d.      Quad類型的粒子系統比Point粒子系統消耗更多的內存和顯存

粒子系統還支持從plist文件中讀取數據,plist文件可以通過第三方工具生成,例如ParticleDesigner(http://particledesigner.71squared.com/),和ParticleMint

2.5 UI與字體

         Cocos2d中只有簡單的ui實現,支持button,label,toggle三種類型的ui,另外還支持簡單的文本輸入框(TextField).類關係圖如下:

a.      CCMenu從CClayer派生而來,可以處理輸入消息,CCMenu包含多個CCMenuItem對象,在接收到輸入消息之後,根據觸摸位置,將輸入消息分發到相應MenuItem,執行回調函數

b.      CCMenu還提供一個對齊菜單項的接口

c.      CCMenuItem 菜單項的基類,目前cocos2d只從CCMenuItem派生了CCMenuItemLabel,CCMenuItemSprite,CCMenuToggle三個類.當然也可以派生新的類,實現其它的菜單項,例如checkbox等.

 

Cocos2d支持兩種類型的字體,一種是平臺相關的TTF字體,另外一種是平臺無關的美術字體,該類型字體可以通過字體編輯器(例如http://glyphdesigner.71squared.com/)自己來定義形狀和大小,使用起來和sprite差不多,比較方便.

2.6 簡單的TileMap

         Cocos2d支持的是一種TMX(TileMap XML)格式的地圖,該地圖可以由TileMapEditor生成(http://www.mapeditor.org/),TMX地圖有以下特點

a.      支持正交(orthogonal),六邊形(hexagonal),45度等距(isometric)地圖

b.      支持對象組,對象,和屬性

和地圖相關的類如下:

a.      以上類圖是簡化後的,實現的類還包含了objectgroup,property,TileSetInfo等

b.      一個TiledMap擁有多個layer

c.      一個layer擁有多個tile(用sprite來表示)

d.      由於每個tile都被看作一個sprite對象,因此每個tile可以被獨立的,移動,旋轉,縮放甚至執行action等.

e.      layer保存了一個對應於tileid的二維數組,只有在需要的時候纔會根據tile id 創建相應的tile(sprite),這樣可以既可以節省存儲空間,也可以提高渲染效率.

f.       Tile可以在運行時被添加和刪除

g.      http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:tiled_maps網頁上有關於tileMap使用的詳細教程

2.7 遊戲邏輯的支持

         前面已經講過Cocos2d不僅僅只是一個2D渲染引擎,它還提供了一個支持遊戲邏輯的系統,首先所有可見的對象,場景和layer都以場景樹的數據結構來保存,對root(一般都是scene)執行的操作都會影響root的孩子節點.如果root被縮放或者平移,那麼root的所有孩子節點也會被縮放和平移.所有的節點類(CCNode)都繼承了一個接口 SelectorProtocol,該接口有一系列的回調函數,在特定的條件下回調來完成相應的邏輯處理.其中最基本也是最重要的是與schedule相關的回調接口.下面將介紹一下schedule任務系統

2.7.0 Schedule系統

         Scheule系統也叫任務系統或者事件系統,任務指一個時間片內定時發生的事件.在cocos2d中的CCNode可以訂製一個計劃任務.通過回調函數來完成一個特定的邏輯.相關的類圖如下

a.      CCSchedule可以將selectorProtocol接口對象添加到任務列表中.

b.      CCTimer每一幀都檢查對應的任務是否達到執行時間點,如果達到則執行回調函數.

c.      CCNode派生於SelecotrProtocol,根據需要重載實現回調函數,實現相應的邏輯

2.7.1 Action介紹

         Action就像一些可以被執行的命令,通常情況下,一個action會修改一個CCNode對象的一些屬性,讓一個CCNode對象執行一些動作,例如改變其的位置,朝向.讓一個Sprite播放動畫等.如果這個action是在一定時間段內完成的,我們稱它爲IntervalAction,如果是立即執行的,我們稱它爲InstantAction.例如CCMoveBy在一定時間段內將一個CCNode對象移動一定的距離.因此它是IntervalAction的子類.而CCCallFunc實現立即執行一個架回調函數.因此它是InstantAction的子類.

         Action的設計採用了組合模式和裝飾模式,可以將一系列的action組合起來,讓CCNodec對象執行,就像給CCNode下達一系列的命令一樣.例如以下代碼

        

CCActionInterval* move =CCMoveBy::actionWithDuration(0.5f, ccp(0,160));

CCActionInterval*rotate = CCRotateBy::actionWithDuration(2, 360);

CCActionInterval*scale = CCScaleBy::actionWithDuration(2, 5);

CCActionInterval*opacity = CCFadeOut::actionWithDuration(2);

CCActionInterval*fadein = CCFadeIn::actionWithDuration(2);

CCActionInterval* scaleback =CCScaleTo::actionWithDuration(1, 1);

CCFiniteTimeAction*seq0 = CCSequence::actions(move, rotate, scale, opacity, fadein, scaleback,NULL);

Actor->runAction(seq0);

         該代碼解釋如下:

a.      Actor在0.5秒之內向y方向移動160個單位,

b.      讓actor在2秒內,旋轉360度

c.      將actor2秒內放大5倍

d.      2秒內淡出

e.      2秒內淡入

f.       1秒之內縮放到原始大小

2.8 網絡支持

         Cocos2d沒有提供專門的網絡庫

2.9 腳本支持

         Cocos2dX最近的版本提供了lua腳本支持,在1.1.0版本結合了tolua++,基本上將所有類的成員函數都導出到腳本中.除此之外,還增加了一些腳本回調函數,例如菜單的消息處理可以通過執行一段腳本來完成.也可以添加計劃任務來回調腳本函數.cocos2d中雖然有一個簡單的實例來說明如何使用lua,但具體的效率如何還待進一步驗證

2.10 聲音引擎支持

         Cocos2d使用了一個簡單的聲音引擎,支持Wav,mp3,ogg,caf格式音頻文件播放.但該引擎沒有提供音量設置

2.11 物理引擎支持

         Cocos2d可以和box2d,chipmunk物理引擎結合在一起,實現碰撞,重力等物理效果模擬.在代碼的實例中,有大量與box2d和chipmunk結合的實例,可以供學習和研究使用.

2.12 cocos2d的缺點

         Cocs2d不但是處理了2D渲染,還將整個渲染系統和遊戲邏輯緊密的耦合在一起,因此在使用coco2d渲染時,不得不使用他的整個邏輯相關的代碼.因此很難在使用其渲染庫的同時又自己設計一套邏輯框架.對於一些小型遊戲來說,可以使用其可以進行快速的迭代和開發.但對於一些大型遊戲,爲了使用系統運行更穩定,結構更清晰.更易於擴展,一般都會將各個模塊獨立開來.以方便不同的人員分工開發和維護.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章