Android app中界面表现力不强,如果要做出很炫的效果,就要使用大量的帧动画。为了使效果丰富,而且cocos中的骨骼动画很灵活还能节省很多资源。可以在cocos中做好开发给其它安卓app调用,如果需要交互,通过jni交互即可。
我们使用的cocos的界面都是用一个Activity包起来的。我们的Activity继承自Cocos2dxActivity,在Cocos2dxActivity中给我们做了一些初始化的操作,让我们的游戏可以运行起来。其实cocos在安卓上面 就是一个SurfaceView,将其抽出来给其它app调用即可。
如果你对android很熟悉,surfaceView你应该很熟悉。把cocos从Activity中抽出来,让你对于引擎的理解也会更深一点。下面直接上代码。引擎版本2.2.3,新版本相同原理。
1:先给个布局来包这个surfaceView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/id_cocos"
android:layout_width="580dp"
android:layout_height="580dp">
</FrameLayout>
</LinearLayout>
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中对返回键进行了吞噬,需要放开则需要修改引擎的代码
网友评论