網站首頁 健康小知識 母嬰教育 起名 運動知識 職場理財 情感生活 綠色生活 遊戲數碼 美容 特色美食 愛好

cocos2d入門教程

欄目: 互聯網 / 發佈於: / 人氣:2.42W

Cocos2d-x初學者教程

準備

(01)Cocos2d-x是一款快速、強大、易用的開源2D遊戲引擎。它與蘋果的Sprit Kit略像,但又有一大優勢——跨平台。這意味着,開發者只需要寫一個版本的代碼就可以開發出能在iOS、Android、Windows Phone、Mac OS X、Windows Desktop和Linux上運行的遊戲來。這對於遊戲開發者來説意義重大。在此教程中,你將學會用Cocos2d-x和C++開發一個簡單的2D遊戲。是的——忍者來襲!注意:本教程假設你擁有C++開發的基礎先修知識。如果你沒有接觸過C++,請學習後再來閲讀。

(02)下載Cocos2d-x的最新版本();本教程使用3.5版本。把文件下載下來,放到你想把Cocos2d-x安裝到的地方,例如你的主目錄,然後解壓。打開Terminal和CD,進入你剛剛解壓的文件夾。例如,如果你把項目放到了你的主目錄裏,那就運行如下命令:cd ~/cocos2d-x-3.5/現在,運行接下來這個命令:python 這裏配置了必要的shell環境變量。若系統出現提示,要求配置像 NDK_ROOT, ANDROID_SDK_ROOT和ANT_ROOT這些Android特有的變量,你只需按三次回車完成設置就好了。注意:Cocos2d需要你在電腦上安裝Python 2.7以上的版本。如果你不清楚目前電腦的Python版本,可以在命令行中輸入python,則版本信息就會被顯示出來(然後按Ctrl-D關閉)。如果你安裝了一個老版本的Python,請在下載安裝最新版本。如下圖所示,腳本文件提示執行另一條命令來完成安裝:

cocos2d入門教程

(03)注意:使用不同的shell可能會導致你看到不同的輸出結果。在上面的屏幕截圖中,由於我使用了Bash,安裝文件提示“source /Users/rwenderlich/bash_profile.”。但如果我用的是Zsh,那它就會提示讓我運行“source /Users/rwenderlich/c”。按照説明輸入命令。這裏有一個節省時間的技巧:你可以在/Users/your_user_name這裏使用波浪線(~),以此來減少你輸入下面這條命令的長度:source ~/c  (or source ~/_profile)此命令重新提交了你的shell配置,讓它可以訪問新變量。現在你可以從任一目錄在Terminal中調用cocos命令了。運行下面的命令,創建一個名為SimpleGame的C++遊戲模板:cocos new -l cpp -d ~/Cocos2d-x-Tutorial SimpleGame你的主目錄裏創建了一個名為Cocos2d-x-Tutorial的目錄。其中,子目錄SimpleGame存放了你的項目文件。注意:可以輸入cocos --help或cocos -h來獲取cocos子命令的相關信息。輸入後綴“--help”或“-h”,你可以瞭解到子命令的各種選項,例如你可以輸入cocos new -h來查看new命令的選項。在Finder中雙擊~/Cocos2d-x-Tutorial/SimpleGame/_mac/eproj,在Xcode中打開項目。進入Xcode之後,請確保SimpleGame Mac處於活躍狀態,如圖所示:

cocos2d入門教程 第2張

(04)Cocos2d-x可以開發多種平台的遊戲,但本教程將着重講開發OS X應用。該項目可以很容易地向其他平台移植(是的,小事一樁!),本教程的最後部分將會簡單討論。在模板項目中編譯並運行你的應用吧:

cocos2d入門教程 第3張

分辨率設定

(01)Cocos2d-x遊戲默認被命名為“MyGame”,分辨率為960x640,但這些細節設定都很容易更改。打開,在AppDelegate::applicationDidFinishLaunching中找到如下一行:glview = GLViewImpl::create("My Game");將其替換為下面的代碼:glview = GLViewImpl::createWithRect("SimpleGame", Rect(0,0, 480, 320), 1.0);這樣,遊戲名稱被改為“SimpleGame”,分辨率也被設置成了與模板背景相適配的480x320。重新編譯並運行新版應用,它變得更小了:

cocos2d入門教程 第4張

(02)注意一下你給createWithRect設定的第三個參數——1.0。這個參數將框架進行縮放,經常被用於測試比你的屏幕更大的分辨率。例如,想在一個小於1920x1080的屏幕上測試1920x1080分辨率的東西,你可以設定參數為0.5,以此將窗口縮小到960x540的大小。這樣雖然改變了遊戲在桌面設備上的框架大小,但它在iOS設備上就失效了;遊戲的分辨率會自動適配iOS設備的屏幕大小。這裏以iPhone6為例:

cocos2d入門教程 第5張

(03)你該如何處理多個分辨率呢?在本教程中,你將會創建基於960x640分辨率的單個遊戲資源,然後在實際運行中將其進行必要的縮放。要想實現這一點,你需要在AppDelegate::applicationDidFinishLaunching中,找到director上setDisplayStats的上一行,添加以下代碼:

cocos2d入門教程 第6張

(04)上面的代碼的作用如下:定義了designSize——你創建遊戲邏輯時使用的尺寸,並定義了resourceSize——你的資源所基於的分辨率。必要的時候,這些代碼會讓遊戲的Director對資源進行縮放,縮放會基於遊戲的設計和提供的資源尺寸進行

添加精靈

(01)接下來,下載項目所需要的資源文件,並且將其解壓到方便的位置。全選你剛剛解壓的SimpleGameResources文件夾中的文件,在你的Xcode項目中將它們拖入Resources組中。當有對話框彈出的時候,一定要在點Finish之前檢查Copy items if needed, SimpleGame iOS 和 SimpleGame Mac。

cocos2d入門教程 第7張

(02)接下來,打開HelloWorldScene.h,在include cocos2d.h後面的地方添加以下代碼:    using namespace cocos2d;這就指定了你會使用cocos2d這一命名空間(namespace);於是,你可以用Sprite來代替cocos2d::Sprite。倒也不是非這樣不可,但這會讓你的開發過程變得愉快一些。:]現在,你需要一個私有成員變量來指向你的player精靈。在HelloWorld的聲明語句中添加以下代碼:

cocos2d入門教程 第8張

(03)然後,打開,將HelloWorld::init方法中的內容換成以下內容:

cocos2d入門教程 第9張

(04)下面是本方法的詳細説明:首先,調用父類的init方法。只有調用成功後你才能繼續HelloWorldScene的安裝。其次,使用遊戲的Director singleton來獲取窗口的邊界。再次,創建DrawNode,繪製了一個填充屏幕的灰色矩形,並將其添加到場景中。這成為了遊戲的背景。最後,通過圖像名稱創建player精靈。將它放置在屏幕左邊界10%距離的地方,垂直居中,並將其添加到場景中。編譯並運行遊戲;哈哈,父老鄉親們快來看啊,小忍者進村了!:]

cocos2d入門教程 第10張

移動的怪物

(01)忍者需要一個人生目標,所以得在場景裏添加點怪物讓他去打。為了讓遊戲更好玩,怪物最好能來回走動——否則就會看起來沒啥挑戰性。我們要在屏幕右側很近的地方創建怪物,然後創建一個動作來讓他們移動到左側。首先,打開HelloWorldScene.h,並且添加如下的方法聲明:

cocos2d入門教程 第11張

(02)然後,在中添加如下的方法實現:

cocos2d入門教程 第12張

(03)雖然相對而言比較直白,但下面還是講一下這些代碼的作用:本方法第一部分與之前對player做的相似:創建一個怪物的精靈,將其放置在緊靠屏幕右側的地方。它的y軸座標被設定為隨機,這樣才好玩。接下來設定怪物動作的時長,本方法在2秒和4秒之間計算出了一個隨機值。每個怪物都要在屏幕上移動相同的距離,所以時長的隨機性導致了怪物們速度的隨機性。最後,本方法創建了一個讓怪物從右到左橫穿屏幕的動作,並且讓怪物去執行這個動作。對此本文後面會有更詳細的解釋。Cocos2d-x提供了很多非常便捷的內置動作,它們可以幫助你隨着時間輕鬆改變精靈的狀態,包括移動動作、旋轉動作、淡出動作、動畫動作,等等。在此,你在怪物身上用到了3個動作:MoveTo:在一定的時間內將對象從一個點移動到另一個點。RemoveSelf:將一個節點從其父節點中移除,從而有效地將其從場景中“刪除”。在本例中,當怪物變得不可見時,你使用此動作來把怪物從場景中移除。這非常重要,否則就會有無限多的怪物出現,最終耗盡設備的資源。Sequence:允許你按順序實現一系列的其他動作,每次實現一個。這意味着,你可以讓怪物移動穿過整個場景,到達特定的位置之後再將其從屏幕上移除。在你的忍者粉墨登場之前,還有最後一件事情——你需要實際地調用這個方法來創建怪物。為了讓遊戲更有趣,你需要不停地量產怪物。很簡單,在HelloWorld::init末尾return之前的地方,添加如下代碼:  srand((unsigned int)time(nullptr));  this->schedule(schedule_selector(HelloWorld::addMonster), 1.5);srand((unsigned int)time(nullptr));語句初始化了隨機數生成器。如果不執行這一步,每次運行程序都會產生一樣的隨機數。這還叫什麼隨機啊對不對?:]之後,你向schedule方法傳遞HelloWorld::addMonster,每隔1.5秒它將調用一次addMonster()。這裏,Cocos2dx使用了C++的指針來整合函數。如果你不太懂它的原理的話,請去ioscpp查閲更多信息。好了!編譯並運行你的項目;現在你應該可以看到怪物們正在歡樂地(或者本例中它們看上去其實挺憤怒的!)在屏幕中來回移動了:

