LibGDX_4.9: 动画(Animation)

本文链接: http://blog.csdn.net/xietansheng/article/details/50187539

LibGDX 基础教程(总目录)

1. 概述

这里所说的动画是 2D 动画(com.badlogic.gdx.graphics.g2d.Animation),2D 动画由多个静态图片组成,将静态图片一张一张播放便成了动画。一个 Animation 对象存储了一个纹理区域(静态图片)列表代表动画序列。一个 Animation 对象中的每一个纹理区域被称为一个关键帧,多个关键帧组成了动画。

2. 代码示例

该示例中需要用到的图片如下(保存到本地,重命名为指定名称,放到 assets 资源文件夹中)。

文件名:animation_sheet.png (256*256):

animation_sheet.png

游戏主程序的启动入口类:

package com.libgdx.test;
		
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
	
/**
 * 游戏主程序的启动入口类
 */
public class MainGame extends ApplicationAdapter {
	
	private SpriteBatch batch;
	
	private Texture walkSheetTexture;
	
	// 行走动画
	private Animation walkAnimation;
	
	private TextureRegion currentFrame;
	
	// 状态时间, 渲染时间步 delta 的累加值
	private float stateTime;
	
	@Override
	public void create() {
		// 创建 Batch
		batch = new SpriteBatch();
		
		// 创建纹理, animation_sheet.png 图片的宽高为 256 * 256, 由 5 行 6列 个不同状态的小人单元格组成
		walkSheetTexture = new Texture(Gdx.files.internal("animation_sheet.png"));
		
		int frameRows = 5;	// 小人单元格的行数
		int frameCols = 6;	// 小人单元格的列数
		
		int perCellWidth = walkSheetTexture.getWidth() / frameCols;		// 计算每一个小人单元格的宽度
		int perCellHeight = walkSheetTexture.getHeight() / frameRows;	// 计算每一个小人单元格的高度
		
		// 按照指定的宽高作为一个单元格分割大图纹理, 分割后的结果为一个 5 * 6 的纹理区域二维数组, 数组中的元素是分割出来的小人单元格
		TextureRegion[][] cellRegions = TextureRegion.split(walkSheetTexture, perCellWidth, perCellHeight);
		
		// 把二维数组变为一维数组, 因为 Animation 只能接收一维数组作为关键帧序列, 数组中的一个元素(小人单元格的纹理区域)表示一个关键帧
		TextureRegion[] walkFrames = new TextureRegion[frameRows * frameCols];
		int index = 0;
		for (int row = 0; row < frameRows; row++) {
			for (int col = 0; col < frameCols; col++) {
				walkFrames[index++] = cellRegions[row][col];
			}
		}
		
		// 使用关键帧(纹理区域)数组 walkFrames 创建一个动画实例, 每一帧(一个小人单元格/纹理区域)播放 0.05 秒
		walkAnimation = new Animation(0.05F, walkFrames);
		
		/*
		 * 设置播放模式:
		 * 
		 * Animation.PlayMode.NORMAL: 正常播放一次(默认)
		 * Animation.PlayMode.REVERSED: 倒序播放一次
		 * 
		 * Animation.PlayMode.LOOP: 正常循环播放
		 * Animation.PlayMode.LOOP_REVERSED: 倒序循环播放
		 * 
		 * Animation.PlayMode.LOOP_RANDOM: 随机循环播放
		 * Animation.PlayMode.LOOP_PINGPONG: 开关式(先正序再倒序)循环播放
		 */
		walkAnimation.setPlayMode(Animation.PlayMode.LOOP);
	}
	
	@Override
	public void render() {
		// 黑色清屏
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        
        // 累加时间步(stateTime 也可表示游戏的运行时间)
        stateTime += Gdx.graphics.getDeltaTime();
        
        // 根据当前 播放模式 获取当前关键帧, 就是在 stateTime 这个时刻应该播放哪一帧
        currentFrame = walkAnimation.getKeyFrame(stateTime);

        batch.begin();
        
        // 绘制当前关键帧
        batch.draw(currentFrame, 50, 100);
        
        batch.end();
	}
	
	@Override
	public void dispose() {
		// 释放资源
		if (walkSheetTexture != null) {
			walkSheetTexture.dispose();
		}
		if (batch != null) {
			batch.dispose();
		}
	}

}

展示动画较麻烦,自行运行代码查看效果。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢TS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值