Cocos2D 如何做 Android 适配


我们知道Cocos2D 是跨平台的 ( Android, iOS, BlackBerry ), 因此它必须把自己适配到不同平台上, 这些适配包括:

1) 屏幕显示

2) 用户输入

3) 进程主循环

4) 资源文件 (图片,音乐)

资源适配

Android 的程序是 Apk, Apk 也是一个 Zip 文件. 处理资源文件有下列几步

1) Cocos2dxHelper 初始化时会吧 Java 层的 ApkPath 传递到 native 层

2) native 成的 CCFileUtils 在用 shareFileUtils() 初始化时, 会新建自己的派生类 CCFileUtilsAndroid, 并把 apk 解开到临时目录.

程序运行中要load资源文件的时候, 就到临时目录去找

3) 在程序退出时, 这个临时目录会被删除

补充:( 实际上 shareFileUtils() 就在CCFileUtilsAndroid.cpp中实现, build iOS 版本不会包含它, 而是在CCFileUtilsiOS.cpp 中吧 )

 

 

Java 层适配类

Cocos2dx 提供了几个Java 层的适配类, 它们在 Cocos2dxActivity 的onCreate 被初始化.

 

 

1) 上面我们提到Cocos2dxHelper, 可以看它的 init 被调用

2) Cocos2dxGLSurfaceView 派生于 GLSurfaceView, 这样就可以直接调用 opengl的函数绘图, 并在此View 中显示了

3) 主要的逻辑都在Cocos2dxRenderer中完成, 最重要的就是它

 

Cocos2dxRenderer

 

1) onSurfaceCreated 的 nativeInit 被调用, Cocos2d 所有重要对象( CCDirector, CCSence, HelloWorld 等) 都是这里初始化的

2) onDrawFrame 的时候, 就是通知Cocos2d绘制一帧, 详细内容可以参考 理解 Cocos2D 如何绘制帧

 

 

另外还有输入的处理,也是通过Cocos2dxRenderer 从 Android的java层 传递到了 Cocos2d的 native 层

 

nativeInit

下面这张图,描述了 Cocos2D 的对象是如何初始化的

 

 

onSurfaceCreated 的 nativeInit 被调用, 也就是说: "可以用opengl 绘图了, Cocos2d 你初始化吧"

Cocos2d 做了下面的工作

1) 根据 Android 提供屏幕大小信息设置 FrameSize

2) 新建 AppDelegate, 注意 AppDelegate 是 CCApplication 的派生类, 当AppDelegate 的run 被调用, 它会调用到applicationDidFinishLaunching

3) 在applicationDidFinishLaunching 中, Director, Scene 都被创建,

4) 最后让 Director 运行 Scence

通过以上这些 Cocos2D 就被适配 Android 系统中了。

相关内容