Cocos2d-x從入門到精通第九課《Director,Scene,Layer,Sprite的關係》

一. 總覽

           在Cocos2d-x-3.x引擎中,採用構來管理遊戲對象,一個遊可以劃分不同的景,一個景又可以分不同的,一個又可以有任意個可的遊戲節點(即象,遊中基本上所有的都派生於Node)。可以Action來修改遊戲節點的屬性,使其移、旋、放大、小等等。

          每一個刻都有一個景在獨立運行,通不同的景來完成一個遊流程,遊流程的管理由Director行,其基本框架類圖如下:

 

 

 

一,導演Director

              一款遊好比一部影,只是遊具有更的交互性,不的基本原理是一致的。所以在Cocos2dx中把籌遊大局的抽象爲導演(Director),Director是整個cocos2dx引擎的核心,是整個遊,遊中的一些常用操作就是由Director來控制的,比如OpenGLES的初始化,景的轉換,遊戲暫繼續的控制,世界坐GL的切對節點(遊元素)的控制等,有一些遊數據的保存調用,屏幕尺寸的取等都要由Director來管理控制的。

             因Director是遊戲項目的總導演,會調行一些控制,所以Director利用了設計模式,也就是目裏取到的director都是同一個。用getInstance()方法取得Director例,具體的API可以參考相關文檔,就不做述了。

二,場景Scene

            Scene景也是cocos2dx中必不可少的元素,遊中通常我需要構建不同的景(至少一個),遊裏關卡、版的切也就是一個一個景的切,就像在影中變換舞臺和地一景的一個重要的作用就是流程控制的作用,我可以通Director的一系列方法控制遊中不同的景的自由切

          下面是Director控制景的常用方法:

runWithScene(Scene *scene )

啓動遊戲並運行scene場景本方法在主程序第一次啓動主場景的時候調用如果已有正在運行的場景則不能調用該方法會調用pushScene-->startAnimation

·      pushScene( Scene *scene )

·      將當前運行中的場景暫停並壓入到代碼執行場景棧中再將傳入的scene設置爲當前運行場景只有存在正在運行的場景時才調用該方法

·      replaceScene( Scene *scene )

·      直接使用傳入的scene替換當前場景來切換畫面當前場景被釋放這是切換場景時最常用的方法

·      popScene() 釋放當前場景再從代碼執行場景中彈出棧頂的場景並將其設置爲當前運行場景如果棧爲空直接結束應用PushScene結對使用

·      end() 釋放和終止執行場景同時退出應用

·      pause() 暫停當前運行場景中的所有計時器和動作場景仍然會顯示在屏幕上

·      resume () 恢復當前運行場景的所有計時器和動作場景仍然會顯示在屏幕上

           同時場景是的容器,包含了所有需要示的遊元素。通常,當我需要完成一個候,會建一個Scene的子,並在子實現需要的功能。比如,我可以在子的初始化中入遊戲資源,爲場景添加,啓播放等等。

三,層Layer

              Layer理玩家事件響Node。與景不同,通常包含的是直接在屏幕上呈的內容,並且可以接受用入事件,包括觸摸,加速度鍵盤輸入等。我需要在中加入精靈,文本標籤或者其他遊元素,並置遊元素的屬性,比如位置,方向和大小;置遊元素的作等。通常,中的象功能似,耦合較緊,與中游內容相關的邏輯寫在中,在組織後,只需要把按照序添加到景中就可以示出來了。要向景添加,我可以使用addChild方法。

             addChild( Node child) addChild( Node child,int zOrder ) addChild( Node *child, int zOrder, int tag )

            其中,Child參數就是點。景而言,通常我添加的點就是。先添加的會被置於後添加的之下。如果需要指定先後次序,可以使用不同的zOrdertag是元素的標識,如果置了tag,就可以在它的父點中利用tag就可以找到它了。可以包含任何Node點,包括Sprites(精靈),Labels(標籤),甚至其他的Layer象。

四,精靈(Sprite)

              Cocos2d中的精靈和其他遊引擎中的精靈相似,它可以移,旋放,畫,並接受其他轉換Cocos2dxSpriteTexureframeanimation成,由openes負責渲染。主要的關係如下 簡單過程可描述:使用Texture2D載圖片,可以用Texture2D生成對應SpriteFrame(精靈),將SpriteFrame添加到Animation生成畫數據,用Animation生成Animate(就是最作),最後用Sprite作。

       看完大家估會感不知所云,是的,我看到話也是這樣的感覺,這話比文言文都難懂呀,那麼我們該如何理解精靈呢,這個很好解決,我來給大家總結一下就行了,當然我總結的就相對通俗易懂多了,哈哈。

        我對於精靈的理解:所謂精靈,其實就是一個四邊形,這個四邊形可以加載顯示單圖片和序列幀圖片。同時它的四個頂點的位置,色彩,透明度等信息可以被我們控制和改變。精靈,是我們對於圖型圖像進行控制的基礎操作物體。

    看了總結是不是感覺對精靈有點清晰的認知了呢。

五,相互之間的關係

       通過上面的介紹大家應該對Director ,Scene ,Layer,Sprite有了初步的認識,那麼它們是如果通過聯繫組合來爲大家呈現一個絢麗多彩的遊戲的呢,這個我們就通過代碼來看一下。我們新建一個叫HelloLesson9的工程,具體怎麼新建工程就不在講解了,創建完成後打開Appdelegate,找到如下代碼:

       

// 創建Scene
    auto scene = HelloWorld::createScene();
 
    //通過Director運行Scene
    director->runWithScene(scene);

            我可以看到,我HelloWorldcreateScene()創建了一個Scene,具體createScene()方法是如何返回一Scene我們暫且不管,我們這裏先來看看下面的一句代碼,通過director對象調用了runWithScene方法,該方法我們介紹Scene的時候都有講到,介紹首次運行Scene時被用到的,這句代碼執行之後,Scene就會被加載到遊戲中做顯示了。下面我們接着來看createScene(),進入HelloWorldScene.cpp查看createScene()方法的源碼,可以看到:

Scene* HelloWorld::createScene()
{
    // 創建Scene
    auto scene = Scene::create();
   
    // 創建Layer對象
    auto layer = HelloWorld::create();
 
    // 把Layer添加到Scene裏,Scene就是Layer的容器,可以添加很多Layer
    scene->addChild(layer);
 
    // 把Scene返回
    return scene;
}


 

            通的注大家應該能看懂。裏可以看到先建了一個Scene象,Scene主要用來當做Layer的容器,然後建了一個Layer,並把Layer添加到了Scene上,當然Layer調create()函數的候就會調用到本身的Init()方法,在init方法中可以完成一些初始化的工作,例如添加一些sprite,例如去加一個CocosStudio建文件.csb。然後當我景運行起來的候被添加的些遊元素就能示出來了。

          上面的講解我們可以總結一下:Director使用來運行,跳Scene的,也就是說Director用來管理Scene,而Scene又是Layer的容器,創建的Layer只有添加到Scene上才能被最終顯示出來,當然Scene可以同時添加很多Layer。Layer是作爲顯示的面板來使用的,可以添加Sprite,Label,Menu,Button,等等很多類型的遊戲元素,通過這些遊戲元素來展現我們的遊戲,最終也就通過Director,Scene,Layer,Sprite這四個組件的組合創造出了繽紛多彩的遊戲世界。

 

六,總結

       本節課對Director,Scene,Layer,Sprite通過概念進行了初步的講解,也爲大家講解了這四個遊戲組件是如何的關係,以及如何組合來創造出遊戲的。希望通過學習本節課程能讓大家對這些組件有新的認識。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章