coco2d-x称之为跨平台,但它跟Java的跨平台是两个概念。与其说是跨平台,不如说是各平台对Opengl ES的支持。如果平台不支持Opengl ES,我真不知道怎么来移植了。
cocos2d-x在各平台的实现代码完全一致,你的工程只需要针对各平台做些配置工作即可,这点cocos2d-x的源码通过脚本都做好了。
cocos2d-x是怎么跟各个平台入口联系起来的呢,我仔细看了下代码,分享一下。
IOS:(xcode4.3.2,cocos2d-x2.0.1)看源码自带的HelloWorld例子。结构如下:
其中iOS组下的代码就是ios平台的相关代码。代码结构和平台相关代码在建工程时会自动创建。
入口是main函数,其中加载AppController,这个类完成了ios平台的环境初始化。大部分代码都是ios平台的代码,与cocos2d-x相关的只有两句:
static AppDelegate s_sharedApplication;
cocos2d::CCApplication::sharedApplication().run();
CCApplication是一个单例的类,而sharedApplication是其全局访问方法,获得其实例。AppDelegate私有继承CCApplication类,隐藏接口。
AppController.mm一开始定义一个static的AppDelegate就是要定义一个CCApplication的实例,然后调用run函数,看这个函数
int CCApplication::run()
{
if (applicationDidFinishLaunching())
{
[[CCDirectorCaller sharedDirectorCaller] startMainLoop];
}
return 0;
}
调用applicationDidFinishLaunching()函数,这个由AppDelegate实现,从此程序进入coco2d-x引擎部分,后续就与平台无关了,都是c++实现。
Android:安卓部分比较简单,就是Java通过Jni调用C++实现。
通过cocos2d-x的源码目录下的脚本create-android-project.sh可以创建android工程,创建完成后会生成Android平台相关的Java层的代码,其实就是拷贝的cocos2dx/platform/android/java目录下的代码。看下源码自带tests工程的结构:
程序入口是TestsDemo,这是启动Activity,继承自Cocos2dxActivity。通过调用Opengl ES在android上的java接口来启用Opengl。就是上图中的Cocos2dxGLSurfaceView.java,这个类继承自GLSurfaceView,是Opengl的上层接口类。在android上,opengl的绘图是通过单独的线程来渲染的,必须实现一个渲染器Renderer,cocos2d-x中的渲染器就是Cocos2dxRenderer.java。在这个类中有一系列的native函数,如nativeInit、nativeTouchesBegin等,这些函数就是cocos2d-x的C++代码对Java层的接口函数。其中nativeInit是工程自带的Jni目录下的main.cpp通过Jni封装的,而其他的native函数是cocos2dx/platform/android/Jni下的封装,就是引擎已经封装好了。
cocos2d-x中,一个完整的android游戏分两部分,cocos2d-x库和Java部分,说白了就是C++部分和Java部分,默认的Java部分是固定好了的,一般不需要自己再修改,跟编译一般的android应用一样,用Eclipse就可以。C++部分就是用cocos2d-x实现游戏的部分,这部分需要用NDK来编译成动态链接库。C++部分跟ios下的C++部分完全一样。
在android开发平台上调试cocos2d-x的代码不太方便,因为NDK本身的调试就不方便,所以建议还是在mac或windows上做开发,再移植。