Cocos2dx引擎2-运行流程-基于Android

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步骤一样,这里就不多说了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值