将cocos界面抽象成一个View给安卓其它APP调用

Android app中界面表现力不强,如果要做出很炫的效果,就要使用大量的帧动画。为了使效果丰富,而且cocos中的骨骼动画很灵活还能节省很多资源。可以在cocos中做好开发给其它安卓app调用,如果需要交互,通过jni交互即可。
我们使用的cocos的界面都是用一个Activity包起来的。我们的Activity继承自Cocos2dxActivity,在Cocos2dxActivity中给我们做了一些初始化的操作,让我们的游戏可以运行起来。其实cocos在安卓上面 就是一个SurfaceView,将其抽出来给其它app调用即可。
如果你对android很熟悉,surfaceView你应该很熟悉。把cocos从Activity中抽出来,让你对于引擎的理解也会更深一点。下面直接上代码。引擎版本2.2.3,新版本相同原理。

1:先给个布局来包这个surfaceView




    
    
    

2:依赖引擎的java工程

在cocos2dx/platform/android目录下

3:首先肯定是加载so库啊

static {
        System.loadLibrary("gnustl_shared");
        System.loadLibrary("cocos2dengine");
        System.loadLibrary("cocos2dgame");
    }

此处加载了3个库,一个stl、一个引擎、一个游戏。这么做的好处就是如果引擎做了修改,只要替换引擎的so就可以了,不用所有的游戏都把引擎重新编译一遍了。此种方法对于那些游戏比较多的情况比较好用。后面会专门说这个分包技术。

4:View的代码,具体看注释

package com.cocos.test;

import android.content.Context;
import android.graphics.PixelFormat;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.lib.Cocos2dxHelper;
import org.cocos2dx.lib.Cocos2dxRenderer;


public class CososView extends FrameLayout implements Cocos2dxHelper.Cocos2dxHelperListener {

    private Context mContext;
    private FrameLayout mCocos;

    private Cocos2dxGLSurfaceView mGLSurfaceView;

    public AdPetView(Context context) {
        super(context);
        mContext = context;

        // 初始化cocos运行环境
        Cocos2dxHelper.init(mContext, this);

        // 展开布局
        LayoutInflater.from(mContext).inflate(R.layout.cocos_layout, this);
        mCocos = (FrameLayout) findViewById(R.id.id_cocos);

        // 创建SurfaceView
        mGLSurfaceView = createSurfaceView();
        // 设置renderer
        Cocos2dxRenderer renderer = new Cocos2dxRenderer();
        renderer.setScreenWidthAndHeight(1280, 800);
        mGLSurfaceView.setCocos2dxRenderer(renderer);
        
        // 把surfaceView添加到当前view中
        mCocos.addView(mGLSurfaceView);
    }

    // 创建surfaceView
    private Cocos2dxGLSurfaceView createSurfaceView() {
        // 修改透明背景必须修改的地方
        Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(mContext);
        glSurfaceView.setZOrderOnTop(true);
        glSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
        glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

        return glSurfaceView;
    }
    
    // onresume中调用
    public void onCocosViewResume() {
        if (mGLSurfaceView != null) {
            mGLSurfaceView.onResume();
        }
    }
    
    // onPuase时调用
    public void onCocosViewPause() {
         if (mGLSurfaceView != null) {
             mGLSurfaceView.onPause();
         }   
    }

    // 加载so库
    static {
        System.loadLibrary("gnustl_shared");
        System.loadLibrary("cocos2dxtc");
        System.loadLibrary("cocos2dcpp");
    }
}

其实是非常简单的一件事情。

5:放在其它activity中调用

package com.cocos.view

public class CososActivity extends Acitivity {
    
    // cocosView成员变量
    private CocosView mCocosView;
    
    @Override
    protected void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        // 新建cocosView变量
        mCocosView = new CocosView(this);
        setContentView(mCocosView);
    }
    
    @Override
    protected void onResume() {
        // 需要调用cocosview中的resume方法
        mCocosView.onCocosViewResume();
    }
    
    @Override
    protected void onPause() {
        // 需要调用cocosview中的onpause方法
        mCocosView.onCocosViewPause();
    }
}

至此,抽离工作就已经完成了。如果需要交互则进行jni交互

注意事项

1:CocosView中加载了so库,如果在安卓app中也使用到了其它so库,请务必保证两者路径统一,如果都是用armeabi-v7a则都是用同一路径,如果都是使用arm64-v8a,则都是用64位的库。虽然64位兼容32位,但是也不能混着用啊。
2:抽出来的view,因为不是在activity的生命周期中,所以需要手动去调用onpause和onresume。
3:Cocos2dxGLSurfaceView中对返回键进行了吞噬,需要放开则需要修改引擎的代码

你可能感兴趣的:(将cocos界面抽象成一个View给安卓其它APP调用)