四,Director Scene Layer和Sprite(導演,場景,層和精靈)
1.Scenes(場景)
一個場景 (用CCScene對象實現)相當於APP工作流的獨立部分。一些人也喜歡叫做“屏幕”或“舞台”。你的App可以有許多屏幕,但在特定時間內只有一個是處於激活狀態。 例如你的一個游戲中有這些場景:介紹,主菜單,關卡1,劇情動畫1,關卡2,勝利過場動畫,失敗過場動畫,高分屏。你認為這些場景可以作為一個單獨的應用程序,該應用程序只需要很少的連接代碼就可以跳到其他的場景。例如介紹場景完成后可能直接跳到主菜單場景,下面是一個假設的游戲流程圖:

一個cocos2d CCScene是由一個或多個CCNodes組成, CCNodes還可以做為子類嵌套。CCNodes的子類如CCLayer和CCSprite會給定場景的外觀和行為。通常你實現CCLayer的子類並添加到空白的CCScene實例中。然后實現你的其他圖形和游戲對象把它們作為CCNodes 添加到CCLayer中。因為場景是CCNode的子類,
它們能被手動或使用CCActions來變換。場景的切換可以通過CCScene 的子類CCTransitionScene類來處理。這些允許你創建特定切換效果。比如漸入漸出等之類的場景切換效果。
2.Director(導演)
CCDirector是一個共享的單例對象,它提供場景之間的導航。它知道當前被激活的場景並允許你改變場景。當你把一個新場景放入棧中,CCDirector會暫停先前的場景,但還是會保留在內存中。當你中棧頂取出頂部的場景時,先前暫停的場景會回復它上一次的狀態。CCDirector還負責初始化OpenGL ES。
3.Layers(層)
一個CCLayer是一個CCNode它知道如何處理觸摸事件。層知道如何繪制它們自己並可能是半透明,允許玩家看到背后的其他層。CCLayers在定義你游戲的外觀和行為上非常有用,因此你應該耗費大量時間在CCLayer子類的編寫上。如下圖所示:

CCLayer是定義你處理觸摸事件的地方。通過實現一個方法來處理觸摸事件(ccTouchBegan,ccTouchMoved,ccTouchEnded,ccTouchCancelled)並與玩家互動。這些觸摸時間被傳遞到一個場景內的所有層中,由前向后,直到一些層捕獲事件並接受它。而復雜的應用程序將要求你定義CCLayer的子類,cocos2d提供一些預定義的層。一些例子包括CCMenu(一個簡單的菜單層),CCColorLayer(一個實體顏色層),CCLayerMultiplex(一個多樣化的層,讓你多種不同的子元素中,每次激活一個元素但關閉其他元素)。層可以包含任意的CCNode,如CCSprites,CCLabels或CCLayer他自己。因為層是CCNode的子類,它們能被手動或使用CCActions來變換。以下是CCLayerMultiplex的例子代碼:
CCLayerGradient* layer1 = CCLayerGradient::create(ccc4(255, 0, 0, 255), ccc4(255, 0, 255, 255)); layer1->setContentSize(CCSizeMake(80, 80)); layer1->setPosition(ccp(50,50)); addChild(layer1); CCLayerGradient* layer2 = CCLayerGradient::create(ccc4(0, 0, 0, 127), ccc4(255, 255, 255, 127)); layer2->setContentSize(CCSizeMake(80, 80)); layer2->setPosition(ccp(100,90)); addChild(layer2); CCLayerGradient* layer3 = CCLayerGradient::create(); layer3->setContentSize(CCSizeMake(80, 80)); layer3->setPosition(ccp(150,140)); layer3->setStartColor(ccc3(255, 0, 0)); layer3->setEndColor(ccc3(255, 0, 255)); layer3->setStartOpacity(255); layer3->setEndOpacity(255); ccBlendFunc blend; blend.src = GL_SRC_ALPHA; blend.dst = GL_ONE_MINUS_SRC_ALPHA; layer3->setBlendFunc(blend); addChild(layer3);

Sprites(精靈)
一個cocos2d CCSprite其實和其他游戲引擎的sprites類似。這是一個2D圖像,可以移動,旋轉,縮放,動畫,並接受其他轉換。當然精靈也能嵌套。它父類精靈被轉換時,它的所有子元素也會被轉換。同樣精靈也是CCNode的子類,任何轉換都適用於CCActions
五,場景切換
Cocos2d-x提供一個非常酷的功能,就是兩個不同場景間的切換。擦拭,淡入淡出,縮放,分裂。它依賴於CocosNode 並類似於層,從技術上來講場景過渡也是一個場景,它承前啟后。相比用過Android源生的同學都知道,android也有這樣的功能,但cocos2d-x的過渡效果更加強大。
1.創建過渡
他的時間單位為秒,應用場景轉換的語法如下所示:
CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(0.5,newScene));
它提供一些過渡自定義參數,如FadeTransition有一個淡入淡出的顏色作為一個額外的參數如下代碼所示:
static CCTransitionFade* create(float duration,CCScene* scene, const ccColor3B& color);
對於場景過渡它得心應手,下面是一個小例子:
CCScene *s = SecondPage::scene(); CCDirector::sharedDirector()->setDepthTest(true); CCTransitionScene *transition = CCTransitionPageTurn::create(3.0f, s, false);
如果你運行上面的代碼你將會有一個翻頁的效果:

六,效果
1.導言
效果是一個特殊類型的action。它不是修改一些常用的屬性,如透明度,位置,旋轉,縮放。而是修改一個新的屬性:grid。一個grid屬性像一個矩陣,它是一個網絡的線路,相互交叉,形成一系列的正方形或長方形。這些特殊的動作渲染於任何的CocosNode對象(Layer, Scene, Sprite等)到grid,並且你能通過改變它們的頂點來變換grid。下面有兩種girds:tiled girds和非tiled grids。它們的區別是tiled girds是由於個體的tiles組成而非tiled grids由頂點組成。如下圖所示:

下面是一個Ripple3D動作的例子,它使用是Grid3D(非tiled)grid:


下面是一個FadeOutTR 動作,它使用是TiledGrid3D(tiled)grid:


2.如何使用它們
任何其他的action,都是通過runAciton執行:
// Create an sprite CCSprite* grossini = CCSprite::create("grossini.png"); grossini->runAction(CCLiquid::create(4, 20, ccg(10,10), 5));
液體類似的效果,它們接收gird參數。你可以通過增加網格的大小調整效果的質量。但它也意味着更少的FPS。這種效果是IntervalAction動作,因此你能對待其他動作一樣處理:
// create a Lens3D action CCActionInterval* lens = CCLens3D::create(ccp(240,160),240,ccg(15,10),8); // create a Waved3D action CCActionInterval* waves = CCWaves3D::create(18,80,ccg(15,10),10); // create a sequence an repeat it forever grossini->runAction(CCRepeatForever::create((CCSequence*)CCSequence::create(waves, lens, NULL ) ) );
以下是使用Grid3D (非tiled)的action,基於v2.1.0版本
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
以下是使用TiledGrid3D(tiled)的action
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |





















