注释部分很重要,不可遗漏!
MainActivity的实现:
class MyGame extends Cocos2dxActivity{
void onCreate(Bundle savedInstanceState){
requestPermission();
unObbZip();//这里应该改为requestPermission的result回调成功时调用
super.onCreate(savedInstanceState);//该方法调用了Cocos2dxActivity的onCreate方法,实现如下
NativeCode.It().Init(this);//该方法调用了SDK.getInstance().Init()
}
}
class Cocos2dxActivity extends Activity{
void onCreate(Bundle savedInstanceState){
load游戏主体.so;
super.onCreate(savedInstanceState);
this.init();//该方法调用了 new Cocos2dxRender()
Cocos2dxHelper.init(this,this,this);
}
}
Cocos2dxRender的实现:
class Cocos2dxRender implements GLSurfaceView.Render{
@Override
public void onSurfaceCreated(final GL10 pGL10,final EGLConfig pEGLConfig){
Cocos2dxRender.nativeInit(this.mScreenWidth,this.mScreenHeight);
//该方法调用了C++里实现的jni接口,其中调用了 ioThreadRenderInit(),该接口启用了OnMainLoopThread线程
//OnMainLoopThread 调用了 real_applicationInit()和 g_pWindowswLayer->OnMainLoopThread()
//real_applicationInit在安卓的Main.cpp中有定义,该方法调用了 CCApplication->run()
//安卓的CCApplication.cpp中run()调用了 applicationDidFinishLaunching()
//applicationDidFinishLaunching 在 AppDelegate中定义,
//调用了 pDirector->runWithScene(CGameScene),
//CGameScene::scene()创建了 CXWindowswLayer,
//CXWindowswLayer构造函数里设置了 g_pWindowswLayer= this,并且设置了
//CIOJavaCallManager::It()->nativeOnRender = callback_nativeOnRender(该函数被渲染线程调用)
//g_pWindowswLayer->OnMainLoopThread()开始循环,调用了CCDirector::sharedDirector()->mainLoop
//其中结点先Update,然后调用所有结点的visit渲染
//由于打开了多线程渲染开关,所以只是把OpenGL命令加入到了渲染队列里,让渲染线程使用。
}
@Override
public void onDrawFrame(final GL10 gl){
Cocos2dxRender.nativeRender();
//该方法调用了C++里的 Java_org_cocos2dx_lib_Cocos2dxRender_nativeRender()
//其中当多线程渲染开关开启时调用 CIOJavaCallManager::It()->NativeOnRender渲染
//调用了初始化流程中设置的 callback_nativeOnRender进行渲染。
//没有启用多线程渲染时,该Jni接口直接调用 CCDirector::sharedDirector()->mainLoop,
//里面调用了drawScene,先Update所有结点,再调用visit渲染。
}
}