COCOS2D-X跨ANDROID&IOS平台开发入门教程

Fahim Farook

这篇文章还可以在这里找到 英语

这篇文章由教程组成员 Jean-Yves Mengant原创:一位很有经验的 Android / IOS 开发者兼设计师.

学习用Cocos2D-X创建一个简单的iPhone或Android游戏样例!

cocos2d-x跨android&ios平台开发入门教程!

Cocos2D是一个非常棒而且非常容易使用的游戏框架,但是,由于它是基于objc语言的,所以你只能使用它来开发ios和mac下面的游戏。

假如你可以使用和cocos2d相似的api来开发android上面的游戏,那岂不是更爽?这样,你就可以毫不费劲地扩大你的游戏的市场份额(android的用户数量巨大啊!)

好吧,确实存在这么一个游戏框架,她就是cocos2d-x!cocos2d-x基于c++把cocos2d的api重新移植了一遍,,除了一些语法细节上面的差异之外,你可以使用几乎一样的api来编写游戏。正是由于它是c++写的,所以可以跨多个平台,从ios到android、windows、再到linux、bada等!

在这篇教程里面,你将学习到,如何使用cocos2d-x和c++来编写一个能够同时在ios和android设备上面跑的“Hello World”程序。

而且,过两天,我会再出一篇教程,向大家展示一个具体的游戏例子—一个跨平台的太空射击游戏!

好了,带上你的iPhone和Android设备,让我们开始吧!

Hello, Cocos2D-X for iOS!

在继续之前,确保你先下载最新版本的Cocos2D-X.

随便在你的硬盘的某个位置上面解压就可以了。注意,这个解压出来的文件夹的完整路径名,我们之后会用一个统一的别名 $COCOS2DX_HOME来指代。

现在,你已经下载到源码了,让我们来安装项目模板吧!你可以先cd到$COCOS2DX_HOME这个目录(译者:指你刚刚解压缩代码的存放路径)下面去。在安装模板之前,先退出Xcode,然后打开一个终端,并输入下面的命令:

cd $COCOS2DX_HOME
sudo ./install-templates-xcode.sh -u

Note: 注意: 在上面所示的代码中,你不能直接输入$COCOS2DX_HOME,而要输入实际的路径。如果你直接输入了$COCOS2DX_HOME是不会有任何反应的。

你可能会被要求输入管理员密码(加了-u应该是不需要输入密码的,不加-u就需要输入),之后的过程就非常简单了。在模板安装好之后,启动xcode,然后创建一个新的项目。这时,你可以在项目模板对话框中看到有cocos2d-x的模板了。不用担心,cocos2d-x的模板与cocos2d的模板并不会有冲突,因此,你还是可以创建cocos2d的项目。

让我们来试一下新模板吧!打开Xcode,然后创建一个新的工程,选择 iOScocos2d-xcocos2dx模板,如下图所示:

把工程命名为Cocos2DxFirstIosSample,然后保存。

现在,编译并运行,你将会看到cocos2d-x的hello wolrd程序跑起来了,如下图所示:

Hello, Cocos2D-X project on iOS.

非常简单,不是吗?这时,你可以看看xcode里面的文件,特别是ClassesHelloWorldScene.H和ClassesHelloWorldScene.cpp。如果你也熟悉cocos2d的话,那么里面的代码看起来会觉得非常熟悉—几乎完全一样的cocos2d API,只是语言是c++而已!

配置cocos2d-x的eclipse开发环境

现在我们已经完成了Xcode4的hello world程序了,是时候看看如何使用eclipse来配置android 的cocos2d-x开发环境了。

这篇教程假设你有一个可以进行Android开发的标准开发环境。如果你还没有的话,可以参考来配置,它里面提供了详细的过程,教你如何一步步配置好一个标准的eclipse android开发环境。

但是,请等一下。一个标准的eclipse android开发环境是专为java开发设计的,而cocos2d-x却是基于c++来做开发的!

不用担心,eclipse已经有10年的历史了,它有许多插件可以支持其它语言的开发,这当然就包括c/C++语言的插件啦。

