前言-
上一次我们成功运行了官方给我们的样本,是不是很有干劲啊?!这次我们就来看看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(); } } }