Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Cocos2dx 对android支持原理大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

Cocos2dx 基于opengl es 实现跨平台功能,然android 已经支持native ,还是需要使用到android平台中的特性。

首先从程序的主入口@H_758_9@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.@H_244_197@WRAP_CONTENT);

Cocos2dxEditTextedittext=newCocos2dxEditText(this);

edittext.setLayoutParams(edittext_layout_params);

framelayout.addView(edittext);

this.@H_244_197@mGLSurfaceView=this.onCreateView();

@H_711_269@mGLSurfaceView.setEGLConfigChooser(8,8,8);

framelayout.addView(@H_711_269@mGLSurfaceView);

@H_711_269@mGLSurfaceView.setCocos2dxRenderer(newCocos2dxRenderer());

@H_711_269@mGLSurfaceView.setCocos2dxEditText(edittext);

@H_244_197@mFrameLayout=framelayout;

}

创建一个framelayout将@H_325_334@mGLSurfaceViewadd进来,并且@H_325_334@mGLSurfaceView通过setCocos2dxRenderer设置一个cocos2dxRenderer,并通过GLThread调起RendereronSurfaceCreated方法(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 方法,不分析。

3、onResume(),基类 Cocos2dxGLSurfaceView

@Override

voidonResume(){

super.onResume();

this.queueEvent(newRunnable(){

@Override

voidrun(){Cocos2dxGLSurfaceView.@H_711_269@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();

@H_244_197@mFrameCount+=1;

if(@H_244_197@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),不停的驱动渲染画面,让游戏动起来。


6、UiThread跟GLThread

手游引擎需要兼顾UI事件跟屏幕帧数的刷新,在andorid中采用了UI线程+渲染线程,UI线程捕获跟用户交互的信息和事件,并跟渲染进程交互对游戏进行渲染,例如上述的setCocos2dxRenderer设置了渲染进程。

在接入SDK的登录的时候需要将Login函数写入runGLthread中。

voidrunOnGLThread(finalRunnablepRunnablE)

{

@H_711_269@mGLSurfaceView.queueEvent(pRunnablE);

}

publicvoidqueueEvent(Runnabler){

if(r==null){

thrownewIllegalArgumentexception("rmustnotbenull");

}

synchronized(sGLThreadManager){

@H_509_91@mEventQueue.add(r);

sGLThreadManager.notifyAll();

}

}

GLThreadrun中:

if(!mEventQueue.isEmpty()){

event=mEventQueue.remove(0);

break;

}

if(event!=null){

event.run();

event=null;

conTinue;

}


当点击登录,UI线程捕获到了,需要传递给引擎,让渲染线程根据画面的元素的状态重新绘画,UI线程通过@H_711_269@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.5\cocos2dx\platform\android

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.jb51.net/article/49452.htm

大佬总结

以上是大佬教程为你收集整理的Cocos2dx 对android支持原理全部内容,希望文章能够帮你解决Cocos2dx 对android支持原理所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。