溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

從HelloWorld開始

發(fā)布時間:2020-06-02 17:30:10 來源:網(wǎng)絡(luò) 閱讀:737 作者:MZstudio2013 欄目:游戲開發(fā)

Cocos2d是一個圖形引擎,封裝了復(fù)雜的圖形接口,通過抽象出精靈,動作等概念,降低了游戲開發(fā)難度,簡化了開發(fā)過程。Cocos2d-X為保證游戲能方便地移植到不同平臺,做了很多擴展,包括了一套Object-C風(fēng)格的基礎(chǔ)類系、平臺無關(guān)的多點觸摸協(xié)議、重力感應(yīng)和音頻系統(tǒng)等。

  Cocos2d-X Feature:

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

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

  節(jié)點:基于樹結(jié)構(gòu)的分層組織方式,方便管理不同層次的游戲元素,同時提供了統(tǒng)一管理的計時器

  動作: 應(yīng)用于精靈或者其他游戲的動畫效果,可以組合成復(fù)雜的動作,比如移動、旋轉(zhuǎn)、縮放等

  特效:包括波浪、旋轉(zhuǎn)、透鏡等視覺特效

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

  菜單:創(chuàng)建游戲常用的菜單

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

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

  MIT許可:免費開放的協(xié)議,但是請謹記尊重版權(quán)

  基于OPENGL:深度優(yōu)化的繪圖方式,支持硬件加速

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


  環(huán)境搭建

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

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

   解壓后運行install-templates-msvs.bat, Cocos2d-X 應(yīng)用模板會正確安裝到VS環(huán)境。

   下面就可以建立項目了。

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

   Hello World項目結(jié)構(gòu)分析

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

    include & source 文件夾
    這兩個文件夾用于放置游戲頭文件和源代碼文件夾??梢钥吹?,項目模板為我們放置了3個文件為main.h, main.cpp和resource.h,它們是平臺相關(guān)的程序文件,
    為windows專有。通常情況下,程序入口與資源文件管理在不同平臺下是不同的,但是Cocos2d-X為我們處理了這些細節(jié),不需要對它們進行修改

    AppDelegate.h & AppDelegate.cpp
    Cocos2d-X游戲的通用入口文件,類似于一般Windows工程中的主函數(shù)

    打開AppDelegate.cpp, 我們可以已經(jīng)自動添加的代碼。AppDelegate控制著程序的生命周期,除掉構(gòu)造函數(shù)和析構(gòu)函數(shù),共有3個方法
    1. bool applicationDidFinishLauching()
    2. bool applicationDidEnterBackground()
    3. bool applicationDidEnterForeground()
    方法1在應(yīng)用程序啟動后調(diào)用,默認的實現(xiàn)已經(jīng)包含了游戲啟動后的必要準備:

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

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

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

    //設(shè)置繪制間隔
    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(),這兩個方法是程序進入后臺和返回前臺時候自動調(diào)要的函數(shù)。類似于JAME中的HideNotify() 和 ShowNotify(),比如在進入后臺要關(guān)閉游戲中音樂,終止游戲,進入前臺,要恢復(fù)到游戲中止前的狀態(tài),比如進入游戲暫停菜單

    HelloWorldScene.h 和 HelloWorldScene.cpp
    這兩個文件定義了HelloWorld項目默認的游戲場景。Cocos2d-X的游戲結(jié)構(gòu)可以簡單地概括為場景、層、精靈,而這兩個文件就是HelloWorld的場景實現(xiàn)文件。一般地,場景包括層,層包括精靈。后續(xù)部分我們將詳細講解Cocos2d-X的游戲元素概念。

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


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

    看看static CCScene * scene的實現(xiàn)
    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;
    }
    可見,這里返回了一個包含創(chuàng)建場景的層的場景。確實很方便
    這里,我們第一次看到addChild方法來將層添加到Scene對象,這個方法可以把一個游戲元素放到另外一個元素之中。只有把一個元素放到其他已經(jīng)呈現(xiàn)
    出來的游戲元素之中,它才會呈現(xiàn)出來,比如這里我們將HelloWorld層置入創(chuàng)建的空場景中,而在AppDelegate.cpp中,我們已經(jīng)讓CCDirector運行了該
    場景,所以,HelloWorld層就會出現(xiàn)在屏幕中。

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

    bool init() 初始化HelloWorld類

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

    2. 創(chuàng)建菜單并添加到層
    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. 創(chuàng)建"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 創(chuàng)建顯示"HelloWorld.png"的精靈到層中
    CCSprite *pSprite = CCSprite:: create("HelloWorld.png");
    pSprite->setPosition(ccp(size.width/2, size.height/2));
    this->addChild(pSprite, 0);

    return true;


    也許讀者會有疑惑,為什么我們在一個實例方法中初始化類,而不是在構(gòu)造函數(shù)中呢,這是由于Cocos2d-X來源特殊,所以沒有采用C++的編程風(fēng)格.


    總結(jié)下,HelloWorld層創(chuàng)建游戲內(nèi)容以及邏輯,并創(chuàng)建一個空場景作為自己的父容器,而AppDelegate啟動了這個父容器,從而使得游戲得以呈現(xiàn)??梢娪螒虻暮诵牟糠质怯蓪觿?chuàng)建的。

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










向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI