此篇文章是筆者網搜看到之blog文章,因講的是目前釋出版本之最新技術與概念,因極具參考價值故予節錄(刪除iOS部份,只保留Android講述內容),原文為E文,已轉譯為中文並稍作潤稿予以修飾(圖形則截錄原稿以保留初衷),若有意啃E文可參考下列網址:
筆者在譯文前想作的聲明與心得:初入學習cocos2d-x作遊戲引擎領域之程序員,常會因環境設置弄得有點心灰意冷(心浮氣躁),爬文看網路文章又像大海撈針一樣毫無頭緒(※此過程筆者是過來人),若無師父領進門,一時之間要”快速”學會某一專業領域何其困難,瓶頸重重讓很多有心無力的程序員打退堂鼓,此篇博文原作者講解過程非常清楚,圖文並茂可供對照外,最主要的是會補述一些概念以強化學習觀念(※筆者建議看文章一定要做到此點,融會貫通以打通任督二脈,以後發現問題自己才有解決方案之能力,否則效果有限),一般而言,筆者是不作翻譯這檔事(※非筆者本行專業),撰文此篇之動機是受某公司專案之委託訓練而寫的,期因筆者當初以此原博文作教案,受訓學員看了一個禮拜還擺不平系統,奢談後續作業,反彈超大的(*究其原因是看不慣E文,有看沒懂,抓不到重點),當然Y,筆者也被K叮了,想關我何事,學員E底不佳應不是我能力所及的,但退一步想當初筆者從前也是這樣懵懂亂做,從做中學發現問題至解決,一路自學不知走了多少冤枉路,以前沒網路可用,都是自行埋頭苦幹找資料問高手學經驗,現在網路四通八達隨處拈來即可使用,有問題時上網丟出等著檢現成(懶人作法),或Google網搜資料一個一個慢慢看(勤者作法),其實專業論壇最好用(高等作法之一),有人耕耘有人收穫,其次是技術博客也可加善用(高等作法之二),有人問寫博客之目的是要幹嘛,沒事找事做,能賺錢嗎?各說對了一半,經營blog主要可分享所學及經驗交流,藉由同好雙向溝通討論以促使自我鞭策之成長,再則提昇個人價值能力,以後錢就滾滾而來。扯遠離題了,切回至主題,目前技術之發行均是採全球化行銷,想獲取第一手最新資料當然得從官網著手,其它的都是衍生的旁枝末節技術,不是不能看,是要過濾消化的(※說真的有些人的技術文章連筆者都實作不出其結果),既是官網是主流且又是E文,那你接下來要如何做呢?不看(※E文能力不好)便學不到技術重點,等別人消化完再看(※但想他一定會post文嗎?),沒有自我學習之動能及克服學習障礙是永遠學不到核心技術的(※筆者講到重點了,從頭到尾閒扯淡舖陳一些題外話,筆者最終就是要傳達這個訊息,懂了嗎?程式設計所學為何又如何學,該學到何境界?很多學問~~~~筆者不是通才,我只會回答我懂的~我會的~我知道的~至於其它,莫知奈~~~~~say sorry
sorry………)。看完本譯文再去看原E文,可告知你的想法嗎,千莫留文:翻譯好爛,爛爆了~~~~~K人哦!!!!!
了解如何創建一個簡單的iPhone和Android遊戲的Cocos2D-X!
此文適用於全面更新的Cocos2D-X
2.1和iOS 6及Android。原Cocos2D是一個驚人且易於使用的遊戲框架,但因為它是在Objective-C編寫的,你只可以寫遊戲限於iOS和Mac平台上,故那不是巨大的,如果你可以使用相同的且容易使用Cocos2D API,使之運行在Android嗎?如此便可以大大延長你的應用程序的市場,使得增加了很多額外的收入!此即為被提出之Cocos2D-X遊戲框架! Cocos2D-X是一個以C + +語言為基礎之Cocos2D API的端口,你可以使用這個API如你所知道和喜愛的,因為它是在C + +上,所以它可工作在許多平台上 ---從iOS到Android到Windows到Linux和更多!
在此篇Cocos2D-X教程中,您將學習如何使用Cocos2D-X和C + +來產生一個跨平台之“Hello World”應用範例程式,使之運行在iOS和Android平台上。過幾天後,我會發布後續的Cocos2D-X教程,將告訴你一個實際遊戲的例子 ---一個跨平台的太空射擊遊戲!因此,拿起你的iPhone或Android設備,並讓我們開始吧! (※此射擊遊戲之開發是原文作者提出的,筆者也在研究中~)
你好,針對Android的Cocos2D-X!
現在讓我們做一個在Android平台之“Hello World”Cocos2D-X範例教程,但是,您將需要通過命令行來做到這一點,因為此時刻尚沒有任何的Cocos2D-X專案模板可以通過Eclipse IDE。(你知道嗎,這將是可作為候選之一個偉大的開源專案,如果你有這樣的傾向:])
$ COCOS2DX_HOME目錄中包含一個shell腳本命名create_Android_project.sh,您可使用此檔案以產生Android專案。但是,在第一次啟動這個shell腳本,你需要於上述文件的頂部做一個微小的設定修訂:
#設置環境參數研究
NDK_ROOT_LOCAL
=“/ home/laschweinski/android/android-ndk-r8d”
ANDROID_SDK_ROOT_LOCAL
=“/ home/laschweinski/android/android-sdk-linux_86”,
修改上述這些行使得NDK_ROOT_LOCAL指向你安裝的Android NDK($ NDKROOT)及ANDROID_SDK_ROOT_LOCAL為你安裝了Android SDK 所在的目錄。
現在可於命令行中運行create_Android_project.sh腳本,你會得到一些各種輸入值之提示,這些提示要求您提供以下信息:(※註:此原文作者之平台為Linux,若為Windows平台可參考筆者post之環境建置文章,本篇主要是學習整體之概念)
1. 第一個提示會問你“輸入包(package)的路徑”,這是將用於產生java代碼的軟件包名稱,您可以使用反向域符號(類似於iOS bundle
ID)---如com.yourdomain.samplecocos2dxandroid(記得以反向域名表示,並取代com.yourdomain為您的實際域名)
2.
接下來,你會得到一個可用的Android API和它們的ID列表,此會根據你的機器上所安裝的,列表將有所不同,在這個階段的提示只是要求您的應用程式將支持的Android
API Level,如最後一個清單是一個谷歌API的列表,你可以設定使用此id數字。
3.
最後,您必須提供的專案名稱,如可稱為samplecocos2dxandroid。
從上述過程中的命令行輸出將看起來像下面這樣:
bash-$ ./create-android-project.sh
Input package path. For example: org.cocos2dx.example
org.jymc.samplecocos2dxandroid
. . .
Available Android targets:
----------
. . .
----------
id: 25 or "Google Inc.:Google APIs:17"
Name: Google APIs
Type: Add-On
Vendor: Google Inc.
Revision: 2
Description: Android + Google APIs
Based on Android 4.2.2 (API level 17)
. . .
input target id:
25
input your project name:
samplecocos2dxandroid
Created project directory:
/Users/jymen/development/cocos2dx/samplecocos2dxandroid/proj.android
. . .
Added file /Users/jymen/development/cocos2dx/samplecocos2dxandroid/AndroidManifest.xml
Added file /Users/jymen/development/cocos2dx/samplecocos2dxandroid/build.xml
Added file /Users/jymen/development/cocos2dx/samplecocos2dxandroid/proguard.cfg
bash-$
注意腳本輸出接近尾端所創建之專案目錄,這就是你的Android專案已經由腳本創建,專案位置(在上述例子為/Users/jymen/development/cocos2dx/samplecocos2dxandroid)從現在開始將被稱為$PROJECT_HOME。
注意:不要試圖將專案從該位置移動到不同的位置,如果你這樣做,因至少會有一個腳本,致使你會在下一節將無法正常工作。
建立專案
在Eclipse編譯Java代碼時有兩個執行步驟:建立專案及編譯C + +代碼之命令行腳本。但是,在編譯之前,你需要定義NDK_ROOT參數使其指向$ NDKROOT目錄,打開$ PROJECT_HOME / proj.android / build_native.sh之 shell腳本,並在該文件的頂部添加下面一行:
#paths
NDK_ROOT
=“/ home/laschweinski/android/android-ndk-r8d”
修改上述行NDK_ROOT變數指向你的Android
NDK($ NDKROOT)安裝目錄。當要編譯C + +代碼,則通過命令行切換到$ PROJECT_HOME / proj.android目錄之目錄,並鍵入以下命令:
./
build_native.sh
注:如果在此時你所得到的消息為“please define NDK_ROOT”,則表示你必須確保已在上述步驟正確地指定到你的Android
NDK根目錄。
由上面命令之輸出響應,你應該看到一些類似以下的輸出:
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Compile++ thumb : cocos2d <= CCConfiguration.cpp
Compile++ thumb : cocos2d <= CCDrawingPrimitives.cpp
:
:
:
Compile++ thumb : cocos2d <= CCTileMapAtlas.cpp
Compile++ thumb : cocos2d <= CCTouchDispatcher.cpp
Compile++ thumb : cocos2d <= CCTouchHandler.cpp
Prebuilt : libstlport_static.a <= /sources/cxx-stl/stlport/libs/armeabi/
SharedLibrary : libcocos2d.so
Install : libcocos2d.so => libs/armeabi/libcocos2d.so
Compile++ thumb : cocosdenshion <= SimpleAudioEngine.cpp
Compile++ thumb : cocosdenshion <= SimpleAudioEngineJni.cpp
SharedLibrary : libcocosdenshion.so
Install : libcocosdenshion.so => libs/armeabi/libcocosdenshion.so
Compile++ thumb : game_logic <= AppDelegate.cpp
Compile++ thumb : game_logic <= HelloWorldScene.cpp
SharedLibrary : libgame_logic.so
Install : libgame_logic.so => libs/armeabi/libgame_logic.so
Compile++ thumb : game <= main.cpp
SharedLibrary : libgame.so
Install : libgame.so => libs/armeabi/libgame.so
這將為您的專案生成C + +的Cocos2D-X庫和C + +代碼。
您將創建一個Eclipse專案以構建Java代碼---這比通過命令行的方式更容易些:]
啟動Eclipse並在 File\New\Other. 下選擇Android\Android Project from Existing Code,並單擊“ Next “。單擊“ Browse “,選擇$ PROJECT_HOME / proj.android目錄,如下圖所示。
單擊“ Finish“,至此你現在有一個專案!
注意:預設情況下,Android的構建目標是2.2,但須改變它使用最新的版本。要做到這一點請從主功能表選擇Project\Properties,在左側列表中選擇Android,並選擇Android 4.2.2,且請確保您已配置了一個AVD 取名 為4.2.2。如果您需要了解更多信息,可檢出Getting Started with Android Development 教程。
此時,該專案可能會有一些錯誤,但不要害怕,他們是很容易解決的:
產生的錯誤之一,因為Eclipse無法找到 “@drawable/icon”資源,在左邊展開專案樹狀結構,打開AndroidManifest.xml文件,並更改AndroidManifest.xml視窗為純文本模式,請看下面這行代碼:
|
將改變它為正確的圖標名稱:
|
<application android:label="@string/app_name"
android:icon="@drawable/ic_launcher">
|
在關閉AndroidManifest.xml文件之前,修改android:minSdkVersion為:
|
<uses-sdk
android:minSdkVersion="14"/>
|
之後再儲存該文件。
產生之第二個錯誤是因為Eclipse不能找到一些Cocos2D-X之Java類,從主功能表中選擇Project\Properties,在左邊的列表中選擇Java Build
Path,並在“ Source “標籤中,單擊Link Source和Browse 到以下目錄
$
COCOS2DX_HOME/cocos2dx/platform/android/java/src /
此處$
COCOS2DX_HOME指的是安裝Cocos2D-X資源所在之目錄,在Folder name輸入cocos2dx-src,單擊“ Finish “和“OK”完成。
目前該專案沒有錯誤了,很容易吧?
現在,您可以運行它,在左邊樹狀結構中右鍵單擊該專案,選擇 Run As\Android Application,Android虛擬設備(AVD)將顯示Cocos2D-X專案之Hello
World結果(可能它不工作,請再繼續往下閱讀):
如果應用程式沒有在模擬器上顯示出預期果且 Eclipse之LogCat視窗顯示錯誤訊息java.lang.IllegalArgumentException:
No config chosen,此是由於新的AVD設定中OpenGL ES 2.0的一個問題。為了解決這個問題,你必須採取兩個步驟:
1)進入到 Android Virtual Device Manager,選擇您使用之AVD項目,然後單擊“Edit”,然後確保Use Host GPU複選框被選中,如下圖所示:
2)現在打開samplecocos2dxandroid/cocos2dx-src/org.cocos2dx.lib/Cocos2dxActivity.java,尋找init()方法:
在
this.mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); |
之前添加:
this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer()); |
現在嘗試再次運行它 ,期望這一次它應該工作。配置一個Android虛擬設備的更多細節,可檢出Getting Started with Android Development教程。恭喜,你現在有一個 “Hello World”專案運行於Android!
定義一個聯合Java / C + +專案在Eclipse中
在Eclipse中作編譯C + +代碼的命令行腳本和編譯Java代碼是很累贅的工作,在此這將變得容易得多,你僅僅使用Eclipse來構建一切工作。幸運的是,你可以做到這一點告訴您的Eclipse是合併Java / C + +跨語言的Android專案!
要做到這一點,在左邊的樹狀結構中選擇samplecocos2dxandroid專案,然後從功能表選擇 File\New\Other,再從對話框選取C/C++\Convert
to a C/C++ Project 項,如下圖所示:
單擊“ Next “,並在接下來的畫面中,勾選您的專案核取框,再選取C++ Project 選項,並指定專案類型為Makefile project\Other Toolchain項。
單擊“ Finish“完成,Eclipse可能會發生這種情況,問你是否想打開C / C + +透視視窗,只需點擊No關閉。
下一步是要更改專案設置以指定如何運行make命令,在左側樹狀結構中,以右鍵單擊在samplecocos2dxandroid專案,選擇“ Properties “,選擇C/C++ Build項。
取消選中“ Use default
build command”複選框,並在build command文本類型框中輸入:
bash ${workspace_loc:/samplecocos2dxandroid}/build_native.sh NDK_DEBUG=1 V=1
單擊“ Apply“,然後單擊“OK”完成。之後再從主功能表中選擇Project\Build All,你會看到C + +編譯運行於Eclipse控制台:
還有一些警告須來解決,要看出我表示的意義,開拓JNI / hellocpp / main.cpp中,你會看到一堆警告:
這些發生的警告是因為你尚未正確地指定C + +程式之包含路徑,要做到這一點,在左邊的樹狀結構中,以右鍵單擊在samplecocos2dxandroid專案並選擇Properties\C/C++
General\Paths and Symbols\Includes\GNU C+項,再使用“ Add “按鈕以增加如下圖所示這兩個目錄,然後單擊“ Apply “和“OK”完成。
$(NDKROOT)/ platforms/android-14/arch-arm/usr/include
$(COCOS2DX_HOME)/ cocos2dx/include
注意:不要忘記將$(NDKROOT)和 $(COCOS2DX_HOME)替換為你安裝了這些在您的機器上的實際路徑。
單擊“ Apply“後你可能會被提示須重新構建索引,勇往直前地說“ Yes “,然後單擊“OK”關閉對話框。現在,如果你看一下在main.cpp中,你會看到大多數包含警告訊息已經消失:
然而, AppDelegate.h文件仍然不能被發現,這是因為AppDelegate.h文件位於$ PROJECT_HOME \ Classes下目錄,此目錄是非常重要的,因為它為您的專案包含可移植的C + +類,如HelloWorldScene.cpp作為您的專案起點。
當您創建Eclipse專案時,你必須選擇$
PROJECT_HOME \ proj.android作為根目錄,且 Eclipse需要於AndroidManifest.xml中包含指定目錄在內,但是,這意味著你的專案並不包含關鍵Classes 目錄,這就是為什麼你仍然得到這一警告的原因。
讓我們來解決它。在左側樹狀結構中,以右鍵單擊在samplecocos2dxandroid專案,並選擇Properties\C/C++
General\Paths and Symbols\Source Location,點擊Link Folder,請勾選 Link to a folder in the file system 複選框,並browse 裡面$
PROJECT_HOME目錄中Classes 目錄,單擊“OK”,然後單擊“ Apply “和“OK”。
您現在應該能夠看到在您的文件樹Classes目錄,和#include “AppDelegate.h”預警應該已經消失在main.cpp中。
Eclipse在該專案中仍存有一些警告,但是這僅僅是因為Eclipse不是很強大地可解析C + + header文件的代碼分析型式,故要禁用此功能,來到專案屬性(右鍵單擊該專案,並從上下文功能表中選擇“ Properties “),並關閉警告Code Analysis項,你可以看到下面的截圖:
最後單擊“ Apply “,然後“OK“ ----您已可在Eclipse中編輯和構建一個專案!:]
關於Java代碼是什麼?
如果你在Eclipse中看以上的專案內容,你會發現一些Java代碼在src 和gen 目錄,你可能不知道它有關之意義。Android開發的主要語言是Java,專案模板會創建一些Java腳架代碼給你,並在您的應用程式搭載所有繁重之C + +代碼,通常你不會去修改Java代碼,但讓我們來看看更詳細的主類--- src\com\xxx\samplecosos2dxandroid\samplecocos2dandroid.java ---看它是做什麼。這個類包含了應用程式Android啟動時需要控制之Activity類,它會先搭載請求NDK以生成C + +的動態庫:
由於這類自Cocos2dxActivity衍生,幕後的Cocos2D-X將會給予AppDelegate初始化方法以控制C + +程式,最後調用applicationDidFinishLAunching方法,依此重複,此類中只包含Java封裝代碼,故你很少需要會去改變它,因為所有遊戲的邏輯均被封裝在C + +代碼裡面。
結合iOS和Android專案結構
你可有兩個的Cocos2D-X專案 ----一個分別用於iOS和Android,你的目標是讓他們分享彼此相同的目錄,這樣就可以在這兩個專案中使用相同的C + +資料夾(在您的手攜式遊戲邏輯)。您在這兩個專案中,你有一個 包含此手攜式遊戲代碼名為Classes之目錄,如下:(Android在左邊,iOS在右邊):
如果你仔細看,你會看到在Eclipse和Xcode的classes目錄,其C + +文件是完全一致的!因此,你需要做的是設置這兩個專案指向相同的目錄!
要做到這一點,open 在Xcode之專案Cocos2DxFirstIosSample,並選擇Classes 類目錄,單擊“ Delete “,然後於彈出視窗中選擇“ Move to Trash“。接下來,在Project
Navigator右鍵單擊該專案,選擇“New Group”,重命名為新的Classes類,右鍵點擊此Classes類,並選擇“ Add Files “,從$ PROJECT_HOME \ Classes下目錄選擇下列文件,並確保在單擊” Add “之前未勾選Copy items into destination group’s folder複選框:
對Xcode專案做Clean 及Build ,檢查一切是正常的。
恭喜 - 一切都位處在你的Xcode / Eclipse合併iOS /
Android專案已經準備好可使用!
當使用Xcode中,當使用Eclipse?
現在,你有兩個專案文件,在使用它的時候可能不會立即有明顯區分,通常的發展策略是為iOS(通過Xcode中)開發和測試第一個Cocos2D-X專案,當你已經完成此作業,之後,再確保它的工作原理在第二個Android(通過Eclipse)是可行的,只要保持記住下面的規則:
1.
經常測試 (Test often): 測試在Android上的作品所開發的代碼,這樣你就不會太久才發現任何問題。
2.
在多個設備上測試(Test on
multiple devices):大量的Android設備往往存在細微的差別,所以最好盡可能在你持有的多個設備上進行測試。
它也可以有一個相反的策略(首先用Eclipse開發Android專案),但我覺得這種方法缺少生產力,因為對我來說Xcode的感覺比使用Eclipse更快,更容易。另外,在Android模擬器通常需要很長的時間來啟動,所以當它涉及到調試時需要耗費更長的時間,反而在iOS模擬器啟動相當快。
調試技巧和竅門
調試iOS的Cocos2D-X專案與調試標準Cocos2D的代碼是完全一樣的,所以沒有什麼特別的可添加在這裡,然而,對Android,這裡有一些註記,當調試NDK時,一個 ‘server side’端之gdb和gdbcontext會經由NDK腳本指令執行而填置至生產設備之APK裡面,此將可使得與任何相容GDB client
agent之設備可作遠程調試,在Eclipse中最好使用GDB client agent是 NVidia debug manager plugin,但安裝使用已超出本Cocos2D-X教程範圍。
※※後序:翻譯本文(只針對適用於Windows平台之Android部份)筆者日也操,暝也操花了將近二天始完成,細胞又死一堆了(以後再也不幹這種X事),看原文花1Hr,翻譯花2days,真沒效率,其實筆者有用翻譯軟體代操作,翻譯的結果看也看不懂,但頭洗了一半無法退身(※哦,不是退駕,又不是神明),只好硬頸咬牙含血吞埋頭實幹了(※唉,說得這麼嚴重,有那麼跨張嗎),不過說真的,培養E文能力很重要,台灣教育只教學生記文法背多分考高分,不會拿出來善用有何屁用(※這應不是筆者立場該說的話),功夫學一堆,碰到上場要打架群手飛舞都亂打,尤其碰到拿槍的又跑第一(※筆者好像也是這種人,俗言好人不跟惡人計較),會啃E文不是多高桿多厲害(※筆者不是強調此點,別會錯意),語言只是個溝通工具,可讓你”快速”學會某技術,若文章原始文是德文、日文…那學也學不完,但很多技術文章都是以E文發表的,所以我才說E文很重要,要下苦功才能學會的,也要找對方法才能事半功倍。To translate a
paper,a lot of grumble. It’s not of my mind.


















