现在我正在维护的产品之前有一个需求,需要使用一个很炫的动画效果,我们经过技术预研之后,最终选定cocos2d-x,几个优势很明显,首先是跨平台,意味着维护成本低。其次是工具链非常成熟,我们公司有游戏团队,之前一直在使用对应的工具链,这个效果是其他的手段无法满足的。我们之前使用的版本是cocos2d-x 3.2,这个版本使用的话,实际做集成已经很简单。首先说一下,对框架内部都修改的地方,由于我们应用只是需要游戏框架来展示一些比较酷炫的动画效果,所以首先要把背景色设为透明色,搜索一下glclearcolor,改为glclearcolor(0,0,0,0)即可。下面会分开说iOS和Android的集成,集成方面还是稍微有些差异的。不过整体来说,如果对cocos2dx的结构比较了解的情况下,基本就可以很快进行集成工作。
==========================================================
打开cocos2d-x代码目录,在build目录下,打开cocos2d_libs.xcodeproj,这个project里面将各个类库编译为静态库,并且每个类库都需要多个架构的静态库,最后使用lipo合为一个fat library。后面的做法可以分为两种,一种是将整个包括播放动画的代码都编译成静态库,然后只需要copy一个简单的头文件以及静态库到app项目中;第二种,是只把cocos2d_libs.xcodeproj产生的静态库拷贝到项目中,但是具体播放动画的代码,比如Application.cpp,scene,layer等代码以源文件方式放到app项目中。这个时候还需要做一些事,在app的工程文件中添加header search path,将cocos2d-x的头文件路径放进去,以及添加一些cocos2dx使用的预编译宏,具体可以参考官方示例中的对应设置。
将游戏框架集合进入应用中,其实就是需要添加一个EAGLView到相应的位置,然后参考官方示例中的步骤启动游戏框架即可,设置代码如下:
后续使用部分不用多说,这个是使用cocos2d-x实现,里面也比较简单。唯一需要注意的地方是,需要用.mm文件里面才能既调用OC又调用CPP,做一个桥接作用。
后面关于cocos2dx的释放,由于cocos2dx根本没有考虑到游戏框架会被释放的问题,所以内部使用了大量的单例,在这个地方我走了一些弯路,释放的关键是先将CADisplayLink停止,然后再进行释放资源,否则单例机制会再次生成Application或者导致崩溃。
==========================================================
注意一下,Android中游戏Application的生成是在main.cpp中实现的,至于资源的释放,这个也需要自己通过JNI调用进行删除,否则Applicaiton对象会在内存中存在,一方面会有内存泄露,另外一方面无法再次生成Application对象。另外,这里需要注意的是,需要把自己修改一下Android.mk文件。其实这里的JNI调用,可以参考cocos2dx的代码,使用官方的代码,可以非常方便调用JNI,在有些地方,需要根据平台利用宏做一下处理,android和iOS的处理流程不一样。
还有一个需要特别注意的地方,在释放资源的时候,cpp会调用Cocos2dxHelper中的方法,这个地方释放资源竟然是直接kill process,需要把下面这行代码注掉即可
public static void terminateProcess() {
android.os.Process.killProcess(android.os.Process.myPid());
}