【玩转cocos2d-x之四】cocos2d-x怎么实现跨平台

原创作品,转载请标明:http://blog.youkuaiyun.com/jackystudio/article/details/12610287


cocos2d-x到底是怎样实现跨平台的呢?这里以Win32和Android为例。


1.跨平台项目目录结构

先看一下一个项目创建后的目录结构吧!这还是以HelloCpp为例。




从左边目录可以看到,Classes和Resource已经平台无关了,而Classes中包含了AppDelegate类,因此我们可以认为AppDelegate是与平台最接近的类,在它以上就要区分平台了。


2.Win32下的实现

在前一篇就介绍了Win32怎么开始cocos2dx,Win32平台下main.cpp就是程序入口:

  1. intAPIENTRY_tWinMain(HINSTANCEhInstance,
  2. HINSTANCEhPrevInstance,
  3. LPTSTRlpCmdLine,
  4. intnCmdShow)
  5. {
  6. UNREFERENCED_PARAMETER(hPrevInstance);
  7. UNREFERENCED_PARAMETER(lpCmdLine);
  8. //createtheapplicationinstance
  9. AppDelegateapp;//创建应用实例
  10. CCEGLView*eglView=CCEGLView::sharedOpenGLView();
  11. eglView->setViewName("HelloCpp");
  12. eglView->setFrameSize(2048,1536);
  13. eglView->setFrameZoomFactor(0.4f);
  14. returnCCApplication::sharedApplication()->run();//运行程序
  15. }
Win32下的实现比较简单,就是正常的创建实例,运行就可以了。


3.Android下的实现


3.1.cocos2d-x程序入口

我们先看一下Android下cocos2d-x程序入口点在哪,我们知道Android是采用Java编写的,而cocos2d-x是c++编写的,所以如果要在Java中调用c++代码,那就需要采用JNI技术,看起来好像高端大气上档次,其实程序就是函数调用,也就是输入→处理→输出,所以JNI实际上简单抽象出来就这么回事:

  1. java输入→Jni→c++输入→c++处理(API实现)→c++输出→Jni→java输出
\proj.android\jni\hellocpp文件夹下可以找到main.cpp,这就是cocos2d-x的入口:

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

里面包含了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游戏启动。

接下来再看看它们是在哪里被调用的。


3.2.JNI_OnLoad的调用

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

[java] view plain copy
  1. publicclassHelloCppextendsCocos2dxActivity{
  2. protectedvoidonCreate(BundlesavedInstanceState){
  3. super.onCreate(savedInstanceState);
  4. }
  5. static{
  6. System.loadLibrary("hellocpp");
  7. }
  8. }
很简单的代码,因为功能都被封装到Cocos2dxActivity中了,所以OnCreate中调用了父类的OnCreate就把功能都实现了,而system.LoadLibrary就是载入编译出来的.so文件,此时就会执行JNI_OnLoad。


3.3.Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit的调用

那最重要的Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit是在哪调用呢?这就比较麻烦了,先大致了解一下Cocos2dxActivity做了一些什么事。

直接进入Cocos2dxActivity的OnCreate函数,它调用了一个init初始化函数:

[java] view plain copy
  1. publicvoidinit(){
  2. //设置布局,是一个FrameLayout
  3. ViewGroup.LayoutParamsframelayout_params=
  4. newViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
  5. ViewGroup.LayoutParams.FILL_PARENT);
  6. FrameLayoutframelayout=newFrameLayout(this);
  7. framelayout.setLayoutParams(framelayout_params);
  8. //设置Cocos2dxEditText布局,这一个跟GLSurfaceView兼容的edittext
  9. ViewGroup.LayoutParamsedittext_layout_params=
  10. newViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
  11. ViewGroup.LayoutParams.WRAP_CONTENT);
  12. Cocos2dxEditTextedittext=newCocos2dxEditText(this);
  13. edittext.setLayoutParams(edittext_layout_params);
  14. //添加到framelaout
  15. framelayout.addView(edittext);
  16. //创建Cocos2dxGLSurfaceView
  17. this.mGLSurfaceView=this.onCreateView();
  18. //添加到framelaout
  19. framelayout.addView(this.mGLSurfaceView);
  20. //SwitchtosupportedOpenGL(ARGB888)modeonemulator
  21. if(isAndroidEmulator())
  22. this.mGLSurfaceView.setEGLConfigChooser(8,8,8,8,16,0);
  23. //设置Cocos2dxRenderer和Cocos2dxEditText
  24. this.mGLSurfaceView.setCocos2dxRenderer(newCocos2dxRenderer());
  25. this.mGLSurfaceView.setCocos2dxEditText(edittext);
  26. //设置framelayout作为内容视图
  27. setContentView(framelayout);
  28. }

在这里Cocos2dxActivity做的就是创建Cocos2dxGLSurfaceView,并设置了Cocos2dxRenderer和Cocos2dxEditText,然后添加到FramLayout。具体的各部分实现这里就不贴代码了,画了个图:


好了,就这样吧。因为我对Android界面开发,特别是OpenGLView这块也不熟,所以只能大概推出是这样子了,有什么错误,还请指出。
Cocos2D-X是全球知名的开源跨平台游戏引擎,易学易用,目前已经支持 iOS、Android、Windows 桌面、Mac OS X、Linux、BlackBerry、Windows Phone 等平台。Cocos2d-JS统一了使用JS进行开发开发体验,将HTML5引擎与JSB的API高度统一起来。捕鱼达人HTML 5版本基于此引擎实现对浏览器的支持,并获得谷歌Web Store首页置顶推荐。引擎配套有活跃的社区支持,已有来自Google、Zynga、Microsoft、Intel、Samsung、BlackBerry等跨国公司的优秀工程师为引擎贡献代码,开源社区24小时轮转所有的缺陷都被迅速发现并修复。 Cocos2D-X已被海内外顶尖的游戏公司,如Zynga、Glu、Gree、DeNA、TinyCo、Gamevil、HandyGames、人人游戏、4399、搜狐畅游、昆仑万维、热酷、乐元素、菲音、心动游戏等用于其主流 iOS/Android游戏开发。 目前移动平台最火爆收入最高的几款游戏,如月收入超过千万的捕鱼达人2、龙之力量、忘仙OL、神仙道等均是基于Cocos2d-x开发。多款下载量千万次以上的知名手机游戏。如捕鱼达人、口袋商业街、小小村庄、云和绵羊、三国群殴传等,同样是基于Cocos2d-x开发。已经有2000多款基于Cocos2d-x开发的发布在全球各大应用商城,累计下载量超过5亿次。 众多知名端游、页游公司选择Cocos2d-x引擎开发移动游戏。如盛大游戏、昆仑万维 、畅游、完美世界、4399、广州菲音、金山西山居等。神仙道、星晨变、卧龙吟、东风破等游戏已经基于Cocos2d-x成功移植至手机平台,并取得非常优异的成绩。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值