Cubism SDK‎ > ‎多平台开发‎ > ‎Android‎ > ‎

创建项目

Last update: 2014/06/04

这里介绍从创建 Android 项目到显示Live2D模型的步骤。

准备工作
  • Eclipse (确保已安装 Android SDK。这里使用的版本是 Eclipse 4.3.2 Kepler SR2 for Windows 
  • Live2D 库 (Live2D SDK 中,「lib」文件夹中的「live2d_android.jar」。这里使用的版本是1.0.02 )
  • Live2D 资源 
Live2D 资源的准备根据所使用的模型而有所不同。
这里使用样例中「haru」的资源来说明。

simple/assets/haru/
  • haru.moc
  • haru.1024/texture_00.png
  • haru.1024/texture_01.png
  • haru.1024/texture_02.png



◆创建项目和预先准备

建立新项目,导入所需的文件。


点击菜单栏「文件」 > 「新建(N)」 > 「其他(O)...」。



在窗口中选择「Android」 > 「Android Application Project」,点击「下一步(N) >」。



设置应用程序名,项目名,包名,点击「下一步(N)」。
之后的选项可自由设定。



最后,设置默认类名,点击「完成(F)」



把 Live2D SDK 中的 /sample/simple/ assets/haru 拖拽至 Eclipse 项目的 assets 文件夹中。



把 Live2D SDK 中的 /lib/live2d_android.jar 拖拽至 Eclipse 项目的 libs 文件夹中。



至此,文件的导入就完成了。
接下来,在项目中为已导入的库(live2d_android.jar)设置路径。


右击 Eclipse 项目的根目录,点击「属性(R)」。



在新窗口中点击「Java构建路径」 > 「库(L)」 > 「添加jar (J)」。



选择项目内 libs 文件夹中的「live2d_android.jar」,点击「确定」。



达到下图所示状态,即完成。




◆设置OpenGL

为了显示出 Live2D 模型,接下来进行 OpenGL 的设置。

在项目自动生成的默认类,或者其上一级目录上右击,点击「新建(N)」 > 「类」。
设置类名,点击「完成(F)」。
这里设置类名为「SampleGLSurfaceView」。



令 SampleGLSurfaceView 类继承 GLSurfaceView 类,添加必要的函数。

  1. public class SampleGLSurfaceView extends GLSurfaceView
  2. {
  3.        
  4. }



  1. public class SampleGLSurfaceView extends GLSurfaceView
  2. {
  3.     public SampleGLSurfaceView(Context context)
  4.     {
  5.         super(context);
  6.                
  7.     }
  8. }



在 SampleGLSurfaceView 类中建立一个内部类,继承 Renderer 接口,用于绘图渲染。

  1. public class SampleGLSurfaceView extends GLSurfaceView
  2. {
  3.     public SampleGLSurfaceView(Context context)
  4.     {
  5.         super(context);
  6.         
  7.     }
  8.        
  9.        
  10.     class SampleGLRenderer implements Renderer
  11.     {
  12.         
  13.     }
  14. }



  1. public class SampleGLSurfaceView extends GLSurfaceView
  2. {
  3.     public SampleGLSurfaceView(Context context)
  4.     {
  5.         super(context);
  6.         
  7.     }
  8.        
  9.        
  10.     class SampleGLRenderer implements Renderer
  11.     {
  12.         @Override
  13.         public void onDrawFrame(GL10 arg0) {
  14.             // TODO 自動生成されたメソッド・スタブ
  15.             
  16.         }

  17.         @Override
  18.         public void onSurfaceChanged(GL10 arg0, int arg1, int arg2) {
  19.             // TODO 自動生成されたメソッド・スタブ
  20.             
  21.         }

  22.         @Override
  23.         public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
  24.             // TODO 自動生成されたメソッド・スタブ
  25.             
  26.         }
  27.     }
  28. }



在 SampleGLSurfaceView 类的构造函数中写初始化语句。

  1.     private SampleGLRenderer renderer ;
  2.  
  3.     public SampleGLSurfaceView(Context context)
  4.     {
  5.         super(context);
  6.  
  7.         renderer = new SampleGLRenderer() ;
  8.         setRenderer(renderer) ;
  9.     }








在 SampleGLRenderer 类的 onSerfaceCreated() 函数中写模型初始化,在 onSurfaceChanged() 函数中写 View 的初始化。

  1.     class SampleGLRenderer implements Renderer
  2.     {
  3.         private Live2DModelAndroid      live2DModel ;
  4.         private final String MODEL_PATH = "haru/haru.moc" ;
  5.         private final String TEXTURE_PATHS[] =
  6.             {
  7.                 "haru/haru.512/texture_00.png" ,
  8.                 "haru/haru.512/texture_01.png" ,
  9.                 "haru/haru.512/texture_02.png"
  10.             } ;
  11.  
  12.         @Override
  13.         public void onDrawFrame(GL10 gl)
  14.         {
  15.             // TODO 自動生成されたメソッド・スタブ
  16.         }
  17.  
  18.  
  19.         @Override
  20.         public void onSurfaceChanged(GL10 gl, int width, int height)
  21.         {
  22.             gl.glViewport(0 , 0 , width , height) ;
  23.  
  24.             gl.glMatrixMode(GL10.GL_PROJECTION) ;
  25.             gl.glLoadIdentity() ;
  26.  
  27.             float modelWidth = live2DModel.getCanvasWidth();
  28.             float visibleWidth = modelWidth * (3.0f/4.0f);
  29.             float margin = 0.5f * (modelWidth/4.0f) ;
  30.  
  31.             gl.glOrthof(margin, margin+visibleWidth, visibleWidth*height/width, 0, 0.5f, -0.5f);
  32.         }
  33.  
  34.  
  35.         @Override
  36.         public void onSurfaceCreated(GL10 gl, EGLConfig config)
  37.         {
  38.             try
  39.             {
  40.                 InputStream in = getContext().getAssets().open(MODEL_PATH) ;
  41.                 live2DModel = Live2DModelAndroid.loadModel(in) ;
  42.                 in.close() ;
  43.  
  44.                 for (int i = 0 ; i < TEXTURE_PATHS.length ; i++)
  45.                 {
  46.                     InputStream tin = getContext().getAssets().open(TEXTURE_PATHS[i]) ;
  47.                     int texNo = UtOpenGL.loadTexture(gl , tin , true) ;
  48.                     live2DModel.setTexture(i , texNo) ;
  49.                 }
  50.             }
  51.             catch (IOException e)
  52.             {
  53.                 e.printStackTrace();
  54.             }
  55.         }
  56.     }




最后,在 onDrawFrame() 函数中绘制模型。

  1.     class SampleGLRenderer implements Renderer
  2.     {
  3.         private Live2DModelAndroid      live2DModel ;
  4.         private final String MODEL_PATH = "haru/haru.moc" ;
  5.         private final String TEXTURE_PATHS[] =
  6.             {
  7.                 "haru/haru.512/texture_00.png" ,
  8.                 "haru/haru.512/texture_01.png" ,
  9.                 "haru/haru.512/texture_02.png"
  10.             } ;
  11.  
  12.         @Override
  13.         public void onDrawFrame(GL10 gl)
  14.         {
  15.             gl.glMatrixMode(GL10.GL_MODELVIEW) ;
  16.             gl.glLoadIdentity() ;
  17.             gl.glClear(GL10.GL_COLOR_BUFFER_BIT) ;
  18.             gl.glEnable(GL10.GL_BLEND) ;
  19.             gl.glBlendFunc(GL10.GL_ONE , GL10.GL_ONE_MINUS_SRC_ALPHA) ;
  20.             gl.glDisable(GL10.GL_DEPTH_TEST) ;
  21.             gl.glDisable(GL10.GL_CULL_FACE) ;
  22.  
  23.             live2DModel.setGL(gl) ;
  24.  
  25.             live2DModel.update() ;
  26.             live2DModel.draw() ;
  27.         }
  28.  
  29.  
  30.         @Override
  31.         public void onSurfaceChanged(GL10 gl, int width, int height)
  32.         {
  33.             gl.glViewport(0 , 0 , width , height) ;
  34.  
  35.             gl.glMatrixMode(GL10.GL_PROJECTION) ;
  36.             gl.glLoadIdentity() ;
  37.  
  38.             float modelWidth = live2DModel.getCanvasWidth();
  39.             float visibleWidth = modelWidth * (3.0f/4.0f);
  40.             float margin = 0.5f * (modelWidth/4.0f) ;
  41.  
  42.             gl.glOrthof(margin, margin+visibleWidth, visibleWidth*height/width, 0, 0.5f, -0.5f);
  43.         }
  44.  
  45.  
  46.         @Override
  47.         public void onSurfaceCreated(GL10 gl, EGLConfig config)
  48.         {
  49.             try
  50.             {
  51.                 InputStream in = getContext().getAssets().open(MODEL_PATH) ;
  52.                 live2DModel = Live2DModelAndroid.loadModel(in) ;
  53.                 in.close() ;
  54.  
  55.                 for (int i = 0 ; i < TEXTURE_PATHS.length ; i++)
  56.                 {
  57.                     InputStream tin = getContext().getAssets().open(TEXTURE_PATHS[i]) ;
  58.                     int texNo = UtOpenGL.loadTexture(gl , tin , true) ;
  59.                     live2DModel.setTexture(i , texNo) ;
  60.                 }
  61.             }
  62.             catch (IOException e)
  63.             {
  64.                 e.printStackTrace();
  65.             }
  66.         }
  67.     }





View 类的调用

在默认生成的 MainActivity 的 onCreate() 函数中,创建 SampleGLSurfaceView 的实例并将其传入 setContentView(),设置为该 Activity 的显示画面。

  1. package jp.live2d.sample;
  2.  
  3. import jp.live2d.Live2D;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6.  
  7. public class MainActivity extends Activity {
  8.  
  9.         @Override
  10.         protected void onCreate(Bundle savedInstanceState) {
  11.                 super.onCreate(savedInstanceState);
  12.  
  13.         Live2D.init();
  14.         SampleGLSurfaceView view = new SampleGLSurfaceView(this) ;
  15.         setContentView( view ) ;
  16.         }
  17. }



