Cocos2dx 对android支持原理
Cocos2dx 基于opengl es 实现跨平台功能,虽然android 已经支持native ,还是需要使用到android平台中的特性。 首先从程序的主入口MainActivity MainActivity跟进,java首先加载static函数,将libgame.so导入进来, 根据activity的生命周期,首先调用oncreate()方法,由于继承Cocos2dxActivity类将调用该类的oncreate(),Cocos2dxActivity的核心Init()函数如下: publicvoidinit() { ViewGroup.LayoutParamsframelayout_params=newViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); FrameLayoutframelayout=newFrameLayout(this); framelayout.setLayoutParams(framelayout_params); ViewGroup.LayoutParamsedittext_layout_params=newViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); Cocos2dxEditTextedittext=newCocos2dxEditText(this); edittext.setLayoutParams(edittext_layout_params); framelayout.addView(edittext); this.mGLSurfaceView=this.onCreateView(); mGLSurfaceView.setEGLConfigChooser(8,8,8); framelayout.addView(mGLSurfaceView); mGLSurfaceView.setCocos2dxRenderer(newCocos2dxRenderer()); mGLSurfaceView.setCocos2dxEditText(edittext); mFrameLayout=framelayout; } 创建一个framelayout将mGLSurfaceViewadd进来,并且mGLSurfaceView通过setCocos2dxRenderer设置一个cocos2dx的Renderer,并通过GLThread调起Renderer的onSurfaceCreated方法(androidsdkGLSurfaceView.java)cocos2dx的引擎也就初始化完成。 @Override publicvoidonSurfaceCreated(finalGL10pGL10,finalEGLConfigpEGLConfig) { Cocos2dxRenderer.nativeInit(this.mScreenWidth,this.mScreenHeight); this.mLastTickInNanoSeconds=System.nanoTime(); } nativeInit使用jni的形式调起c++函数 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(); } } 在android平台上,cocos2dx游戏入口跑起来了,依照android平台的特性需要使用opengles需要在AndroidMainfest.xml中声明 <uses-featureandroid:glEsVersion="0x00020000"android:required="true"/> 2、onstart ,没有对其进行重写,调用基类 Activity 方法,不分析。@Override voidonResume(){ super.onResume();
this.queueEvent(newRunnable(){ @Override voidrun(){Cocos2dxGLSurfaceView.mCocos2dxRenderer.handleOnResume(); } }); } voidhandleOnResume(){ Cocos2dxRenderer.nativeOnResume(); } JNIEXPORTvoidJNICALLJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeOnResume(){ if(CCDirector::sharedDirector()->getOpenGLView()){ CCApplication::sharedApplication()->applicationWillEnterForeground(); } } 当active的重新需要显示的时,java的activity跟.so中的c++中的函数关联起来,同理之后的onResume()也是这样跟c++中的关联起来。只需要在对应的c++函数中填写逻辑。 4、游戏 是由 画面构建而成,让画面动起来就需要重绘、渲染,借助GLSurfaceView.Renderer渲染。onDrawFrame(finalGL10gl) { Cocos2dxRenderer.nativeRender(); mFrameCount+=1; if(mFrameCount%100==0) { Cocos2dxHelper.checkMemoryWarning(); } } JNIEXPORTvoidJNICALLJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender(JNIEnv*env){ cocos2d::CCDirector::sharedDirector()->mainLoop(); } 将调用c++中的CCDirector的mainLoop,游戏的循环已经被调用起来,在游戏的mainloop将会实现游戏的检测、绘制等任务。 5、android如何驱动Renderer的onDrawFrame() 由GLSurfaceView在setCocos2dxRenderer调用GLThread线程,GLThread线程中 if(LOG_RENDERER_DRAW_FRAME){ Log.w("GLThread","onDrawFrametid="+getId()); } { GLSurfaceViewview=mGLSurfaceViewWeakRef.get(); if(view!=null){ view.mRenderer.onDrawFrame(gl); } } GLThread外部就是一个while(true),不停的驱动渲染画面,让游戏动起来。 手游引擎需要兼顾UI事件跟屏幕帧数的刷新,在andorid中采用了UI线程+渲染线程,UI线程捕获跟用户交互的信息和事件,并跟渲染进程交互对游戏进行渲染,例如上述的setCocos2dxRenderer设置了渲染进程。 在接入SDK的登录的时候需要将Login函数写入runGLthread中。 voidrunOnGLThread(finalRunnablepRunnable) { mGLSurfaceView.queueEvent(pRunnable); } publicvoidqueueEvent(Runnabler){ if(r==null){ thrownewIllegalArgumentException("rmustnotbenull"); } synchronized(sGLThreadManager){ mEventQueue.add(r); sGLThreadManager.notifyAll(); } } GLThreadrun中: if(!mEventQueue.isEmpty()){ event=mEventQueue.remove(0); break; } if(event!=null){ event.run(); event=null; continue; } 当点击登录,UI线程捕获到了,需要传递给引擎,让渲染线程根据画面的元素的状态重新绘画,UI线程通过mGLSurfaceView.queueEvent(pRunnable);将事件以及处理方法传递给GLThread来执行,完成了UI线程跟GLThread之间的通讯。 在android系统中通过UI线程,如果不在这两个方式中改变UI组件的属性,那么有些SDK的 一些图像显示过程将显示不来了。 有时候我们需要将SDK的接口放置在UI线程中,因为SDK接口可能需要改变到UI组件的属性。
Cocos2dx本身依靠opengles完成跨平台,在android平台下面android已有的opengles API实现对android平台的支持.所以能够看到主要还是继承的COcos2dxActivity 来完成 对cocos2dx 引擎中的 API进行控制,达到控制游戏的目的。 在cocos2dx android目录下还能够看到很多*.java文件,例如音乐 cocos2dx本身通过调用android的API来调用android的硬件资源来实现功能。
参考文件:cocos2d-x-2.2.5cocos2dxplatformandroid http://code.taobao.org/p/cnandroiddocs/src/trunk/opengl/java/android/opengl/GLSurfaceView.java 参考网站: http://www.cnblogs.com/helloandroid/articles/2948081.html http://blog.sina.com.cn/s/blog_69887cd70100jxmu.html http://my.oschina.net/bankofchina/blog/284150 http://www.aspzz.cn/article/49452.htm (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |