【Android】用Cubism 2制作自己的Live2D——初探Live2D在Android上的运行!

前言-

上一次我们成功运行了官方给我们的样本,是不是很有干劲啊?!这次我们就来看看Live2D是怎么在手机上运行的!

准备-

上次运行成功的官方样本——第一次我们先看简单的,就是那个名字叫Sample的项目,看起来就很见到不是么?!她的目录里除了lib库中的Live2D的jar包之外,就剩两个类了,看来这就是今天的全部工作量了!争取不加班!

顺便我们还要看看这个项目跑出来的样子,大概就是这样,在屏幕中间绘制模型,然后让模型的头横摆?!

开工-

依旧还是从简单的着手,SampleActivity.java:

public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //初始化Live2D
        Live2D.init();
        //建立一个View继承自GLSurfaceView,并把它显示出来
        SampleGLSurfaceView     view = new SampleGLSurfaceView(this) ;
        setContentView( view ) ;
    }

这里根据官方的解说文档

Live2D.init();方法必须在程序开始使用Live2D前至少调用一次,一调用一次或者连续调用都会是程序不稳定。

在初始化的时候会显示如下的标准Live2D版本信息

Live2D version 1.0.00 for Platform 

这里我可找到了

当然有初始化肯定就会有对应的注销方法dispose();这里没用到,但是中文版的说明书里给了这样的注释

當呼叫dispose函數後就會釋放Live2D所佔有的所有資源。
呼叫init前請不要呼叫此函數。
基本上使用於應用程式結束時呼叫。
可應用於記憶體極少的例外環境。
不需要或是欲完全切斷函式庫連結時,可以呼叫此函數釋放資源。於下次要使用時再呼叫init初始化

还有一个自定义的类SampleGLSurfaceView,它继承自GLSurfaceView,这个类就是核心了(废话一共就两个,第一个就没啥东西)

从下一行

setContentView(view);

 可以看出SampleGLSurfaceView是一个自已绘制的View,她又继承自GLSurfaceView。这个GLSurfaceView可就厉害了, 在Android端使用OpenGL ES的过程中,GLSurfaceView就扮演者一个重要的角色,通过OpenGL进行绘制,可在SurfaceView所提供的Surface进行绘制。 

public class MySampleGLSurfaceView extends GLSurfaceView {
    private  MySampleGLRenderer renderer;
    public MySampleGLSurfaceView(Context context) {
        super(context);
        renderer=new MySampleGLRenderer();
        setRenderer(renderer);
    }

    class MySampleGLRenderer implements Renderer{
        private Live2DModelAndroid live2DModel;
        private final String MODLE_PATH="mei/model.moc";
        private final String TEXTURE_PATHS[] = {
                        "mei/textures/texture_00.png"
                } ;;
        @Override
        public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
            try {
                InputStream in = getContext().getAssets().open( MODLE_PATH ) ;
                live2DModel = Live2DModelAndroid.loadModel( in ) ;
                in.close() ;

                for (int i = 0 ; i < TEXTURE_PATHS.length ; i++ )
                {
                    InputStream tin = getContext().getAssets().open( TEXTURE_PATHS[i] ) ;
                    int texNo = UtOpenGL.loadTexture(gl10 , tin , true ) ;
                    live2DModel.setTexture( i , texNo ) ;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onSurfaceChanged(GL10 gl10, int width, int height) {
            gl10.glViewport(0,0,width,height);
            gl10.glMatrixMode((GL10.GL_PROJECTION));
            gl10.glLoadIdentity();
            float modelWidth=live2DModel.getCanvasWidth();
            float aspect=(float)width/height;
            //这个glorthof好像很厉害的样子!!
            gl10.glOrthof(0,modelWidth,modelWidth/aspect,0,0.5f,-0.5f);
        }

        @Override
        public void onDrawFrame(GL10 gl10) {
            //glMatrixMode()对接下来要做什么进行一下声明
            /*
             *GL_PROJECTION 投影,
             *GL_MODELVIEW 模型视图,
             *GL_TEXTURE 纹理.
             */
            gl10.glMatrixMode(GL10.GL_MODELVIEW);
            //恢复初始坐标的手段
            gl10.glLoadIdentity();
            //清除当前缓冲区的缓冲值
            /*
            *GL_COLOR_BUFFER_BIT当前可写的颜色缓冲
            *GL_DEPTH_BUFFER_BIT深度缓冲
            *GL_ACCUM_BUFFER_BIT累积缓冲
            *GL_STENCIL_BUFFER_BIT模板缓冲
            */
            gl10.glClear(GL10.GL_COLOR_BUFFER_BIT);
            double t = (UtSystem.getUserTimeMSec()/1000.0) * 2 * Math.PI  ;
            double cycle=3.0;
            double sin=Math.sin( t/cycle );
            live2DModel.setParamFloat("PARAM_ANGLE_X",(float)(30*sin));
            live2DModel.setGL(gl10);
            live2DModel.update();
            live2DModel.draw();
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/YFEYI/p/10611371.html