您的位置:首页 > 其它

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

2013-03-11 14:28 453 查看
转自:http://www.apkbus.com/android-59998-1-2.html

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

源码下载:


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

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

下载积分: 下载豆 -2

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

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

[align=left]java.lang.Object[/align]
[align=left]|com.badlogic.gdx.scenes.scene2d.Action[/align]

[align=left]Direct KnownSubclasses:[/align]
[align=left]AnimationAction, CompositeAction, Delay, Remove, TemporalAction[/align]

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

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

[align=left]AnimationAction, CompositeAction, Delay, Remove, TemporalAction[/align]

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

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



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

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

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

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

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



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

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



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

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



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

[align=left]即我们用如下语句得到一个新的MoveTo(或者其他Action)实例:[/align]

MoveTo move=MoveTo.$(100f, 100f,4f);

复制代码
[align=left]前两个参数表示要移动到的位置,第三个参数表示整个过程需要的时间,单位是秒。[/align]
[align=left][/align]
[align=left]那么我们怎么让一个Action起作用呢?[/align]

[align=left]首先我们要像上面那样取得一个Action的实例,这里以MoveTo实例为例。我们在外篇三的代码的基础上继续修改。首先在MyGame.java中添加一个MoveTo的引用:[/align]

MoveTo move;

复制代码
[align=left]其次,我们在show()函数中需要对这个move进行初始化,这里我们还可以添加一个OnActionCompleted()的监听器,在move结束的时候打印一句话,方便我们追踪。[/align]

move=MoveTo.$(100f, 100f,4f);

move.setCompletionListener(new OnActionCompleted(){

@Override

public void completed(Action arg0) {

// TODO Auto-generated method stub

System.out.println("MoveTo Complete!");

}

});

复制代码
[align=left]最后,我们需要将Action和Actor绑定,我们这里将这个动作Action绑定在开始按钮button上面:[/align]

button.action(move);

复制代码

[align=left]那我们怎么能让MoveTo这个Action执行呢?其实这并不需要我们去操心,在我们将actor加入舞台stage之后,我们在render()函数中绘制舞台:[/align]

stage.act(Gdx.graphics.getDeltaTime());

stage.draw();

复制代码
[align=left]系统就会自动调用Action的act()方法。[/align]

[align=left]我们运行来看看效果:[/align]



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

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

[align=left]AccelerateInterpolator[/align]

[align=left]AnticipateInterpolator[/align]

[align=left]DecelerateInterpolator[/align]

[align=left]LinearInterpolator[/align]

[align=left]OvershootInterpolator[/align]

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

[align=left]使用方法也很简单,给Action设置一个AccelerateDecelerateInterpolator,这里AccelerateDecelerateInterpolator的构造方法和我们前面获得Moveto实例的方法很类似。[/align]

move.setInterpolator(AccelerateDecelerateInterpolator.$());

复制代码
[align=left]看看效果:[/align]



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

[align=left]很显然后者有一个加速的过程。这样我们这个MoveTo的动作就算完成了。这一讲的内容非常浅显,后一讲我们将提到一个比较复杂的问题,然后在接下来的几讲中一步步教大家完成一个复杂的动画。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