四、Cocos2dx 3.0三,找一個小遊戲開發Hello World 分析

尊重開發人員的勞動成果。轉載的時候請務必註明出處 http://blog.csdn.net/haomengzhu/article/details/27186557

Hello World 分析

打開新建的"findmistress"項目,可以看到項目文件是由多個代碼文件及目錄組成的。當中 Hello World 的代碼文件直接 存放於該項目目錄中。如下咱們來具體介紹一下項目的文件組成。

1."resource"
該目錄主要用於存放遊戲中需要的圖片、音頻和配置等資源文件。爲了方便管理。可以在當中建立子目錄。

在不一樣平臺下,對於文件路徑的定義是不一致的,但實際接口大同小異。編程

Cocos2d-x 爲咱們屏蔽了這些差別,當中"resource"文件夾可以默以爲遊戲執行時的文件夾。app


還記得上一節咱們執行起來的遊戲嗎?遊戲中顯示的 Cocos2d-x 標誌就放在這個目錄如下。除此以外,這個目錄還保 存了遊戲左下角 FPS 的字體以及退出遊戲button上的圖片。

2."Classes"和「proj.win32」 目錄
這兩個目錄用於放置遊戲頭文件和源碼文件。可以看到,項目模板爲咱們加入的三個文件分別爲"main.h"、"main.cpp" 和"resource.h",它們是平臺相關的程序文件,爲 Windows 專有。一般狀況下。程序入口與資源文件管理在不一樣平臺下是 不一樣的,但是 Cocos2d-x 的模板已經基本爲咱們處理好了這些細節,不需要對它們進行改動。


3."AppDelegate.h" 和 "AppDelegate.cpp" 文件
這兩個文件是 Cocos2d-x 遊戲的通用入口文件。相似於通常 Windows project中主函數所在的文件。接觸過 iOS 開發的讀者應  該會認爲這兩個文件的名字似曾相識,事實上 AppDelegate 在 iOS project中就是程序的入口文件。在介紹引擎歷史的時候曾提 到過。
 
Cocos2d-x 來源於 Cocos2d-iPhone,所以不論是代碼風格仍是文件結構。很是多方面都沿襲了 Cocos2d-iPhone 的使用習慣。 之後文章中,將具體介紹 Cocos2d-x 的代碼風格與文件結構。

打開"AppDelegate.cpp"。咱們可以看到已經本身主動加入的代碼,這個文件實現了 AppDelegate 類。AppDelegate 控制着遊戲 的生命週期。除去構造函數和析構函數外,共同擁有 3 個方法,如下咱們將逐個介紹。


bool applicationDidFinishLaunching()。應用程序啓動後將調用這種方法。默認的實現中已經包括了遊戲啓動後的必要準備:

//初始化遊戲引擎控制器 Director,以便啓動遊戲引擎
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLView::create("My Game");
        director->setOpenGLView(glview);
    }

//啓用 FPS 顯示
director->setDisplayStats(true);

 //設置繪製間隔 
director->setAnimationInterval(1.0 / 60);
 
    // create a scene. it's an autorelease object
    auto scene = HelloWorld::createScene();

    // run
    director->runWithScene(scene);

    return true;

這段代碼首先對引擎進行必要的初始化,而後開啓了 FPS 顯示。FPS 即每秒幀速率,也就是屏幕每秒重繪的次數。啓用了 FPS 顯示後,當前 FPS 會在遊戲的左下角顯示。一般在遊戲開發階段,咱們會啓用 FPS 顯示,這樣就可以方便地肯定遊戲運 行是否流暢。


接下來是設置繪製間隔。繪製間隔指的是兩次繪製的時間間隔。所以繪製間隔的倒數就是 FPS 上限。對於移動設備來講。 咱們一般都會將 FPS 限制在一個適當的範圍內。太低的每秒重繪次數會使動畫顯示出卡頓的現象,而提升每秒重繪次數會 致使設備運算量大幅添加。形成更高的能耗。

人眼的刷新頻率約爲 60 次每秒。所以把 FPS 限定在 60 是一個較爲合理的設置,Cocos2d-x 就把繪製間隔設置爲 1/60 秒。函數

至此。咱們已經完畢了引擎的初始化,接下來咱們將啓動引擎。字體


最後也是最關鍵的步驟,那就是建立 Hello World 場景,而後指派 Director 執行這個場景。對於遊戲開發人員而言,咱們 需要在此處來對咱們的遊戲進行其它必要的初始化。好比讀取遊戲設置、初始化隨機數列表等。程序的最末端返回 true。 表示程序已經正常初始化。

void applicationDidEnterBackground()。當應用程序將要進入後臺時,會調用這種方法。詳細來講,當用戶把程序切換 到後臺,或手機接到電話或短信後程序被系統切換到後臺時。會調用這種方法。此時。應該暫停遊戲中正在播放的音樂或 音效。

動做激烈的遊戲一般也應該在此時進行暫停操做。以便玩家臨時離開遊戲時不會遭受重大損失。動畫


