AndroidCocosdx程序首先由AppActivity.java文件开始执行
public class AppActivity extendsCocos2dxActivity {
}
类AppActivity继承与Cocos2dxActivity,而AppActivity实现为空,故首先执行父类方法;
在cocos2d\cocos\platform\android\java\src\org\cocos2dx\lib目录下
Cocos2dxActivity.java文件中,Cocos2dxActivity类中的onCreate方法
protected void onCreate(final BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
onLoadNativeLibraries();
sContext= this;
this.mHandler = newCocos2dxHandler(this);
Cocos2dxHelper.init(this);
this.init();
if (mVideoHelper == null) {
mVideoHelper = newCocos2dxVideoHelper(this, mFrameLayout);
}
}
onLoadNativeLibraries()方法加载APK运行时使用的静态库&动态库,例如:libcocos2d.a、libcocos2dandroid.a、libcocos2dcpp.so、libchipmunk.a等;此类库文件是有有系统CPP&C文件编译打包形成,Android中Java通过JNI调用库中的方法;
Cocos2dxHandler是一个辅助类,该类中的方法和属性都是static类型的,this.mHandler = new Cocos2dxHandler(this)是第一次使用
Cocos2dxHandler类,会为Cocos2dxHandler类总的static属性和方法分配空间;
Cocos2dxHelper.init(this)方法初始化一些Cocos2dxHelper类中的static属性;this.init()方法是初始化一些和布局渲染有关的东西;Cocos2dxVideoHelper是一个和Video有关的辅助类;
public void init() {
ViewGroup.LayoutParamsframelayout_params =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
mFrameLayout = new FrameLayout(this);
mFrameLayout.setLayoutParams(framelayout_params);
ViewGroup.LayoutParamsedittext_layout_params =
newViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
Cocos2dxEditText edittext = new Cocos2dxEditText(this);
edittext.setLayoutParams(edittext_layout_params);
mFrameLayout.addView(edittext);
this.mGLSurfaceView = this.onCreateView();
mFrameLayout.addView(this.mGLSurfaceView);
if (isAndroidEmulator())
this.mGLSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 0);
this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
this.mGLSurfaceView.setCocos2dxEditText(edittext);
setContentView(mFrameLayout);
}
Init()方法中刚开始时设置游戏运行窗口的Layout布局,这部分是Android APK有关的东西就不详细说明;
this.mGLSurfaceView = this.onCreateView();为设置游戏的SurfaceView;若是使用的模拟器的话,通过调用this.mGLSurfaceView.setEGLConfigChooser
(8 , 8, 8, 8, 16, 0)设置OpenGL支持(ARGB888);
this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer())为设置渲染Renderer;
this.mGLSurfaceView.setCocos2dxEditText(edittext)和Cocos2dx游戏界面中支持文本框输入数据相关;
public Cocos2dxGLSurfaceView onCreateView() {
return new Cocos2dxGLSurfaceView(this);
}
public Cocos2dxGLSurfaceView(final Context context) {
super(context);
this.initView();
}
protected voidinitView() {
this.setEGLContextClientVersion(2);
this.setFocusableInTouchMode(true);
Cocos2dxGLSurfaceView.mCocos2dxGLSurfaceView= this;
Cocos2dxGLSurfaceView.sCocos2dxTextInputWraper= newCocos2dxTextInputWraper(this);
Cocos2dxGLSurfaceView.sHandler = new Handler() {
public void handleMessage(final Message msg) {
switch (msg.what) {
case HANDLER_OPEN_IME_KEYBOARD:
…………………………….
break;
case HANDLER_CLOSE_IME_KEYBOARD:
…………………………….
break;
}
}
};
Cocos2dxGLSurfaceView 类继承GLSurfaceView是游戏渲染的窗口,在GLSurfaceView中会创建一个子线程,不停的调用渲染窗口,此处很重要,Cocos2dx在Android平台上的渲染命令是Android Java程序中发起的,和Win32中使用while循环不同,从而实现了游戏界面不停的刷新;
Cocos2dxTextInputWraper类和输入法先关;
Cocos2dxGLSurfaceView.sHandler = new Handler()的作用是打开和关闭输入法;
public classCocos2dxRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(final GL10 pGL10, final EGLConfig pEGLConfig){
Cocos2dxRenderer.nativeInit(this.mScreenWidth, this.mScreenHeight);
this.mLastTickInNanoSeconds= System.nanoTime();
}
public void onSurfaceChanged(final GL10 pGL10, final int pWidth, final int pHeight) {
Cocos2dxRenderer.nativeOnSurfaceChanged(pWidth,pHeight);
}
public void onDrawFrame(final GL10 gl) {
Cocos2dxRenderer.nativeRender();
}
private static native void nativeRender();
private static native void nativeInit(final int pWidth, final int pHeight);
private static native void nativeOnSurfaceChanged(final int pWidth, final int pHeight);
………………………………………//该部分和事件有关,在后续博客中会说明
}
Cocos2dxRenderer类实现了GLSurfaceView.Renderer接口,Renderer规定实现该接口的类必须实现三个方法:onSurfaceCreated、onSurfaceChanged、onDrawFrame;onSurfaceCreated和onSurfaceChanged方法在游戏窗口创建时会被先后调用;onDrawFrame方法在每次渲染时都会被调用;这三个方法分别会调用nativeInit、nativeOnSurfaceChanged、nativeRender,这三个方法是使用C/C++实现的;
nativeInit、nativeOnSurfaceChanged、nativeRender方法的C/C++实现位于cocos2d\cocos\platform\android& cocos2d\cocos\platform\android\jni文件夹下的javaactivity.cpp & Java_org_cocos2dx_lib_Cocos2dxRenderer.cpp文件中;
voidJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
{
auto director =cocos2d::Director::getInstance();
auto glview =director->getOpenGLView();
if (!glview){
glview =cocos2d::GLView::create("Android app");
glview->setFrameSize(w,h);
director->setOpenGLView(glview);
cocos_android_app_init(env,thiz);
cocos2d::Application::getInstance()->run();
}else{
cocos2d::GL::invalidateStateCache();
cocos2d::GLProgramCache::getInstance()->reloadDefaultGLPrograms();
cocos2d::DrawPrimitives::init();
cocos2d::VolatileTextureMgr::reloadAllTextures();
cocos2d::EventCustomrecreatedEvent(EVENT_RENDERER_RECREATED);
director->getEventDispatcher()->dispatchEvent(&recreatedEvent);
director->setGLDefaultValues();
}
}
此处流程和Win32下流程类似,这里就不多说了;
JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender
(JNIEnv* env) {
cocos2d::Director::getInstance()->mainLoop();
}
此处调用Director中的mainLoop(),往下就会和Win32步骤一样,这里就不多说了。