前言-

这是最后一个重要的类了——LAppLive2DManager,流程什么的也清晰了,话不多说我们来康康吧!

LAppLive2DManager-

public class LAppLive2DManager{
public void releaseModel(){}
public void update(GL10 gl){ }
public LAppModel getModel(int no){}
public int getModelNum(){}
public LAppView createView(Activity act){}
public void onSurfaceChanged(GL10 gl, int width, int height){}
public void changeModel(){}
public boolean tapEvent(float x,float y){} public void flickEvent(float x,float y){} public void shakeEvent(){} public void setDrag(float x,float y){}
public L2DViewMatrix getViewMatrix(){}
}

结构

model切换-

public void releaseModel(){
for(int i=0;i<models.size();i++){
models.get(i).release();
} models.clear();
} public void update(GL10 gl){
view.update();
if(reloadFlg){ reloadFlg=false; int no = modelCount % 4; try {
switch (no) {
case 0:
releaseModel(); models.add(new LAppModel());
models.get(0).load(gl, LAppDefine.MODEL_HARU);
models.get(0).feedIn();
break;
case 1:
releaseModel(); models.add(new LAppModel());
models.get(0).load(gl, LAppDefine.MODEL_SHIZUKU);
models.get(0).feedIn();
break;
case 2:
releaseModel(); models.add(new LAppModel());
models.get(0).load(gl, LAppDefine.MODEL_WANKO);
models.get(0).feedIn();
break;
case 3:
releaseModel(); models.add(new LAppModel());
models.get(0).load(gl, LAppDefine.MODEL_HARU_A);
models.get(0).feedIn(); models.add(new LAppModel());
models.get(1).load(gl, LAppDefine.MODEL_HARU_B);
models.get(1).feedIn();
break;
default: break;
}
} catch (Exception e) { Log.e(TAG,"Failed to load."+e.getStackTrace());
SampleApplication.exit();
}
}
}

每次点击左下角按钮以后,每次都会先releaseModel()一下然后再add新的model,如果需要load更多的model,就像最后一个那样就好了。

触摸事件-

public boolean tapEvent(float x,float y)
{
if(LAppDefine.DEBUG_LOG)Log.d(TAG, "tapEvent view x:"+x+" y:"+y); for (int i=0; i<models.size(); i++)
{
if(models.get(i).hitTest( LAppDefine.HIT_AREA_HEAD,x, y ))
{ if(LAppDefine.DEBUG_LOG)Log.d(TAG, "Tap face.");
models.get(i).setRandomExpression();
}
else if(models.get(i).hitTest( LAppDefine.HIT_AREA_BODY,x, y))
{
if(LAppDefine.DEBUG_LOG)Log.d(TAG, "Tap body.");
models.get(i).startRandomMotion(LAppDefine.MOTION_GROUP_TAP_BODY, LAppDefine.PRIORITY_NORMAL );
}
}
return true;
}
tapEvent()里实现了脸部和身体的触摸的功能
脸部触摸后调用setRandomExpression而身体触摸以后调用startRandomMotion

轻触和震动事件-

//轻触事件
public void flickEvent(float x,float y)
{
if(LAppDefine.DEBUG_LOG)Log.d(TAG, "flick x:"+x+" y:"+y); for (int i=0; i<models.size(); i++)
{
if(models.get(i).hitTest( LAppDefine.HIT_AREA_HEAD, x, y ))
{
if(LAppDefine.DEBUG_LOG)Log.d(TAG, "Flick head.");
models.get(i).startRandomMotion(LAppDefine.MOTION_GROUP_FLICK_HEAD, LAppDefine.PRIORITY_NORMAL );
}
}
} //震动事件
public void shakeEvent()
{
if(LAppDefine.DEBUG_LOG)Log.d(TAG, "Shake event."); for (int i=0; i<models.size(); i++)
{
models.get(i).startRandomMotion(LAppDefine.MOTION_GROUP_SHAKE,LAppDefine.PRIORITY_FORCE );
}
}

