4、Cocos2dx 3.0三,找一个小游戏开发Hello World 分析
生活随笔
收集整理的這篇文章主要介紹了
4、Cocos2dx 3.0三,找一个小游戏开发Hello World 分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
尊重開發人員的勞動成果。轉載的時候請務必注明出處:http://blog.csdn.net/haomengzhu/article/details/27186557
Hello World 分析
打開新建的"findmistress"項目,能夠看到項目文件是由多個代碼文件及目錄組成的。當中 Hello World 的代碼文件直接存放于該項目目錄中。以下我們來具體介紹一下項目的文件組成。 1."resource" 該目錄主要用于存放游戲中須要的圖片、音頻和配置等資源文件。為了方便管理。能夠在當中創建子目錄。
還記得上一節我們執行起來的游戲嗎?游戲中顯示的 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 限制在一個適當的范圍內。過低的每秒重繪次數會使動畫顯示出卡頓的現象,而提高每秒重繪次數會導致設備運算量大幅添加。造成更高的能耗。
最后也是最關鍵的步驟,那就是創建 Hello World 場景,然后指派 Director 執行這個場景。對于游戲開發人員而言,我們須要在此處來對我們的游戲進行其它必要的初始化。比如讀取游戲設置、初始化隨機數列表等。程序的最末端返回 true。表示程序已經正常初始化。
void applicationDidEnterBackground()。當應用程序將要進入后臺時,會調用這種方法。詳細來說,當用戶把程序切換到后臺,或手機接到電話或短信后程序被系統切換到后臺時。會調用這種方法。此時。應該暫停游戲中正在播放的音樂或音效。
void applicationWillEnterForeground()。
"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()。
//(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++的編程風格。 關于編程風格,我們會在以后的文章中具體討論。
Hello World 分析
打開新建的"findmistress"項目,能夠看到項目文件是由多個代碼文件及目錄組成的。當中 Hello World 的代碼文件直接存放于該項目目錄中。以下我們來具體介紹一下項目的文件組成。 1."resource" 該目錄主要用于存放游戲中須要的圖片、音頻和配置等資源文件。為了方便管理。能夠在當中創建子目錄。
在不同平
臺下,對于文件路徑的定義是不一致的,但實際接口大同小異。Cocos2d-x 為我們屏蔽了這些差異,當中"resource"文件夾
能夠默覺得游戲執行時的文件夾。還記得上一節我們執行起來的游戲嗎?游戲中顯示的 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()成對出現,在應用程序回到前臺?
時被調用。相對地。我們通常在這里繼續播放剛才暫停的音樂,顯示游戲暫停菜單等。"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 類,相關代碼例如以下:
//(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++的編程風格。 關于編程風格,我們會在以后的文章中具體討論。
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
轉載于:https://www.cnblogs.com/bhlsheji/p/4742615.html
總結
以上是生活随笔為你收集整理的4、Cocos2dx 3.0三,找一个小游戏开发Hello World 分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HW--漂亮度2(测试通过)
- 下一篇: 判断一个图中有无环路的存在