void applicationWillEnterForeground()。

該方法與 applicationDidEnterBackground()成對出現,在應用程序回到前臺 時被調用。相對地。咱們一般在這裏繼續播放剛纔暫停的音樂,顯示遊戲暫停菜單等。this


"HelloWorldScene.h"與"HelloWorldScene.cpp"文件。這兩個文件定義了 Hello World 項目中默認的遊戲場景。

Cocos2d 的 遊戲結構可以簡單地歸納爲場景、層、精靈。而這兩個文件就是 Hello World 場景的實現文件。每個遊戲組件都可以加入 到還有一個組件中,造成層次關係,好比場景中可以包括多個層。層中可以包括多個精靈。在興許文章中,咱們將具體解說 Cocos2d 遊戲元素的概念。此處將不具體說明是怎樣建立出 Hello World 場景的。


HelloWorldScene 中定義了一個 HelloWorld 類。該類繼承自 cocos2d::Layer。所以 HelloWorld 自己是一個層。HelloWorld 類包括 一個靜態函數和兩個實例方法,如下咱們來看當中比較重要的兩個成員。

static cocos2d::Scene* createScene()。
在 Cocos2d 中,在層下設置一個建立場景的靜態函數是一個常見的技巧。
咱們爲 HelloWorld 層編寫了 Layer 的一個子類,在子類中爲層加入各類精靈或是邏輯處理代碼。然而咱們的 Hello World 場景十分簡單。 僅僅包括了一個層,沒有不論什麼其它需要處理的問題。所以,咱們除了建立 Scene 的一個子類以外,也可以直接使用靜態函 數來建立一個空場景。再把層置入場景之中。這樣也十分便捷,演示樣例代碼例如如下所看到的:

    // 'scene' is an autorelease object
    auto scene = Scene::create();
    
    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

在這段代碼中, 首先利用 Scene::create方法建立了一個空場景, 而後利用Hello world::create方法建立一個HelloWorld 層的實例,最後調用 scene 對象的 addChild 方法來把建立的層加入到場景之中。


這是咱們第一次見到 addChild 方法,這種方法可以把一個遊戲元素放置到還有一個元素之中。

僅僅有把一個遊戲元素放置到其他已經呈現出來的遊戲元素中,它纔會呈現出來。
比方在這個樣例中,咱們把 HelloWorld 層置入到上面建立的空場景中, 而在前面所述的 AddDelegate 中,咱們已經讓 Director 執行了該場景,所以 HelloWorld 層就會顯示在屏幕上了。

bool init()。

初始化 HelloWorld 類,相關代碼例如如下:spa

//(1) 對父類進行初始化
    if ( !Layer::init() )
    {
        return false;
    }

//(2) 建立菜單並加入到層
    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png",
                                           "CloseSelected.png",
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    
 closeItem->setPosition(Point(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
                                origin.y + closeItem->getContentSize().height/2));

    // create menu, it's an autorelease object
    auto menu = Menu::create(closeItem, NULL);
    menu->setPosition(Point::ZERO);
    this->addChild(menu, 1);

//(3) 建立"Hello World"標籤並加入到層中 
    auto label = LabelTTF::create("Hello World", "Arial", 24);
    
    // position the label on the center of the screen
    label->setPosition(Point(origin.x + visibleSize.width/2,
                            origin.y + visibleSize.height - label->getContentSize().height));

    // add the label as a child to this layer
    this->addChild(label, 1);

//(4) 建立顯示「HelloWorld.png」的精靈並加入到層中
    // add "HelloWorld" splash screen"
    auto sprite = Sprite::create("HelloWorld.png");

    // position the sprite on the center of the screen
    sprite->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

    // add the sprite as a child to this layer
    this->addChild(sprite, 0);

這段代碼可以簡單地劃分爲 4 個部分。

調用父類的 init 方法來進行最初的初始化。

建立關閉程序的菜單並加入到層中。
這裏,咱們遇到了 addChild(Node* child,int zOrder)。與以前遇到的 addChild 方法多 出來了一個參數 zOrder,該參數指的是 child 的 z 軸順序。也就是顯示的前後順序,其值越大。表示顯示的位置就越靠前。
setPosition 方法用來設置遊戲元素的位置。

關於菜單以及如下提到的文本標籤。咱們也會在後面的章節中具體介紹。

建立一個文本標籤並加入到層中,顯示內容"Hello World"。
用"HelloWorld.png"建立一個精靈並加入到層中。最後程序返回 true,表示初始化成功。

此時讀者可能會有疑惑。爲何咱們要在一個實例方法中初始化類,而不在構造函數中初始化呢?

在 C++中,通常習慣在構 造函數中初始化類。然而由於 Cocos2d-x 的來源特殊。因此纔沒有採用 C++的編程風格。

關於編程風格,咱們會在之後的文章中具體討論。


版權聲明:本文博客原創文章,博客,未經贊成,不得轉載。.net

相關文章
相關標籤/搜索