您好,登錄后才能下訂單哦!
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,錯誤之處,請大家指出.
免責(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)容。