我們知道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 系統中了。
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11