此篇文章有點硬,是講述cocos2d-x如何在不同平台中作適配的底層技術,由於cocos2d-x可跨平臺,如 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中實現對Android適配之能力,不會生成 iOS 版本,它是在CCFileUtilsiOS.cpp 中。
Cocos2d-x 提供了幾個Java 層的適配類,它們在
Cocos2dxActivity 的onCreate()中被初始化,如下圖所示:
1) 上面有提到Cocos2dxHelper,可看它的 init()被調用之情形。
2) 由於Cocos2dxGLSurfaceView衍生於 GLSurfaceView,故可直接調用 opengl的函數繪圖,並在此View 中顯示。
3) 主要的邏輯都在Cocos2dxRenderer中完成,此為最重要的部份。
Cocos2dxRenderer
1) onSurfaceCreated 的 nativeInit()被調用,cocos2d-x所有重要物件(
CCDirector, CCSence, HelloWorld 等) 都是這裡初始化的。
2) 調用onDrawFrame()時通知cocos2d-x進行繪製一幀。
另外在輸入的處理也是通過Cocos2dxRenderer 從 Android的java層傳遞到cocos2d-x的 native 層,下面這張圖描述了 cocos2d-x的物件是如何初始化的。
onSurfaceCreated 的 nativeInit()被調用時即可以使用opengl進行繪圖作業,進行初始化,如下步驟:
1) 根據 Android 提供螢幕大小資訊設置 FrameSize
2) 新建 AppDelegate,此AppDelegate是CCApplication的衍生類,當AppDelegate的run()被調用時它會調用到applicationDidFinishLaunching。
3) 在applicationDidFinishLaunching 中Director,
Scene 都被創建。
4) 最後讓Director運行 Scence。
通過以上這些cocos2d-x就被適配 Android 系統中。
※後序:此篇講述cocos2d-x是如何適配於Android平台之整個流程,概念上非常清楚可供參考用,此種牽涉至底層技術部份對一般之程式開發工作人員可能不會去注意它,但如果懂得它的舖局對遊戲開發之流程作業很有幫助的。




0 意見:
張貼留言