前言-

这是最后一个重要的类了——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. TensorFlow从1到2(五)图片内容识别和自然语言语义识别

    Keras内置的预定义模型 上一节我们讲过了完整的保存模型及其训练完成的参数. Keras中使用这种方式,预置了多个著名的成熟神经网络模型.当然,这实际是Keras的功劳,并不适合算在TensorFl ...

  2. django+mysql的使用

    Django中每一个模型model都对应于数据库中的一张表,每个模型中的字段都对应于数据库表的列.方便的是,django可以自动生成这些create table, alter table, drop ...

  3. 《k8s-1.13版本源码分析》-调度器初始化

    源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...

  4. 你需要知道的这几种 asp.net core 修改默认端口的方式

    一般情况下,aspnetcore发布后的默认端口是5000,这个大家都知道,而且默认骨架代码中没有看到任何让你输入的ip地址和端口号,但作为程序员的我们,不希望 被框架所管制,那如何实现默认端口的修改 ...

  5. if条件、while循环、for循环 相关练习

    1.实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败! while True: name = input('请输入用户名:') psw = inpu ...

  6. Dynamics 365 CE的插件/自定义工作流活动中调用Web API示例代码

    微软动态CRM专家罗勇 ,回复325或者20190428可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 现在Web API越来越流行,有时候为了程序更加健壮,需要在插件 ...

  7. 网络流 P3358 最长k可重区间集问题

    P3358 最长k可重区间集问题 题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k, ...

  8. node项目自动化部署--基于Jenkins,Docker,Github(1)安装Jenkins

    前言 每次项目代码更新后都要重新部署,如果只有一台服务器还好. 但是如果是分布式系统,动不动就很多台服务器,所以代码的自动部署就显得十分重要了. 这里用几篇文章来记录一下如何使用Jenkins,Doc ...

  9. shell读取文件内容并进行变量赋值

    需求: shell读取文件内容,然后把内容赋值给变量然后进行字符串处理 实现: dataline=$(cat /root/data/data.txt) echo $dataline

  10. 如何用人工的方式将Excel里的一堆数字变成一个数组

    目的是抛砖引玉,有谁可以教教我如何吧Excle的数据导入MyEclipse么? 如果只有⑨个字符的话我肯定是直接人工输入的,然而这次有65536行乘以3组,遭不住啊. 一.数组之间要有逗号在B列右键, ...