cocos2d-x開發記錄:二,基本概念(導演,場景,層和精靈,場景切換,效果)


四,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版本

Shaky3D  

Waves3D  

FlipX3D  

FlipY3D  

       

 

Lens3D  

Liquid  

Waves  

Twirl  

       

 

Ripple3D  

 

以下是使用TiledGrid3D(tiled)的action

ShakyTiles3D  

ShatteredTiles3D  

ShuffleTiles  

FadeOutTRTiles  

       

 

FadeOutBLTiles  

FadeOutUpTiles  

FadeOutDownTiles  

TurnOffTiles  

       

 

WavesTiles3D  

JumpTiles3D  

SplitRows  

SplitCols  

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM