开源java游戏框架libgdx专题-09-动画的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源java游戏框架libgdx专题-09-动画的使用相关的知识,希望对你有一定的参考价值。

1.Animation类介绍
 
Api定义:动画是由多个帧,在设定的时间间隔序列显示。比如,一个跑步的人一个动画可以通过运行时播放这些图像无限拍照他了。
功能用法:管理动画,设置随即播放模式和播放顺序。
使用方法: walkAnimation = new Animation(float fDuration, keyFrames)
第一个参数是播放每一帧的时间,后面是一个TestureRegion。下面我给大家介绍下,Animation的原理,下图显示了一个完整的运行一个周期。它被称为精灵表。每个矩形是一个精灵,它被称为一个框架。先创建运行动画,在精灵要绘制后,随着时间的推移,绘制另一个矩形内的图片。
一般动画都是用一张图片,然后配合TextureRegion来实现的。下面我们官方的动画来做演示
技术分享
 
 
技术分享
 
 
技术分享技术分享
技术分享
 
2.代码解读
(1)TextureRegion[][]数组
代码:TextureRegion[][] tmp = TextureRegion.split(walkSheet, walkSheet.getWidth() / FRAME_COLS, walkSheet.getHeight() /FRAME_ROWS);
 
这个段代码是怎么回事呢?他是采用分离式的方法分分割传入的纹理,将获得的纹理分为一个二维数组。记住,前提是分割的矩形大小相等。然后使用临时变量,填充walkframes数组。这是样使用起来很方便。
 
(2) SetPlayMode()方法
它是Animation类自己封装的一个方法,是用来设置播放模式的,其中它提供的模式有6种:NORMAL、REVERSED、LOOP、LOOP_REVERSED、LOOP_PINGPONG、LOOP_RANDOM、。
NORMAL:这个不用说了,就是正常的播放模式。
REVERSED:反向播放,从后向前播放,这个就像人物倒退的跑。
LOOP:持续播放,这个比较常用。
LOOP_REVERSED:持续倒退播放。
LOOP_PINGPONG: 向前播放几张图片,再向后播放几帧图片。
 
(3) StateTime 使用
代码stateTime += Gdx.graphics.getDeltaTime(),他是一个获取一个状态下所持续的一个时间。就像我们在现实世界使用的时间一样,一般配合系统时间使用Gdx.graphics.getDeltaTime():获取系统渲染时间,一般默认是0.173秒。
3.详细实现
 1 package com.mygdx.animation;
 2 
 3 import com.badlogic.gdx.ApplicationListener;
 4 import com.badlogic.gdx.Gdx;
 5 import com.badlogic.gdx.graphics.GL20;
 6 import com.badlogic.gdx.graphics.Texture;
 7 import com.badlogic.gdx.graphics.g2d.Animation;
 8 import com.badlogic.gdx.graphics.g2d.Animation.PlayMode;
 9 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
10 import com.badlogic.gdx.graphics.g2d.TextureRegion;
11 /**
12  * 测试使用动画
13  * @author Jack(乐智)
14  * @blog dtblog.cn
15  * @qq 984137183
16  */
17 public class UseAnimation implements ApplicationListener {
18     //
19     private static final int FRAME_COLS=6;
20     //
21     private static final int     FRAME_ROWS=5;
22     
23     //动画类
24     Animation walkAnimation;
25     //纹理
26     Texture walkSheet;
27     TextureRegion[] walkFrames;
28     SpriteBatch batch;
29     TextureRegion currentFrame;
30     
31     float stateTime;
32     
33     @Override
34     public void create() {
35         //纹理
36         walkSheet = new Texture(Gdx.files.internal("animation_sheet.png"));
37         //将纹理分割成2维数组的坐标
38         TextureRegion[][] tmp=TextureRegion.split(walkSheet, walkSheet.getWidth()/FRAME_COLS, walkSheet.getHeight()/FRAME_ROWS);
39         walkFrames=new TextureRegion[FRAME_COLS*FRAME_ROWS];//存储所有的图片的数组
40         int index=0;
41         for (int i = 0; i < FRAME_ROWS; i++) {
42             for (int j = 0; j < FRAME_COLS; j++) {
43                 walkFrames[index++]=tmp[i][j];//将图片放到数组中
44             }
45         }
46         walkAnimation=new Animation(0.025f,walkFrames);//使用动画类播放数组中的图片
47         walkAnimation.setPlayMode(PlayMode.LOOP_PINGPONG);//设置播放模式,
48         batch=new SpriteBatch();
49         stateTime=0f;
50     }
51 
52     @Override
53     public void resize(int width, int height) {
54         
55     }
56 
57     @Override
58     public void render() {
59         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
60         stateTime+=Gdx.graphics.getDeltaTime();//渲染时间
61         currentFrame=walkAnimation.getKeyFrame(stateTime,true);
62         batch.begin();
63         batch.draw(currentFrame,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);
64         batch.end();
65     }
66 
67     @Override
68     public void pause() {
69         // TODO Auto-generated method stub
70 
71     }
72 
73     @Override
74     public void resume() {
75 
76     }
77 
78     @Override
79     public void dispose() {
80         // TODO Auto-generated method stub
81 
82     }
83 
84 }

原文由博主 乐智 编辑撰写,版权归博主所有。

原文地址 http://www.dtblog.cn/1143.html 转载请注明出处!

以上是关于开源java游戏框架libgdx专题-09-动画的使用的主要内容,如果未能解决你的问题,请参考以下文章

开源java游戏框架libgdx专题-08-中文显示与绘制

开源java游戏框架libgdx专题-06-使用libgdx自带的日志方法

开源java游戏框架libgdx专题-11-核心库-演员类

开源java游戏框架libgdx专题-10-核心库-Viewport

开源java游戏框架libgdx专题-07-文件处理

开源java游戏框架libgdx专题-03-项目开发与调试