完成



最终代码如下。


MainActivity.java
  1. package jp.live2d.sample;
  2.  
  3. import jp.live2d.Live2D;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.view.Menu;
  7.  
  8. public class MainActivity extends Activity {
  9.  
  10.         @Override
  11.         protected void onCreate(Bundle savedInstanceState) {
  12.                 super.onCreate(savedInstanceState);
  13.  
  14.         Live2D.init();
  15.         SampleGLSurfaceView view = new SampleGLSurfaceView(this) ;
  16.         setContentView( view ) ;
  17.         }
  18.  
  19.         @Override
  20.         public boolean onCreateOptionsMenu(Menu menu) {
  21.                 // Inflate the menu; this adds items to the action bar if it is present.
  22.                 getMenuInflater().inflate(R.menu.main, menu);
  23.                 return true;
  24.         }
  25.  
  26. }


SampleGLSurfaceView.java
  1. package jp.live2d.sample;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5.  
  6. import javax.microedition.khronos.egl.EGLConfig;
  7. import javax.microedition.khronos.opengles.GL10;
  8.  
  9. import jp.live2d.android.Live2DModelAndroid;
  10. import jp.live2d.android.UtOpenGL;
  11. import android.content.Context;
  12. import android.opengl.GLSurfaceView;
  13.  
  14. public class SampleGLSurfaceView extends GLSurfaceView
  15. {
  16.         private SampleGLRenderer                renderer ;
  17.  
  18.         public SampleGLSurfaceView(Context context)
  19.         {
  20.                 super(context);
  21.  
  22.                 renderer = new SampleGLRenderer() ;
  23.                 setRenderer( renderer ) ;
  24.         }
  25.  
  26.  
  27.         class SampleGLRenderer implements Renderer
  28.         {
  29.                 private Live2DModelAndroid      live2DModel ;
  30.                 private final String MODEL_PATH = "haru/haru.moc" ;
  31.                 private final String TEXTURE_PATHS[] =
  32.                         {
  33.                                 "haru/haru.512/texture_00.png" ,
  34.                                 "haru/haru.512/texture_01.png" ,
  35.                                 "haru/haru.512/texture_02.png"
  36.                         } ;
  37.  
  38.                 @Override
  39.                 public void onDrawFrame(GL10 gl)
  40.                 {
  41.                         gl.glMatrixMode(GL10.GL_MODELVIEW ) ;
  42.                         gl.glLoadIdentity() ;
  43.                         gl.glClear( GL10.GL_COLOR_BUFFER_BIT ) ;
  44.                         gl.glEnable( GL10.GL_BLEND ) ;
  45.                         gl.glBlendFunc( GL10.GL_ONE , GL10.GL_ONE_MINUS_SRC_ALPHA ) ;
  46.                         gl.glDisable( GL10.GL_DEPTH_TEST ) ;
  47.                         gl.glDisable( GL10.GL_CULL_FACE ) ;
  48.  
  49.                         live2DModel.setGL( gl ) ;
  50.  
  51.                         live2DModel.update() ;
  52.                         live2DModel.draw() ;
  53.                 }
  54.  
  55.  
  56.                 @Override
  57.                 public void onSurfaceChanged(GL10 gl, int width, int height)
  58.                 {
  59.                         gl.glViewport( 0 , 0 , width , height ) ;
  60.  
  61.                         gl.glMatrixMode( GL10.GL_PROJECTION ) ;
  62.                         gl.glLoadIdentity() ;
  63.  
  64.                         float modelWidth = live2DModel.getCanvasWidth();
  65.                         float visibleWidth = modelWidth * (3.0f/4.0f);
  66.                         float margin = 0.5f * ( modelWidth/4.0f ) ;
  67.  
  68.                         gl.glOrthof(margin, margin+visibleWidth, visibleWidth*height/width, 0, 0.5f, -0.5f);
  69.                 }
  70.  
  71.  
  72.                 @Override
  73.                 public void onSurfaceCreated(GL10 gl, EGLConfig config)
  74.                 {
  75.                         try
  76.                         {
  77.                                 InputStream in = getContext().getAssets().open( MODEL_PATH ) ;
  78.                                 live2DModel = Live2DModelAndroid.loadModel( in ) ;
  79.                                 in.close() ;
  80.  
  81.                                 for (int i = 0 ; i < TEXTURE_PATHS.length ; i++ )
  82.                                 {
  83.                                         InputStream tin = getContext().getAssets().open( TEXTURE_PATHS[i] ) ;
  84.                                         int texNo = UtOpenGL.loadTexture(gl , tin , true ) ;
  85.                                         live2DModel.setTexture( i , texNo ) ;
  86.                                 }
  87.                         }
  88.                         catch (IOException e)
  89.                         {
  90.                                 e.printStackTrace();
  91.                         }
  92.                 }
  93.         }
  94. }





コメント