從HelloWorld開始

Cocos2d是一個圖形引擎,封裝了複雜的圖形接口,通過抽象出精靈,動作等概念,降低了遊戲開發難度,簡化了開發過程。Cocos2d-X爲保證遊戲能方便地移植到不同平臺,做了很多擴展,包括了一套Object-C風格的基礎類系、平臺無關的多點觸摸協議、重力感應和音頻系統等。

  Cocos2d-X Feature:

  流程控制:非常容易管理不同場景之間的流程控制

  精靈:快速且方便的精靈用於顯示一切可見的元素

  節點:基於樹結構的分層組織方式,方便管理不同層次的遊戲元素,同時提供了統一管理的計時器

  動作: 應用於精靈或者其他遊戲的動畫效果,可以組合成複雜的動作,比如移動、旋轉、縮放等

  特效:包括波浪、旋轉、透鏡等視覺特效

  平面地圖:支持矩形和六邊形的平面地圖

  菜單:創建遊戲常用的菜單

  用戶輸入:提供接受用戶觸摸事件,傳感器等輸入的簡單解決方案

  文檔: 編程指南、API參考及許多簡單可靠的測試樣例

  MIT許可:免費開放的協議,但是請謹記尊重版權

  基於OPENGL:深度優化的繪圖方式,支持硬件加速

   Cocos2d-X的流程控制是個相當方便的特點,利用CCDirector我們可以方便地在不同場景間切換,而且爲了防止切換的生硬,提供了CCTransitionScene系列特效類來包裝原來的場景類,做到平滑地過渡。其他引擎鮮有做到。


  環境搭建

   http://mobile.51cto.com/iphone-330448.htm 有詳細介紹。下面我們會搭建最簡單的Win32平臺

   從官方網站[http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download]下載最新的Cocos2d-x版本,我選擇的2.0版本

   解壓後運行install-templates-msvs.bat, Cocos2d-X 應用模板會正確安裝到VS環境。

   下面就可以建立項目了。

   打開vs, 新建項目 -- 選擇安裝好的Cocos2d-X項目, 一路Next, 就可以建好我們的第一個Cocos2d-X項目。
   將新項目選爲啓動項目,compile-link-run, 如果一切順利, 會出現一個Hello World場景。

   Hello World項目結構分析

    resource 文件夾
    該文件夾主要用於存放遊戲中的圖片、音頻、配置等資源。爲了方便管理,可以在下面創建新文件夾。在不同的平臺下,對於文件路徑的定義是不一致的,但是
    實際接口大同小異。Cocos2d-X爲我們屏蔽了這些差異。其中resource文件夾可以默認爲遊戲運行時的目錄

    include & source 文件夾
    這兩個文件夾用於放置遊戲頭文件和源代碼文件夾。可以看到,項目模板爲我們放置了3個文件爲main.h, main.cpp和resource.h,它們是平臺相關的程序文件,
    爲windows專有。通常情況下,程序入口與資源文件管理在不同平臺下是不同的,但是Cocos2d-X爲我們處理了這些細節,不需要對它們進行修改

    AppDelegate.h & AppDelegate.cpp
    Cocos2d-X遊戲的通用入口文件,類似於一般Windows工程中的主函數

    打開AppDelegate.cpp, 我們可以已經自動添加的代碼。AppDelegate控制着程序的生命週期,除掉構造函數和析構函數,共有3個方法
    1. bool applicationDidFinishLauching()
    2. bool applicationDidEnterBackground()
    3. bool applicationDidEnterForeground()
    方法1在應用程序啓動後調用,默認的實現已經包含了遊戲啓動後的必要準備:

    //初始化遊戲引擎控制器CCDirector,以便啓動遊戲引擎
    CCDirector *pDirector = CCDirector:: sharedDirector();
    pDirector->setOpenGLView(&CCEGLView:: sharedOpenGLView());

    //啓動高分辨率屏幕,比如IOS設備的Retina屏幕
    //pDirector->enableRetinaDisplay(true);

    //啓用FPS顯示
    pDirector->setDisplayStatus(true);

    //設置繪製間隔
    pDirector->setAnimationInterval(1.0 / 60);

    CCScene *pScene = HelloWorld:: scene();
    pDirector->runWithScene(pScene);
    return true;


    pDirector是遊戲的大總管,一般這類管理類角色採用單例模式。Cocos2d-X單例採用sharedXXX的寫法,比如這裏的
    CCDirector::sharedDirector(), CCEGLView:: sharedOpenGLView()
    Cocos2d-X的指針實例貌似都採用p打頭,比如這裏pDirector、pScene

    CCDirector *pDirector = CCDirector:: sharedDirector()簡簡單單的一句代碼,其實背後幹了很多的事情。這會在後面來一一分析。

    接下來,bool applicationDidEnterBackground(),bool applicationDidEnterForeground(),這兩個方法是程序進入後臺和返回前臺時候自動調要的函數。類似於JAME中的HideNotify() 和 ShowNotify(),比如在進入後臺要關閉遊戲中音樂,終止遊戲,進入前臺,要恢復到遊戲中止前的狀態,比如進入遊戲暫停菜單

    HelloWorldScene.h 和 HelloWorldScene.cpp
    這兩個文件定義了HelloWorld項目默認的遊戲場景。Cocos2d-X的遊戲結構可以簡單地概括爲場景、層、精靈,而這兩個文件就是HelloWorld的場景實現文件。一般地,場景包括層,層包括精靈。後續部分我們將詳細講解Cocos2d-X的遊戲元素概念。

   HelloWorldScene中定義了一個HelloWorldScene類,該類繼承自CCLayer,因此HelloWorld本身是一個層。HelloWorld類包含一個靜態函數和兩個實例方法。


    下面我們來看兩個比較重要的成員
    static CCScene * scene() 在Cocos2d-X中,在層中設置一個創建場景的靜態函數是一個常見的技巧。我們爲HelloWorld層編寫了一個CCLayer的子類,在其中
    添加各種精靈和邏輯處理代碼。

    看看static CCScene * scene的實現
    CCScene * HelloWorld:: scene()
    {
        CCScene * scene = NULL;
        do
        {
            scene = CCScene:: create();
            CC_BREAK_IF(!scene);

            HelloWorld *layer = HelloWorld:: create();
            CC_BREAK_IF(!layer);

            scene->addChild(layer);
        }while(0);
        return  scene;
    }
    可見,這裏返回了一個包含創建場景的層的場景。確實很方便
    這裏,我們第一次看到addChild方法來將層添加到Scene對象,這個方法可以把一個遊戲元素放到另外一個元素之中。只有把一個元素放到其他已經呈現
    出來的遊戲元素之中,它纔會呈現出來,比如這裏我們將HelloWorld層置入創建的空場景中,而在AppDelegate.cpp中,我們已經讓CCDirector運行了該
    場景,所以,HelloWorld層就會出現在屏幕中。

    addChild(CCNode * child, int zOrder) 這個重載方法,第二個參數越大,表示顯示的位置越靠前

    bool init() 初始化HelloWorld類

    1. 對父類進行初始化 // 父類初始化了些什麼,參見源碼
    if(!CCLayer::init())
        return  false;

    2. 創建菜單並添加到層
    CCMenuItemImage *pCloseItem = CCMenuItemImage:: create(
                                  "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback));
    pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
    CCMenu *pMenu = CCMenu:: create(pCloseItem, NULL);
    pMenu->setPosition(CCPointZero);
    this->addChild(pMenu, 1);

    3. 創建"HelloWorld"標籤並添加到層中
    CCLableTTF *pLabel = CCLabelTTF:: create("HelloWorld", "Arial", 24);
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    pLabel->setPosition(ccp(size.width / 2, size.height - 50));
    this->addChild(pLabel, 1);

    4 創建顯示"HelloWorld.png"的精靈到層中
    CCSprite *pSprite = CCSprite:: create("HelloWorld.png");
    pSprite->setPosition(ccp(size.width/2, size.height/2));
    this->addChild(pSprite, 0);

    return true;


    也許讀者會有疑惑,爲什麼我們在一個實例方法中初始化類,而不是在構造函數中呢,這是由於Cocos2d-X來源特殊,所以沒有采用C++的編程風格.


    總結下,HelloWorld層創建遊戲內容以及邏輯,並創建一個空場景作爲自己的父容器,而AppDelegate啓動了這個父容器,從而使得遊戲得以呈現。可見遊戲的核心部分是由層創建的。

初學Cocos2d-X,錯誤之處,請大家指出.










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