先让我们来安装这个插件吧。打开eclipse,然后执行以下步骤:

  • 从Eclipse IDE的主工具栏上面,选择Help/Install New Software。
  • 打开Work With复选框,并从中选择一个包含你的eclipse版本名称的项(如果是最新版的eclipse的话,就选择indigo)
  • 在插件树里面找到Programming Languages (只有当你复选中“Group items by category”时,你才可以看到插件树。)并打开它.
  • 选择CDT插件,然后安装下列组件。(但是,请注意,你如果直接就点击C/C++ Development Tools的话,你是得不到下图所示的样子的,你还需要在“Mobile Development”里面去查找相关的项)(译者:我没找了,直接就选择了C/C++ Development Tools就Next安装了)

点击next来完成向导,然后等待组件下载并安装。现在,你可以使用eclipse来开发C/C++项目了!

Setup the Android NDK (Native Development Toolkit)

本来,android开发只能采用java,而且现在市场上面大部分的app也是采用java写的。

然而,现在你还可以通过Native Development Toolkit (NDK),使用C/C++来编写android程序。这种编程方式是由Google在2009年6月份引入的,它允许一些组件采用C/C++来编写,然后通过标准的Java Native Interface (JNI)来调用。

安装NDK的过程非常简单:

  • 下载最新版本的NDK。here (choose the MacOSX platform).
  • 解压tar.bz2 到任意目录.之后,我会使用$NDKROOT来指定这个解压缩后的目录。

NDK给Android开发带来了全套的C/C++编译工具集,可以使用GCC4.4.3来编译来链接并且可以构建即时安装的APK包。

有了这套编译工具集,我们就可以在eclipse里面集成一些外部的C/C++库(比如cocos2d-x)。这些库被编译成动态库,然后通过JNI(Java Native Interface)与Java Android体系程序进行交互。

这些编译工具集可以采用下面两种方式使用 :

  • 独立模式: 直接在你的makefile中使用 arm-linux-androideabi-g++. 这种方式会增加你的项目的复杂性和可维护性。我推荐你不要使用这种方式。
  • 集成模式: 使用$NDKROOT/ndk-build shell 工具,它是一种高度可定制的makefile,专门为NDK库所设计的。这也是我们这篇教程所采用的方式。

解释JNI和NDK可能会花费大量时间,而且也超出了本教程的讨论范围。现在网络上有许多关于JNI的资源。这里还推荐一本书,它也讨论了JNI这个主题。.

如果你需要更多关于NDK的信息,这里推荐一本非常好的书,它里面涵盖了使用C/C++进行NDK开发,书名是:Android Native Development Kit Beginner’s Guide 这本书覆盖了NDK编程的方方面面,可谓是“从入门到精通”,而且NDK本身也带有非常详细的文档,在$NDKROOT/docs路径下面。

Hello, Cocos2D-X for Android!

现在,让我们在Andriod平台上面来开发一个“Hello,World”程序吧,就像我们之前在ios平台上的程序一样。

我们需要通过命令行来完成工作,因为目前还没有在Eclipse IDE里面集成cocos2d-x的模板。

在$COCOS2DX_HOME目录下面包含一个shell脚本,叫做create-android-project.sh,我们可能通过它来创建android项目。但是,在运行脚本之前,我们需要在脚本文件的顶部做一些修改:

# set environment paramters
NDK_ROOT_LOCAL="/home/laschweinski/android/android-ndk-r5"
ANDROID_SDK_ROOT_LOCAL="/home/laschweinski/android/android-sdk-linux_86"

修改上面这些行,把NDK_ROOT_LOCAL指向你安装Android NDK ($NDKROOT)的位置,同时把ANDROID_SDK_ROOT_LOCAL指向你安装Android SDK位置。(译者:这里其实可以不用修改,读者可以打开这个sh脚本去看看为什么。如果之前看过我的配置教程,里面有配置一个全局的NDK_ROOT和ANDROID_SDK_ROOT。这个脚本在判断有全局的环境变量存在的时候,会直接替代NDK_ROOT_LOCAL和ANDROID_SDK_ROOT_LOCAL。)

现在,可以运行create-android-project.sh脚本了,然后你会接收到一系列的提示输入。我们将一个个向您解释一下:

  1. 第一个提示要求你“Input package path”。这个包名会给后面的java代码使用。你可以使用你的域名反过来写,类似写ios的bundle ID。比如com.yourdomain.samplecocos2dxandroid ,记住实际输入的时候要替换掉“com.yourdomain”。
  2. 接下来,你会得到一系列可用的Android API和它们的id号。这个具体取决于你的机器上面安装的Andriod API的情况。
  3. 最后,你需要提供项目的名称,在这里取名为samplecocos2dxandroid:samplecocos2dxandroid.