cocos2d入門教程 第13張

發射飛鏢

(01)勇敢的小忍者需要保護自己。在遊戲中有很多種方式可以實現開火,但在本例中你將使用點擊屏幕的方式,將飛鏢朝玩家點擊屏幕的所在的方向發射出去。biubiu!:]方便起見,你要用MoveTo動作來完成這個效果——現在我們不得不做點數學題了。MoveTo動作需要為飛鏢設定一個目的地,但是你不能直接使用輸入的地址,因為那個點只代表了發射時候相對於玩家的方向。你需要讓飛鏢一直沿着這個方向移動直到最終到達屏幕外的目的地。下圖説明了這一情況:

cocos2d入門教程 第14張

(02)從原始點到接觸點的x座標距離和y座標距離組成了一個小三角形;你只需要按照同樣的比率做一個大三角形——你還清楚自己希望一個端點是處於屏幕之外的。這些計算是以Cocos2d-x所包括的向量數學程序來執行的。但是,在你能夠計算往何處移動之前,你需要啟用輸入事件操作來獲取用户點擊的位置。將以下代碼添加至HelloWorld::init的末尾、return之前的地方:    auto eventListener = EventListenerTouchOneByOne::create();    eventListener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);    this->getEventDispatcher()-    >addEventListenerWithSceneGraphPriority(eventListener, _player);Cocos2d-x 3及以上版本使用EventDispatcher來處理各種各樣的事件,如觸摸、加速計和其他鍵盤事件。注意:整篇的討論中,“touch”指的是觸屏或者點擊。Cocos2d-x對於這兩種事件類型採取相同的方法。為了從EventDispatcher中獲取事件,你需要註冊一個EventListener。有兩種觸摸事件的監聽器:EventListenerTouchOneByOne:此類型對每個觸摸事件調用一次回調方法。EventListenerTouchAllAtOnce:此類型對所有的觸摸事件調用一次回調方法。每個事件監聽器支持4個回調,但你只需要為自己關心的事件綁定方法。onTouchBegan:手指第一次碰到屏幕時被調用。如果你使用的是EventListenerTouchOneByOne,你必須返回true才能獲取另外3個觸摸事件。onTouchMoved:手指接觸屏幕並移動(保持接觸)時被調用。onTouchEnded:手指離開屏幕時被調用。onTouchCancelled:在特定的結束事件處理的環境中被調用,如你正在觸屏的時候,一個電話打了進來打斷了這個app進程。在本遊戲中,你只用關心觸摸發生的時間就好了。聲明你的回調函數來在HelloWorldScene.h中獲取觸摸的通知,像這樣:bool onTouchBegan(Touch touch, Event unused_event);然後,在中執行你的回調函數:

cocos2d入門教程 第15張

(03)上面的這個方法比較複雜,讓我們來一步一步回顧一下。第一行被註釋掉了,但它説明了作為第二個參數傳遞給addEventListenerWithSceneGraphPriority(eventListener, _player)的_player對象被訪問的方式。此處獲取了場景座標系中觸摸的座標,然後計算了這個點相對於玩家當前位置的偏移量。這是Cocos2d-x中向量數學的一個例子。如果offset的x值是負值,這表明玩家正試圖朝後射擊。在本遊戲中這是不允許的(真正的忍者不會往後看!),所以只需要返回就好了,不用發射飛鏢。在玩家所在的位置創建一個飛鏢,將其添加到場景中。之後,調用normalize()來將偏移量轉化為單位向量,即長度為1的向量。將其乘以1000,你就獲得了一個指向用户觸屏方向的長度為1000的向量。為什麼是1000呢?因為長度應當足以超過當前分辨率下屏幕的邊界。:]將此向量添加到飛鏢的位置上去,這樣你就有了一個目標位置。最後,創建一個動作,將飛鏢在2秒內移動到目標位置,然後將它從場景中移除。編譯並運行程序;點擊屏幕,讓你的忍者朝着敵人們發射吧!

cocos2d入門教程 第16張