#Testin杯#Mkey libgdx游戏引擎教程(十)演员类的复杂动画(一)(附源码)

83
回复
902160
查看
  [复制链接]

30

主题

350

帖子

1089

安币

Android大神

Rank: 6Rank: 6

QQ达人

发表于 2012-7-19 16:46:39 | 显示全部楼层 |阅读模式
本帖最后由 耒佲請ぁ留埗 于 2012-8-3 11:39 编辑


新浪微博:http://weibo.com/u/1634658054


以下系列教程按讲课顺序排列,也是推荐阅读的顺序

第一讲:libgdx游戏引擎教程(一)性能优良的游戏引擎—libgdx http://www.apkbus.com/android-57355-1-1.html

第二讲: libgdx游戏引擎教程(二) ApplicationListener,着手第一个程序http://www.apkbus.com/android-57372-1-1.html

第三讲:libgdx游戏引擎教程()libgdx粒子系统的使用 http://www.apkbus.com/android-57456-1-1.html

外篇一:libgdx游戏引擎教程外篇(一)优美的自定义进度条(附源码) http://www.apkbus.com/android-57523-1-1.html

第四讲:libgdx游戏引擎教程(四) 游戏正式开始,资源异步加载(附源码)http://www.apkbus.com/android-57716-1-1.html

第五讲 libgdx游戏引擎教程(五)多游戏界面的实现(一)附源码 http://www.apkbus.com/android-57936-1-1.html

第六讲 libgdx游戏引擎教程(六)多游戏界面的实现(二)附源码 http://www.apkbus.com/android-57991-1-1.html  

第七讲 libgdx游戏引擎教程(七) 在libgdx中拦截Android按键事件 http://www.apkbus.com/android-58030-1-1.html  

外篇二: libgdx游戏引擎教程外篇(二)libgdx移植俄罗斯方块(附源码) http://www.apkbus.com/android-58102-1-1.html   

实战一:libgdx游戏引擎教程实战篇(一)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58404-1-1.html  

实战二:libgdx游戏引擎教程实战篇(二)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58408-1-1.html  

实战三:libgdx游戏引擎教程实战篇(三)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58414-1-1.html  

实战四:libgdx游戏引擎教程实战篇(四)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58418-1-1.html  

实战五:libgdx游戏引擎教程实战篇(五)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58419-1-1.html

实战六:libgdx游戏引擎教程实战篇(六)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58760-1-1.html

第八讲 libgdx游戏引擎教程(八) libgdx中的用户手势识别(一)附源码 http://www.apkbus.com/android-58933-1-1.html

第九讲 libgdx游戏引擎教程(九) libgdx中的用户手势识别(二)附源码 http://www.apkbus.com/android-59152-1-1.html

外篇三: libgdx游戏引擎教程外篇(三) 优美的自定义对话框(附源码) http://www.apkbus.com/android-59654-1-1.html  

第十讲:  libgdx游戏引擎教程(十)演员类的复杂动画(一)(附源码) http://www.apkbus.com/android-59998-1-2.html

第十一讲:libgdx游戏引擎教程(十一)演员类的复杂动画(二)(附源码) http://www.apkbus.com/android-60053-1-1.html

第十二讲:libgdx游戏引擎教程(十二)演员类的复杂动画(三)(附源码) http://www.apkbus.com/android-60194-1-1.html   

第十三讲: libgdx游戏引擎教程(十三)演员类的用户交互功能详解(附源码)  http://www.apkbus.com/android-60457-1-1.html

第十四讲:libgdx游戏引擎教程(十四)libgdx中常用的控件(附源码) http://www.apkbus.com/android-60569-1-1.html

最新更新 第十五讲 :libgdx游戏引擎教程(十五)在Libgdx中仿微信帮助滑动效果(附源码) http://www.apkbus.com/android-60822-1-1.html




今天是libgdx游戏引擎系列教程的第十讲,也是整个系列教程的第十九篇,今天我们来看看libgdx中的Actor的动作类,Action.

源码下载:


我们都知道,游戏中的动作和效果通常都赋予于游戏中的“主角”,游戏的主要交互都集中在这些对象上,而在我们的libgdx游戏中,很显然就是我们摆放在舞台上的演员类,也就是Actor。我们对于Actor上的效果,单单依靠动画播放显然是不够的,何况图片的增多带来的是美工的巨大压力,那么我们就要用别的办法增加我们演员类Actor的各种动作和效果。从第十讲开始,我们用几讲的篇幅介绍一下libgdx中的动作类Action,今天这个是简单的入门,内容比较浅显和简单。


Libgdx中提供了这样一个类,Action。我们从名字就可以看出,这是一个所谓的动作类。我们来看看官方文档中的介绍:


java.lang.Object
  |com.badlogic.gdx.scenes.scene2d.Action

Direct KnownSubclasses:
AnimationAction, CompositeAction, Delay, Remove, TemporalAction

public abstract class Actionextends java.lang.ObjectAn Action is used with an Actor andmodifes the Actor's attributes over time.


从上面一段话中我们可以看到Action是一个虚类,它用来“改变Actor的属性”,并且有
AnimationAction, CompositeAction, Delay, Remove, TemporalAction

这几个直接继承自Action,我们可以用他们来定义Actor的属性,也可以自己实现另一个Action.


我们来看看Action都有哪些方法,这样我们才能清楚这些Action的调用过程是怎么样的,这些方法有什么用,我们该怎么用这些方法。





act()方法,我们可以参照Stageact()方法来理解,就像我们每一次在Screen或者ApplicationListener中的render()函数中绘制stage的时候都要调用Stageact()方法以外,我们在让Action执行之前也需要调用Actionact()方法。但事实上,这个方法不需要我们认为调用,我们在绘制这个Action绑定的Actor的时候系统其实就自动调用了Actionact()方法。


callActionCompletedListener()getCompletionListener()setCompletionListener()都和一个名为OnActionCompleted的监听接口有关,我们从名字可以看出,这个接口有一些回调函数,会在Action结束的时候自动调用其中的方法,而我们也可以在其中做出一些相应的处理。


剩下的几个方法也很好理解,比如getTarget()setTarget()这一对方法,就是设置这个Action需要在哪个Actor上执行或者获取之前在这个Action上设置好的Actor对象。不过其中有一点需要我们注意,setTarget()方法是不需要我们调用的,我们在使用Actor.action(Action action)方法将该Actor和某个Action绑定的时候,系统自动调用了actionsetTarget方法,并传入了这个Actor
我们来看看Action的具体实现,就看AnimationAction吧


我们在官方文档中查询,发现AnimationAction也是一个虚类,它有众多的子类,分别对应于不同的动画效果,画红线的部分是AnimationAction的子类,从它们的名字我就可以大概看出他们的作用了:





我们接下来就用其中的MovTo类来给大家演示一下Action的用法,其他的AnimationActor的使用方法也非常类似。
首先,我们该怎么得到一个MoveTo的对象呢?我们可以看看MoveTo的构造函数:




这很显然是从Object中继承来的构造函数,没有任何的作用。我们又可以看到,MoveTo中没有提供任何设置MoveTo对象参数的方法,那我们该如何得到一个有效的MoveTo对象呢?
包括MoveTo对象在内的众多Action都不能直接通过构造来得到一个新的对象,而是通过一个类似于下面方法的一个静态方法得到这个Action的一个实例:



即我们用如下语句得到一个新的MoveTo(或者其他Action)实例:
  1. MoveTo move=MoveTo.$(100f, 100f,4f);
复制代码
前两个参数表示要移动到的位置,第三个参数表示整个过程需要的时间,单位是秒。
那么我们怎么让一个Action起作用呢?

首先我们要像上面那样取得一个Action的实例,这里以MoveTo实例为例。我们在外篇三的代码的基础上继续修改。首先在MyGame.java中添加一个MoveTo的引用:
  1. MoveTo move;
