乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【玩轉(zhuǎn)cocos2d-x之四】cocos2d-x怎么實(shí)現(xiàn)跨平臺(tái)

       Kitsdk 2014-02-24

      原創(chuàng)作品,轉(zhuǎn)載請(qǐng)標(biāo)明:http://blog.csdn.net/jackystudio/article/details/12610287


      cocos2d-x到底是怎樣實(shí)現(xiàn)跨平臺(tái)的呢?這里以Win32和Android為例。


      1.跨平臺(tái)項(xiàng)目目錄結(jié)構(gòu)

      先看一下一個(gè)項(xiàng)目創(chuàng)建后的目錄結(jié)構(gòu)吧!這還是以HelloCpp為例。


       


      從左邊目錄可以看到,Classes和Resource已經(jīng)平臺(tái)無關(guān)了,而Classes中包含了AppDelegate類,因此我們可以認(rèn)為AppDelegate是與平臺(tái)最接近的類,在它以上就要區(qū)分平臺(tái)了。


      2.Win32下的實(shí)現(xiàn)

      在前一篇就介紹了Win32怎么開始cocos2dx,Win32平臺(tái)下main.cpp就是程序入口:

      1. int APIENTRY _tWinMain(HINSTANCE hInstance,  
      2.                        HINSTANCE hPrevInstance,  
      3.                        LPTSTR    lpCmdLine,  
      4.                        int       nCmdShow)  
      5. {  
      6.     UNREFERENCED_PARAMETER(hPrevInstance);  
      7.     UNREFERENCED_PARAMETER(lpCmdLine);  
      8.   
      9.     // create the application instance  
      10.     AppDelegate app;//創(chuàng)建應(yīng)用實(shí)例  
      11.     CCEGLView* eglView = CCEGLView::sharedOpenGLView();  
      12.     eglView->setViewName("HelloCpp");  
      13.     eglView->setFrameSize(2048, 1536);  
      14.     eglView->setFrameZoomFactor(0.4f);  
      15.     return CCApplication::sharedApplication()->run();//運(yùn)行程序  
      16. }  
      Win32下的實(shí)現(xiàn)比較簡(jiǎn)單,就是正常的創(chuàng)建實(shí)例,運(yùn)行就可以了。


      3.Android下的實(shí)現(xiàn)


      3.1.cocos2d-x程序入口

      我們先看一下Android下cocos2d-x程序入口點(diǎn)在哪,我們知道Android是采用Java編寫的,而cocos2d-x是c++編寫的,所以如果要在Java中調(diào)用c++代碼,那就需要采用JNI技術(shù),看起來好像高端大氣上檔次,其實(shí)程序就是函數(shù)調(diào)用,也就是輸入→處理→輸出,所以JNI實(shí)際上簡(jiǎn)單抽象出來就這么回事:

      1. java輸入→Jni→c++輸入→c++處理(API實(shí)現(xiàn))→c++輸出→Jni→java輸出  
      \proj.android\jni\hellocpp文件夾下可以找到main.cpp,這就是cocos2d-x的入口:

      1. jint JNI_OnLoad(JavaVM *vm, void *reserved)  
      2. {  
      3.     JniHelper::setJavaVM(vm);  
      4.   
      5.     return JNI_VERSION_1_4;  
      6. }  
      7.   
      8. void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h)  
      9. {  
      10.     if (!CCDirector::sharedDirector()->getOpenGLView())  
      11.     {  
      12.         CCEGLView *view = CCEGLView::sharedOpenGLView();  
      13.         view->setFrameSize(w, h);  
      14.   
      15.         AppDelegate *pAppDelegate = new AppDelegate();  
      16.         CCApplication::sharedApplication()->run();  
      17.     }  
      18.     else  
      19.     {  
      20.         ccGLInvalidateStateCache();  
      21.         CCShaderCache::sharedShaderCache()->reloadDefaultShaders();  
      22.         ccDrawInit();  
      23.         CCTextureCache::reloadAllTextures();  
      24.         CCNotificationCenter::sharedNotificationCenter()->postNotification(EVENT_COME_TO_FOREGROUND, NULL);  
      25.         CCDirector::sharedDirector()->setGLDefaultValues();   
      26.     }  
      27. }  

      里面包含了2個(gè)函數(shù),JNI_OnLoad和Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit。我們看一下功能而先不管它在哪里被調(diào)用。

      (1)JNI_OnLoad,這個(gè)函數(shù)主要是用來告訴Android VM當(dāng)前使用的是什么版本是Jni,如果不提供此函數(shù),則默認(rèn)使用Jni1.1版本。

      (2)Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit,這個(gè)函數(shù)很明顯就是運(yùn)行一個(gè)cocos2d-x的應(yīng)用實(shí)例了,這和Win32是一樣的,當(dāng)然它多了一個(gè)openGlView的檢測(cè)。一旦調(diào)用了它那么cocos2d-x游戲啟動(dòng)。

      接下來再看看它們是在哪里被調(diào)用的。


      3.2.JNI_OnLoad的調(diào)用

      在proj.android\src\org\cocos2dx\hellocpp目錄下,可以看到Android的入口Activity,也就是HelloCpp,它繼承自Cocos2dxActivity。

      [java] view plaincopy
      1. public class HelloCpp extends Cocos2dxActivity{  
      2.   
      3.     protected void onCreate(Bundle savedInstanceState){  
      4.         super.onCreate(savedInstanceState);  
      5.     }  
      6.       
      7.     static {  
      8.          System.loadLibrary("hellocpp");  
      9.     }  
      10. }  
      很簡(jiǎn)單的代碼,因?yàn)楣δ芏急环庋b到Cocos2dxActivity中了,所以O(shè)nCreate中調(diào)用了父類的OnCreate就把功能都實(shí)現(xiàn)了,而system.LoadLibrary就是載入編譯出來的.so文件,此時(shí)就會(huì)執(zhí)行JNI_OnLoad。


      3.3.Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit的調(diào)用

      那最重要的Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit是在哪調(diào)用呢?這就比較麻煩了,先大致了解一下Cocos2dxActivity做了一些什么事。

      直接進(jìn)入Cocos2dxActivity的OnCreate函數(shù),它調(diào)用了一個(gè)init初始化函數(shù):

      [java] view plaincopy
      1. public void init() {  
      2.           
      3.         // 設(shè)置布局,是一個(gè)FrameLayout  
      4.         ViewGroup.LayoutParams framelayout_params =  
      5.         new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,  
      6.                                        ViewGroup.LayoutParams.FILL_PARENT);  
      7.         FrameLayout framelayout = new FrameLayout(this);  
      8.         framelayout.setLayoutParams(framelayout_params);  
      9.   
      10.         // 設(shè)置Cocos2dxEditText布局,這一個(gè)跟GLSurfaceView兼容的edittext  
      11.         ViewGroup.LayoutParams edittext_layout_params =  
      12.         new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,  
      13.                                    ViewGroup.LayoutParams.WRAP_CONTENT);  
      14.         Cocos2dxEditText edittext = new Cocos2dxEditText(this);  
      15.         edittext.setLayoutParams(edittext_layout_params);  
      16.   
      17.         // 添加到framelaout  
      18.         framelayout.addView(edittext);  
      19.   
      20.         // 創(chuàng)建Cocos2dxGLSurfaceView  
      21.         this.mGLSurfaceView = this.onCreateView();  
      22.   
      23.         // 添加到framelaout  
      24.         framelayout.addView(this.mGLSurfaceView);  
      25.   
      26.         // Switch to supported OpenGL (ARGB888) mode on emulator  
      27.         if (isAndroidEmulator())  
      28.            this.mGLSurfaceView.setEGLConfigChooser(8 , 888160);  
      29.   
      30.         //設(shè)置Cocos2dxRenderer和Cocos2dxEditText  
      31.         this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());  
      32.         this.mGLSurfaceView.setCocos2dxEditText(edittext);  
      33.   
      34.         // 設(shè)置framelayout作為內(nèi)容視圖  
      35.     setContentView(framelayout);  
      36.     }  

      在這里Cocos2dxActivity做的就是創(chuàng)建Cocos2dxGLSurfaceView,并設(shè)置了Cocos2dxRenderer和Cocos2dxEditText,然后添加到FramLayout。具體的各部分實(shí)現(xiàn)這里就不貼代碼了,畫了個(gè)圖:


      好了,就這樣吧。因?yàn)槲覍?duì)Android界面開發(fā),特別是OpenGLView這塊也不熟,所以只能大概推出是這樣子了,有什么錯(cuò)誤,還請(qǐng)指出。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多