命令行的输出大致如下:

bash-$ ./create-android-project.sh
Input package path. For example: org.cocos2dx.example
org.jymc.samplecocos2dxandroid
. . . 
Available Android targets:
----------
. . .
----------
id: 9 or "Google Inc.:Google APIs:15"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 1
     Description: Android + Google APIs
     Based on Android 4.0.3 (API level 15)
. . .
input target id:
9
input your project name:
samplecocos2dxandroid
Created project directory: /Users/jymen/development/cocos2dx/samplecocos2dxandroid
. . .
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-$ 

注意“Created project directory:”这一行是脚本文件最后输出来的,这个输出的路径也就是你的Andriod项目被创建好的路径。我这里指的是/Users/jymen/development/cocos2dx/samplecocos2dxandroid,如上图所示:

Note: 注意: 不要把项目从一个地方移动到另一个地方。因为你如果随意移动,有些脚本文件可以跑不起来。

构建工程

这里有两个步骤来构建项目—-首先通过命令行脚本编译c++代码,然后通过ecipse来编译java代码。

为了编译c++代码,我们需要切换到$PROJECT_HOME/android文件夹下面去,然后在终端里面输入下列命令:

./build_native.sh 

你应该会看到下面类似的输出:

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

这里就是在编译cocos2d-x库和你的项目里面的c++文件。

为了编译java代码,我们需要创建一个eclipse工程—这可比命令行要方便多了。:)

打开Eclipse,然后他吃软饭FileNewOther,选择AndroidAndroid Project,然后点击Next,在Project Name里面输入samplecocos2dxandroid ,然后选择 Create project from existing source,然后浏览到$PROJECT_HOME/android文件夹,如下图所示:

点击Next,选择一个 Android version to target(这里选择的是3.2,你可以选择任何一个)

点击Finish,好了,现在你有一个工程了!

在左边的树上右击项目,选择Run AsAndroid Application,然后AVD (Android Virtual Device)就会启动,然后就会跑出来Hello, Cocos2D-X项目了!

Hello Cocos2DX on Android

注意: 如果程序没有启动的话,你需要按照提示去创建一个AVD来测试。更多的细节,请参考Getting Started with Android Development 这篇教程。

恭喜你,你现在有一个“Hello,World”项目可以同时跑在ios和android上面了!

在Eclipse里面定义一个结合java/c++的工程

通过命令脚本来编译c++代码,完了之后用eclipse来编译java代码,这种来回切换的做法非常笨重。如果全部可以用eclipse来完成的话,那么生活会更简单一些。

幸运的是,我们可以告诉eclipse,我们的android项目是一个集成java/c++的跨语言项目!

为此,我们在左边的项目树上选择samplecocos2dxandroid,然后从菜单里面选择FileNewOther,然后从对话框里面选择C/C++Convert to a C/C++ Project,如下所示:

点击Next。在下一个屏幕里面,选中你的项目,然后选择c++单选按钮,然后为Project type指定Makefile projectOther Toolchain,如下所示:

Selecting the project type

点击完成。这时eclipse会询问你是否打开C/C++视图,当对话框出现的时候,选择NO。

接下来的步骤就是修改项目设置,指定如何运行我们的make命令。在左边的项目树上,右击samplecocos2dxandroid工程,选择Properties,然后选择C/C++ build

取消“Use default build command”复选框,然后在build文本框中输入下面的命令:

bash ${workspace_loc:/samplecocos2dxandroid}/build_native.sh NDK_DEBUG=1 V=1

点击Apply,然后点OK。

回到eclipse,从主菜单中选择ProjectBuild All,这时你可以在eclipse的控制台输出中看到c++ make在运行。

我们仍然有一些警告需要解决。想知道我是什么意思吗,你打开jni/helloworld/main.cpp,这里你会看到一系列的警告,如下所示:

这些警告之所以会出现,是因为我们没有配置正确的c++包含路径。为了解决它,我们右击samplecocos2dxandroid工程,然后选择PropertiesC/C++ GeneralPath and SymbolsGNU C++。

选择Add…按钮来选择下面的目录,之后点击Apply和OK。

$(NDKROOT)/platforms/android-9/arch-arm/usr/include
$(COCOS2DX_HOME)/cocos2dx/include

注意: 不用忘了使用实际的路径来替换掉$(NDKROOT) 和$(COCOS2DX_HOME)。

点击Apply,这时会提示你是否重建索引。直接点击yes继续就可以了。

现在,你再看看main.cpp,你会看到大部分警告已经消失了。

但是,AppDelegate.h文件还是找不到。这是因为AppDelegate.h是在$PROJECT_HOMEClasses文件夹下面。这个文件夹对我们来说非常重要,因为它包含了我们工程里面的可移植的c++类,比如HelloWorldScene.cpp等。

当我们创建eclipse项目的时候,我们必须选择$PROJECT_HOMEandroid文件夹,因为eclipse需要一个AndroidManifest.xml文件。但是,这样的话,我们的工程就不包括关键的“Classes”文件夹了,这也是为什么我们会得到这么多警告的原因。

让我们来修正它吧。右击samplecocos2dxandroid项目,选择PropertiesC/C++ GeneralPaths and SymbolsSource location。点击Link Folder,然后复选中Link to a folder in the file system,接着浏览到$PROJECT_HOME文件夹,并指向Classes目录,最后点Apply和OK。

你现在可以在文件树里面看到Classes目录了,而且在main.cpp里面的#include “AppDelegate.h”警告也应该消失了。

Eclipse工程里面还会有许多警告,但是,这是因为eclipse对于解析c++头文件的能力并不强大。为了消除这些警告,我们又需要设置一下项目设置。(右键点工程,然后选择Properties),把Code Analysis部分的warnings关闭,如下图所示:

Turning off C++ Code Analysis warnings in Eclipse

然后点击Apply和OK,这时,你就得到一个工程可以在eclipse里面进行编辑了。

What About the Java Code?

这时你在eclipse里面再找找看,你会在src和gen目录下面找到一些java代码,你肯定很好奇这些代码是干吗用的。

Andriod开发采用的主要语言是java,这个项目模板已经为我们创建了一些java框架代码,用来加载c++编写好的动态库。

一般情况下,你是不需要修改这些java代码的,但是,还是让我们来看看srccomxxxsamplecosos2dxandroidsamplecocos2dandroid.java这个类。

这个类包含了主Android Activity类,当应用程序启动的时候会加载。它首先通过NDK来请求编译好的c++动态库。(如果采用的是最新版的coocs2dx的话,下面只会加载一个game库)

由于类是从Cocos2dxActivity所派生,在后台cocos2d-x会把控制权移交给c++的AppDelegate 的initInstance方法来处理,最后applicationDidFinishLAunching方法也就被执行起来了。

因此,再重申一遍,java代码只是一些包装代码,大部分情况下我们都不要去修改它,因为我们的游戏逻辑是由c++写的。

连接andriod和ios项目结构

现在,我们有两个cocos2d-x的项目了,一个是ios下面的,一个是andriod下面的。我们的目标是让两个工程共享同样的目录,这样就可以使用同样的c++文件了。

我们两个项目里面,都有一个文件夹叫做“Classes”,它包含了我们的可移植的游戏代码(如下图:android的在左边,ios的在右边)

如果你仔细看看eclipse和xcode里面的Classes目录,你会发现这些c++文件完全相等。因此,我们需要做的就是让两个项目指向同一个文件夹就ok了!

为了实现这个目标,在xcode里面打开Cocos2DxFirstIosSample项目。选择Classes分组,然后点击Delete,选择“Move to Trash”;

接下来,右键Project Navigator,选择“New Group”,然后重命名为Classes。点键Classes,点击Add Files。然后选择$PROJECT_HOMEClasses目录,同时确保“Copy items into destination group’s folder”没有被选中!

然后clean并rebuild xcode项目,并运行一下,确保一切ok。

恭喜,现在基础配置全部弄好了!你可以试着在eclipse里面修改,xcode这边运行,或者xcode里面修改,eclipse里面运行了。

什么时候使用 Xcode, 什么时候使用Eclipse?

现在,你有两个项目了,那么问题马上就出来了,我们到底什么时候该使用哪一个呢?

使用cocos2d-x通常的开发策略是,首先在ios上面通过xcode来测试,确认没问题后,再通过eclipse来测试。只需要在心里记住下面几点就行:

  1. 经常测试. 开发完一个小功能之后,就应该在andriod上面测试看行不行。这样的话,就不至于遇到问题找不到了。
  2. 在多个设备上面测试: 现在市场上面有大量的android设备,而且它们的差别很细微,所以,你要尽可能多地测试多种不同型号的设备。

当然,你也可以先在andriod上面测试,然后再在ios上面测试。但是这样肯定会降低你的生产率。因为xcode比eclipse反应速度更快,而ios模拟器比android的模拟器的启动速度也要快一些。

调试技巧

在ios上面调试cocos2d-x和cocos2d的方法差不多,这里也没什么多讲的。

然而,对于Android,这里有几点需要注意下。

当使用NDK来调试的时候,一个“服务端的”gdb和gdbcontext被ndk-build shell脚本塞到APk里面去了。这个远程的gdb调试器可以与任何gdb兼容的客户端进行通信。

Eclipse里面最好的gdb agent就是NVidia debug manager plugin,但是安装这个插件不在本教程的讨论范围之内。

注意:

如果你想安装NVidia Debug Manager plugin,你首先到this page 下载完整的Tegra Android开发包,即便你可能现在并不需要它。然后,安装Tegra Developer,它会提示你安装哪些项,然后你可以选择NVidia Debug Manager plugin这个插件了。当你安装完之后,它并没有包插件安装到eclipse里面去,而是把zip文件放在你的硬盘的某个位置,你可以参考这个PDF 来进行安装。

我发现在一些物理设备(比如Samsumg Galaxy S),remote debugger老是启动不了,但是使用AVD就可以正常启动。

为了启动一个debug会话,你可以选择你的项目,然后右击Debug As Android NDK application,如下图所示:

请注意,只有你安装了NVidia debug manager plugin,你才会在右击的时候看到Android NDK Application这个选项。

你可以在一行代码上面双击来设置一个断点,如下所示:

当断点到达的时候,它将会停留在断点所在行:

悲催的是,使用gdb来调试android有时候并不管用,所以,你可能需要添加一些额外的tracing系统。想知道更多的信息,请联系我,我将与大家分享这些tips。

何去何从?

恭喜你,你现在可以使用cocos2d-x来开发iphone和android下面的游戏了。

请耐心等待我的第二篇教程吧,它将带你一起开发一个跨平台的太空射击游戏,当然是使用cocos2d-x啦!

如果你遇到什么问题,或者有什么意见或建议,欢迎留言!


This is a blog post by iOS Tutorial Team member Jean-Yves Mengant, an experienced Android / IOS developer and designer.

Fahim Farook

Fahim is a developer with over two decades of experience in developing in over a dozen different languages. Fahim's current focus is on the mobile app space with over 60 apps developed for iOS (iPhone and iPad). He's the CEO of RookSoft Ltd of Malaysia.

He's lived in Sri Lanka, USA, Saudi Arabia, New Zealand, and Singapore and enjoys science fiction and fantasy novels, TV shows, and movies. You can follow Fahim on Twitter.

用户评论

0 Comment

Other Items of Interest

Ray 的每月简报

Sign up to receive a monthly newsletter with my favorite dev links, and receive a free epic-length tutorial as a bonus!

Advertise with Us!

Hang Out With Us!

Every month, we have a free live Tech Talk - come hang out with us!


Coming up in May: Procedural Level Generation in Games with Kim Pedersen.

Sign Up - May

Coming up in June: WWDC Keynote - Podcasters React! with the podcasting team.

Sign Up - June

Vote For Our Next Book!

Help us choose the topic for our next book we write! (Choose up to three topics.)

    加载中 ... 加载中 ...

我们的书

Our Team

教程组

  • Martin Walsh

... 55 total!

Editorial Team

... 21 total!

Code Team

  • Orta Therox

... 1 total!

翻译团队

  • Cosmin Pupaza
  • Takeichi Kanzaki Cabrera

... 38 total!

Subject Matter Experts

... 4 total!