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,錯誤之處,請大家指出.