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

转自:http://www.apkbus.com/android-59998-1-2.html

 

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


源码下载:
edu.nju.wsj.libgdx.rar(3.78 MB, 下载次数: 180)

2012-7-19 16:45 上传
点击文件名下载附件
下载积分: 下载豆 -2



我们都知道,游戏中的动作和效果通常都赋予于游戏中的“主角”,游戏的主要交互都集中在这些对象上,而在我们的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 classActionextends 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的调用过程是怎么样的,这些方法有什么用,我们该怎么用这些方法。


1.PNG

2012-7-19 16:23 上传
下载附件(44.32 KB)




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的子类,从它们的名字我就可以大概看出他们的作用了:



2.PNG

2012-7-19 16:23 上传
下载附件(33.91 KB)




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


3.PNG

2012-7-19 16:23 上传
下载附件(21.7 KB)




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


4.PNG

2012-7-19 16:23 上传
下载附件(2.59 KB)



即我们用如下语句得到一个新的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. });
复制代码
最后,我们需要将Action和Actor绑定,我们这里将这个动作Action绑定在开始按钮button上面:
  1. button.action(move);
复制代码


 

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


 

我们运行来看看效果:


4.gif

2012-7-19 16:23 上传
下载附件(14.97 KB)




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


 

AccelerateInterpolator


 

AnticipateInterpolator


 

DecelerateInterpolator


 

LinearInterpolator


 

OvershootInterpolator


 

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



 

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


 

5.gif
2012-7-19 16:23 上传
下载附件(13.56 KB)





 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值