原创作品,转载请标明:http://www.jb51.cc/article/p-omofkpnm-ep.html
cocos2d-x到底是怎样实现跨平台的呢?这里以Win32和AndroID为例。
先看一下一个项目创建后的目录结构吧!这还是以HelloCpp为例。
从左边目录可以看到,Classes和Resource已经平台无关了,而Classes中包含了AppDelegate类,因此我们可以认为AppDelegate是与平台最接近的类,在它以上就要区分平台了。
在前一篇就介绍了Win32怎么开始cocos2dx,Win32平台下main.cpp就是程序入口:
[cpp] view plain copy intAPIENTRY_tWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPTSTRlpCmdline,87); Font-weight:bold; background-color:inherit">intnCmdshow) { UNREFERENCED_ParaMETER(hPrevInstance); UNREFERENCED_ParaMETER(lpCmdline); //createtheapplicationinstance AppDelegateapp;//创建应用实例 CCEGLVIEw*eglVIEw=CCEGLVIEw::sharedOpenGLVIEw(); eglVIEw->setVIEwname("HelloCpp"); eglVIEw->setFrameSize(2048,1536); eglVIEw->setFrameZoomFactor(0.4f); returnCCApplication::sharedApplication()->run();//运行程序 } Win32下的实现比较简单,就是正常的创建实例,运行就可以了。
我们先看一下AndroID下cocos2d-x程序入口点在哪,我们知道AndroID是采用Java编写的,而cocos2d-x是c++编写的,所以如果要在Java中调用c++代码,那就需要采用JNI技术,看起来好像高端大气上档次,其实程序就是函数调用,也就是输入→处理→输出,所以JNI实际上简单抽象出来就这么回事:
copy java输入→Jni→c++输入→c++处理(API实现)→c++输出→Jni→java输出 在 \proj.androID\jni\hellocpp文件夹下可以找到main.cpp,这就是cocos2d-x的入口:
copy jintJNI_OnLoad(JavaVM*vm,voID*reserved) { JniHelper::setJavaVM(vm); returnJNI_VERSION_1_4; } voIDJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(jnienv*env,jobjectthiz,jintw,jinth) if(!CCDirector::sharedDirector()->getopenGLVIEw()) CCEGLVIEw*vIEw=CCEGLVIEw::sharedOpenGLVIEw(); vIEw->setFrameSize(w,h); AppDelegate*pAppDelegate=newAppDelegate(); CCApplication::sharedApplication()->run(); } else ccGlinvalIDateStateCache(); CCshadercache::sharedshadercache()->reloadDefaultShaders(); ccDrawInit(); CCTextureCache::reloadAllTextures(); CCNotificationCenter::sharednotificationCenter()->postNotification(EVENT_COME_TO_FOREGROUND,NulL); CCDirector::sharedDirector()->setGLDefaultValues(); }
里面包含了2个函数,JNI_OnLoad和Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit。我们看一下功能而先不管它在哪里被调用。
(1)JNI_OnLoad,这个函数主要是用来告诉AndroID VM当前使用的是什么版本是Jni,如果不提供此函数,则默认使用Jni1.1版本。
(2)Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit,这个函数很明显就是运行一个cocos2d-x的应用实例了,这和Win32是一样的,当然它多了一个openGlVIEw的检测。一旦调用了它那么cocos2d-x游戏启动。
接下来再看看它们是在哪里被调用的。
在proj.androID\src\org\cocos2dx\hellocpp目录下,可以看到AndroID的入口Activity,也就是HelloCpp,它继承自Cocos2dxActivity。
[java] copy publicclassHelloCppextendsCocos2dxActivity{ protectedvoIDonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); static{ System.loadlibrary("hellocpp"); } 很简单的代码,因为功能都被封装到Cocos2dxActivity中了,所以OnCreate中调用了父类的OnCreate就把功能都实现了,而system.Loadlibrary就是载入编译出来的.so文件,此时就会执行JNI_OnLoad。
那最重要的Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit是在哪调用呢?这就比较麻烦了,先大致了解一下Cocos2dxActivity做了一些什么事。
直接进入Cocos2dxActivity的OnCreate函数,它调用了一个init初始化函数:
copy voIDinit(){ //设置布局,是一个FrameLayout VIEwGroup.LayoutParamsframelayout_params= newVIEwGroup.LayoutParams(VIEwGroup.LayoutParams.FILL_PARENT,248)"> VIEwGroup.LayoutParams.FILL_PARENT); FrameLayoutframelayout=newFrameLayout(this); framelayout.setLayoutParams(framelayout_params); //设置Cocos2dxEditText布局,这一个跟GLSurfaceVIEw兼容的edittext VIEwGroup.LayoutParamsedittext_layout_params= VIEwGroup.LayoutParams.WRAP_CONTENT); Cocos2dxEditTextedittext=newCocos2dxEditText(this); edittext.setLayoutParams(edittext_layout_params); //添加到framelaout framelayout.addVIEw(edittext); //创建Cocos2dxGLSurfaceVIEw this.mGLSurfaceVIEw=this.onCreateVIEw(); framelayout.addVIEw(this.mGLSurfaceVIEw); //SwitchtosupportedOpenGL(ARGB888)modeonemulator if(isAndroIDEmulator()) this.mGLSurfaceVIEw.setEGLConfigChooser(8,16,0); background-color:inherit">0); //设置Cocos2dxRenderer和Cocos2dxEditText this.mGLSurfaceVIEw.setCocos2dxRenderer(newCocos2dxRenderer()); this.mGLSurfaceVIEw.setCocos2dxEditText(edittext); //设置framelayout作为内容视图 setContentVIEw(framelayout); }
在这里Cocos2dxActivity做的就是创建Cocos2dxGLSurfaceVIEw,并设置了Cocos2dxRenderer和Cocos2dxEditText,然后添加到FramLayout。具体的各部分实现这里就不贴代码了,画了个图:
以上是内存溢出为你收集整理的【玩转cocos2d-x之四】cocos2d-x怎么实现跨平台全部内容,希望文章能够帮你解决【玩转cocos2d-x之四】cocos2d-x怎么实现跨平台所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)