cocos2d-x如何实现跨平台

原创 2016年05月11日 11:27:04

【cocos2d-x入门之四】cocos2d-x怎么实现跨平台

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


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




1.跨平台项目目录结构

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


 


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


2.Win32下的实现

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

[cpp] view plaincopy
  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;//创建应用实例  
  11.     CCEGLView* eglView = CCEGLView::sharedOpenGLView();  
  12.     eglView->setViewName("HelloCpp");  
  13.     eglView->setFrameSize(2048, 1536);  
  14.     eglView->setFrameZoomFactor(0.4f);  
  15.     return CCApplication::sharedApplication()->run();//运行程序  
  16. }  
Win32下的实现比较简单,就是正常的创建实例,运行就可以了。


3.Android下的实现


3.1.cocos2d-x程序入口

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

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

[cpp] view plaincopy
  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个函数,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 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. }  
很简单的代码,因为功能都被封装到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 plaincopy
  1. public void init() {  
  2.           
  3.         // 设置布局,是一个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.         // 设置Cocos2dxEditText布局,这一个跟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.         // 创建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.         //设置Cocos2dxRenderer和Cocos2dxEditText  
  31.         this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());  
  32.         this.mGLSurfaceView.setCocos2dxEditText(edittext);  
  33.   
  34.         // 设置framelayout作为内容视图  
  35.     setContentView(framelayout);  
  36.     }  

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


好了,就这样吧。因为我对Android界面开发,特别是OpenGLView这块也不熟,所以只能大概推出是这样子了,有什么错误,还请指出
版权声明:本文为博主原创文章,未经博主允许不得转载。

Cocos2d-x是怎样实现跨平台?

AppDelegate 作为跨平台程序入口,在这之上做了另一层的封装,封装了不同平台的不同实现。比如我们通常认为一个程序是由 main 函数开始运行,那我们就去找寻,我们看到了在 proj.linux...
  • zhanghow
  • zhanghow
  • 2016年12月20日 21:00
  • 1047

cocos2d-x 引擎分析:如何实现跨平台

怎么样使用 Cocos2d-x 快速开发游戏,方法很简单,你可以看看其自带的例程,或者从网上搜索教程,运行起第一个 Scene HelloWorldScene,然后在 HelloWorldScene ...
  • qq563129582
  • qq563129582
  • 2015年01月12日 16:16
  • 3289

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

cocos2d-x到底是这样实现跨平台的呢?这里以Win32和Android为例。 1.跨平台项目目录结构 先看一下一个项目创建后的目录结构吧!这还是以HelloCpp为例。   ...
  • jackyvincefu
  • jackyvincefu
  • 2013年10月11日 08:36
  • 12589

【备忘】麦可网-Cocos2D-X跨平台游戏开发 完整4G下载

教程目录 1、Cocos2d-X引擎概要01 - Lesson1_游戏原理与机制  02 - Lesson2_游戏开发技术  03 - Lesson3_认识Cocos2D-X引擎  04 - ...
  • luanluanxiyang
  • luanluanxiyang
  • 2017年01月09日 17:41
  • 221

开始学习Cocos2d-x进行2D的跨平台游戏开发!

时光变幻。长期以来一直在端游做开发。抬头一看,PC端游,WEBGAME,移动平台已经三分天下。看PC端游无论是在市场前景和投资额度上都有减弱迹象。 未雨绸缪一下。决定开始学习一下跨平台的开发。聊以此...
  • honghaier
  • honghaier
  • 2012年08月20日 12:22
  • 10564

Java如何实现跨平台

Java如何实现跨平台
  • wf131410000
  • wf131410000
  • 2017年05月21日 23:44
  • 1096

cocos2dx 跨平台游戏开发基础框架以及Demo

基本代码结构 demo下载: http://url.cn/HMddsi 实现的功能: 1.地图 45度菱形tile,8方向A*寻路,分块按需加载地图图片,即时清理图片的内存占用 2.精灵的显...
  • hpking
  • hpking
  • 2013年08月01日 19:05
  • 3030

【Java SE】————如何做到跨平台性的?

Java语言特点:          Java具有很多的的特点:简单性,解释性,面向对象,高性能,分布式处理,多线程,健壮性,动态,结构中立,安全性,开源,跨平台。        其中的跨平台是很多语...
  • z15732621736
  • z15732621736
  • 2016年01月29日 00:31
  • 2041

Java是如何实现跨平台的

作者:苏月虹 链接:https://www.zhihu.com/question/30753144/answer/53095878 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商...
  • qingmengwuhen1
  • qingmengwuhen1
  • 2016年07月07日 17:31
  • 2318

Cocos2d-x 之 WebSocket 网络编程

WebSocket 是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一...
  • xingxinmanong
  • xingxinmanong
  • 2017年07月16日 17:38
  • 204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2d-x如何实现跨平台
举报原因:
原因补充:

(最多只允许输入30个字)