至此项目的大概已经明白了,剩下的就是转换成自己的东西了

【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(4)!的更多相关文章

  1. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(1)!

    前言- 上几篇文章,我们一个一个的研究了Cubism官方提供的Android使用Live2D的简单例子,但是依旧和大家平时见到的还是有很大差距的.在研究了代码差不多一周以后,我决定还是用文字的形式记录 ...

  2. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(2)!

    前言- 明确了项目目录的结构,但是结构什么的也太"抽象"了. 本篇开始上代码! 模型的绘制- 前几天的学习中,live2d的绘制有了一些了解了,在Android端使用OpenGL ...

  3. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(3)!

    ---恢复内容开始--- 前言- 虽然上文说的是model的绘制但是这个说法并不严谨,之前的几个例子都会有模型文件的读入和载入,可是在LAppRenderer.LAppView中并没有.moc等文件的 ...

  4. Android源码学习之装饰模式应用

    首先得了解最基础的装饰器模式 参考 设计模式之八 --- 装饰模式(Decorator) 参考链接:http://blog.csdn.net/cjjky/article/details/7478788 ...

  5. Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习

    package cc.aa; import android.os.Environment; import android.view.MotionEvent; import android.view.V ...

  6. [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...

  7. Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

    Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...

  8. Android源码-学习随笔

    在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...

  9. Android源码学习之模板方法模式应用

    一.模板方法模式定义 模板方法模式定义: defines the skeleton of an algorithm in a method, deferring some steps to subcl ...

随机推荐

  1. 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理

    这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...

  2. 从一个git仓库拷贝到另一个git仓库

    利用git从一个仓库拷贝一个项目到另一个仓库,并且log也能够一起过去. 1.从原地址克隆一份裸版本库,比如原本托管于 GitHub. git clone --bare http://github.. ...

  3. postgresql 使用pg_restore时显示role "root" does not exist的解决办法

    在docker里恢复bakcup格式的数据库,结果提示role "root" does not exist 解决方法: 切换用户: su - postgres 然后再次运行命令: ...

  4. linux open write lseek的API和应用

    1, open #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(c ...

  5. JS Bootstrap-DateRangePicker 如何设置默认值为空

    DateRangePicker是一款时间范围选择器,界面良好,非常适合短时间范围选择的插件,具体源码可以在http://www.daterangepicker.com/找到 ,但是目前使用中,感觉功能 ...

  6. ZJOI2019一轮游记

    Preface 期待已久的省选终于开始了233,关于之前的一些内容,在ZJOI2019一轮停课刷题记录都可以找到,这里不再赘述 ZJOI2019,Bless All Day -1 今天难得有休息,昨晚 ...

  7. 吴恩达机器学习笔记60-大规模机器学习(Large Scale Machine Learning)

    一.随机梯度下降算法 之前了解的梯度下降是指批量梯度下降:如果我们一定需要一个大规模的训练集,我们可以尝试使用随机梯度下降法(SGD)来代替批量梯度下降法. 在随机梯度下降法中,我们定义代价函数为一个 ...

  8. 超级简单!把文档转换成网页格式(Core)

    因为需要把好多的文档放在服务器上访问,最开始是使用第3方网站www.aconvert.com,这个其实也挺方便的, 最后由于一些需求原因,最终只有依靠代码来进行,以下是简化后的代码 创建一个控制台应用 ...

  9. 浏览器F12 waterfall性能检测详解详解

    Queueing 是排队的意思 Stalled 是阻塞  请求访问该URL的主机是有并发和连接数限制的,必须要等之前的执行才能执行之后的,这段时间的耗时 DNS Lookup 是指域名解析所耗时间 I ...

  10. Java成神之路技术整理(长期更新)

    以下是Java技术栈微信公众号发布的关于 Java 的技术干货,从以下几个方面汇总. Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 ...