我们知道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 中吧 )
Cocos2dx 提供了几个Java 层的适配类, 它们在 Cocos2dxActivity 的onCreate 被初始化.
1) 上面我们提到Cocos2dxHelper, 可以看它的 init 被调用
2) Cocos2dxGLSurfaceView 派生于 GLSurfaceView, 这样就可以直接调用 opengl的函数绘图, 并在此View 中显示了
3) 主要的逻辑都在Cocos2dxRenderer中完成, 最重要的就是它
1) onSurfaceCreated 的 nativeInit 被调用, Cocos2d 所有重要对象( CCDirector, CCSence, HelloWorld 等) 都是这里初始化的
2) onDrawFrame 的时候, 就是通知Cocos2d绘制一帧, 详细内容可以参考 理解 Cocos2D 如何绘制帧
另外还有输入的处理,也是通过Cocos2dxRenderer 从 Android的java层 传递到了 Cocos2d的 native 层
下面这张图,描述了 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 系统中了