windows開發cocos2d-x系列(2)—簡單解析HelloWorld

來源:互聯網
上載者:User

標籤:

前言

  上一篇介紹了cocos2d的環境搭建,今天我們來一起運行,編寫,以及解析cocos2d-x 3.0的HelloWorld。程式雖小,五髒俱全。

建立一個HelloWorld

  我們開始自己建立HelloWorld吧。首先開啟windows的cmd視窗,然後在cmd中輸入以下命令:

  cocos new HelloWorld -p com.momo.helloWorld -l cpp -d projects

  HelloWorld就是項目名稱,-p後面接著的就是項目的包名,-l後面指定語言版本,-d後面指定項目路徑,這裡直接輸入projects,那麼我們的路徑就是:    C:\Users\Administrator\projects\HelloWorld  cocos是一個指令碼,如果報錯說找不到這個命令,那麼,可以使用全路徑命令:  F:\cocos2d-x-3.0\tools\cocos2d-console\bin\cocos new HelloWorld -p com.momo.helloWorld -l cpp -d projects  如果出現‘phython‘不是內部或外部命令,也不是可啟動並執行程式或批次檔的錯誤,是因為沒有把Python添加到環境變數中。  最後進入我們的項目目錄,開啟proj.win32目錄下的HelloWorld.sln檔案,這樣一個HellowWorld項目的建立就完成了。HelloWorld是如何顯示到視窗的

  我們開啟項目中的AppDelegate.cpp檔案,我們只看applicationDidFinishLaunching函數,如下代碼所示:

 1 bool AppDelegate::applicationDidFinishLaunching() { 2     // initialize director 3     auto director = Director::getInstance(); 4     auto glview = director->getOpenGLView(); 5     if(!glview) { 6         glview = GLView::create("My Game"); 7         director->setOpenGLView(glview); 8     } 9 10     // turn on display FPS11     director->setDisplayStats(true);12 13     // set FPS. the default value is 1.0/60 if you don‘t call this14     director->setAnimationInterval(1.0 / 60);15 16     // create a scene. it‘s an autorelease object17     auto scene = MyHelloWorldScene::createScene();18 19     // run20     director->runWithScene(scene);21 22     return true;23 }
View Code

 

  • director->setDisplayStats(true):設定是否顯示遊戲的幀數等調試資訊。
  • director->setAnimationInterval(1.0 / 60):設定遊戲的幀率,在這裡是每秒60幀。
  • auto scene = MyHelloWorldScene::createScene():建立一個情境。
  • director->runWithScene(scene):最重要的地方,讓情境類顯示出來。

  幀是遊戲開發裡一個很重要的概念。在程式世界裡,其實一切都是靜止的,之所以能夠看到遊戲在不斷的運動,是因為很多靜止的畫面快速連續切換產生的錯覺。就跟那些漫畫家畫的動漫是相似的。

情境介紹

  現在來分析情境類,先看HelloWorldScence.h標頭檔,如下代碼所示:

 1 #ifndef __HELLOWORLD_SCENE_H__ 2 #define __HELLOWORLD_SCENE_H__ 3  4 #include "cocos2d.h" 5  6 class HelloWorld : public cocos2d::Layer 7 { 8 public: 9     // there‘s no ‘id‘ in cpp, so we recommend returning the class instance pointer10     static cocos2d::Scene* createScene();11 12     // Here‘s a difference. Method ‘init‘ in cocos2d-x returns bool, instead of returning ‘id‘ in cocos2d-iphone13     virtual bool init();  14     15     // a selector callback16     void menuCloseCallback(cocos2d::Ref* pSender);17     18     // implement the "static create()" method manually19     CREATE_FUNC(HelloWorld);20 };21 22 #endif // __HELLOWORLD_SCENE_H__
View Code

  menuCloseCallback是一個回呼函數。

  createScene函數是不可缺的,在cocos2d-x 3.0裡,都通過這樣的方式來建立一個情境對象。

  再來看看CREATE_FUNC(HelloWorld),CREATE_FUNC是一個宏。宏是c/c++中的一種先行編譯手段,比如我們定義一個字串MAX_NUM,規定它代表10,那麼在程式裡所有的MAX_NUM在編譯裡都會用10來代替。

#define MAX_NUM 10

  #define是c++的關鍵字,用來標明一個宏。CREATE_FUNC就是一個宏函數,來看看它的具體實現,如下代碼所示:

 1 #define CREATE_FUNC(__TYPE__)  2 static __TYPE__* create()  3 {  4     __TYPE__ *pRet = new __TYPE__();  5     if (pRet && pRet->init())  6     {  7         pRet->autorelease();  8         return pRet;  9     } 10     else 11     { 12         delete pRet; 13         pRet = NULL; 14         return NULL; 15     } 16 }
View Code
  • 用#define定義,並且沒有傳回值;
  • 參數沒有類型,只有參數名;
  • 每一行結尾處都有一個"\"符號(宏定義只能是一條語句,\用於換行,表面上讓我們看起來是多行代碼,實現對編譯器來說,只有一行。這樣我們也可以方便地看代碼)

  參數__TYPE__也是個宏,這個宏函數裡所有出現__TYPE__的地方都會被替換成我們傳入的HelloWorld。

  我們再看HelloWorldScene.cpp中的createScene函數的實現,如下代碼所示:

 1 Scene* HelloWorld::createScene() 2 { 3     // ‘scene‘ is an autorelease object 4     auto scene = Scene::create(); 5      6     // ‘layer‘ is an autorelease object 7     auto layer = HelloWorld::create(); 8  9     // add layer as a child to scene10     scene->addChild(layer);11 12     // return the scene13     return scene;14 }
View Code
  • auto scene = Scene::create():建立一個情境類。這個情境並不是HelloWorld本身。
  • auto layer = HelloWorld::create():建立HelloWorld對象,create函數正是用宏 CREATE_FUNC(HelloWorld)定義的。
  • scene->addChild(layer):將layer對象添加到scene對象中。
  • return scene:返回scene對象。

  另外解釋一下,auto是c++的關鍵字,用來聲明自動變數,相當於c#中的var關鍵字。

小結

  最後我們再梳理一遍:

  • 通過auto scene=HelloWorld::createScene()建立一個情境對象;
  • HelloWorld的createScene函數裡建立了一個情境對象(Scene),然後將HelloWorld對象(Layer)添加到情境對象;
  • HelloWorld對象通過create函數建立,而create函數是由宏CREATE_FUNC(HelloWorld)來定義的;
  • 通過direcor->runWithScene(scene)才讓情境對象顯示在視窗中。

  到這裡,HelloWorld就介紹完了,後續我們會再介紹cocos2d-x 3.0中關鍵的一些類。

windows開發cocos2d-x系列(2)—簡單解析HelloWorld

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.