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 中吧 )

 

Cocos2D 如何做 Android 适配

 

Java 层适配类

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

 

Cocos2D 如何做 Android 适配

 

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

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

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

 

Cocos2dxRenderer

 

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

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

Cocos2D 如何做 Android 适配

 

 

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

 

nativeInit

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

Cocos2D 如何做 Android 适配

 

 

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

Cocos2d 做了下面的工作

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

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

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

4) 最后让 Director 运行 Scence

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

相关推荐