复制代码
其次,我们在show()函数中需要对这个move进行初始化,这里我们还可以添加一个OnActionCompleted()的监听器,在move结束的时候打印一句话,方便我们追踪。
  1. move=MoveTo.$(100f, 100f,4f);
  2.                         move.setCompletionListener(new OnActionCompleted(){

  3.                                 @Override
  4.                                 public void completed(Action arg0) {
  5.                                         // TODO Auto-generated method stub
  6.                                         System.out.println("MoveTo Complete!");
  7.                                 }
  8.                                 
  9.                         });
复制代码
最后,我们需要将Action和Actor绑定,我们这里将这个动作Action绑定在开始按钮button上面:
  1. button.action(move);
复制代码

那我们怎么能让MoveTo这个Action执行呢?其实这并不需要我们去操心,在我们将actor加入舞台stage之后,我们在render()函数中绘制舞台:
  1. stage.act(Gdx.graphics.getDeltaTime());
  2. stage.draw();
复制代码
系统就会自动调用Action的act()方法。

我们运行来看看效果:




我们还可以用libgdx中的另外一个类Interpolator来改变libgdx中动画的变化的速率,关于这个类大家可以看看官方文档,Interpolator有以下几种:
AccelerateDecelerateInterpolator

AccelerateInterpolator

AnticipateInterpolator

DecelerateInterpolator

LinearInterpolator

OvershootInterpolator

具体每一种的作用和用法我这里就不一一介绍,我们这里使用AccelerateInterpolator,这是一个加速的Interpolator,简单的说就是让动画的变化速度越来越快,相当于变化速率一次的导数不为零,有一个加速度。


使用方法也很简单,给Action设置一个AccelerateDecelerateInterpolator,这里AccelerateDecelerateInterpolator的构造方法和我们前面获得Moveto实例的方法很类似。
  1. move.setInterpolator(AccelerateDecelerateInterpolator.$());
复制代码
看看效果:





很显然后者有一个加速的过程。这样我们这个MoveTo的动作就算完成了。这一讲的内容非常浅显,后一讲我们将提到一个比较复杂的问题,然后在接下来的几讲中一步步教大家完成一个复杂的动画。


Testin ID:ilovemkey@gmail.com 总的而言这个平台真的非常好用!我正是用这个平台发现了现在写的这个应用的一些内存管理方面的问题。另外建议能够在测试报告中看到某一台机型在整个执行过程中的cpu和内存占用的变化情况,这样可以更快地锁定问题。感谢Itestin让测试变得轻松了太多太多!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
君见一叶舟,出没风波里

0

主题

9

帖子

3

安币

初级码农

Rank: 1

QQ达人

发表于 2012-7-19 16:50:44 | 显示全部楼层
{:Music 2:}{:Hello:}{:Pin:}

0

主题

9

帖子

3

安币

初级码农

Rank: 1

QQ达人

发表于 2012-7-19 16:51:02 | 显示全部楼层
{:Cupcake:}{:Surprised:}{:Pin:}

6

主题

20

帖子

27

安币

程序猿

Rank: 2

QQ达人

发表于 2012-7-19 16:53:24 | 显示全部楼层
{:Skateboard:}{:Skateboard:}{:Skateboard:}

0

主题

46

帖子

171

安币

程序猿

Rank: 2

发表于 2012-7-20 09:58:29 | 显示全部楼层
哦哦,来新文章了

0

主题

59

帖子

120

安币

程序猿

Rank: 2

发表于 2012-7-20 11:04:03 | 显示全部楼层
{:Big Chin:}

0

主题

21

帖子

47

安币

初级码农

Rank: 1

发表于 2012-7-20 13:58:19 | 显示全部楼层
good teacher

1

主题

146

帖子

872

安币

代码手工艺人

Rank: 4

QQ达人

发表于 2012-7-20 15:15:39 | 显示全部楼层
好太好了好太好了好太好了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )