Libgdx播放Spine动画(1)-基础



博客已迁移:更多技术文章请前往AyoCrazy.com—Libgdx播放Spine动画(1)




Spine作为2D骨骼动画编辑器中的佼佼者,其高效简洁的操作流程,强大并且实用的各种功能,受到越来越多的动画设计师的青睐。Spine的作者本人也是libgdx的联合作者,其中也大量的用到了libgdx的相关内容,所以spine和libgdx也算是近亲关系。本文就来讲一讲在libgdx中如何播放Spine动画,以及在使用spine动画过程中遇到的各种坑。

原理

在写具体的代码之前,我想把spine动画文件进行一个简单的讲解,这对于理解spine动画的运行流程有极大的帮助,既方便排除一些坑,而且在以后的复杂项目中,要实现一些特殊功能也可以很容易地对运行库进行改写。

spine文件结构

spine的导出文件一般有三个,后缀名分别为”.atlas”,”.png”,”.json”。前面两个是纹理集合,后面一个就是对骨骼动画的描述文件,以json形式。最关键的就是要了解这个json文件的内容,我们可以打开一个spine的json文件看一看。将会看到json文件通常是这样的形式:

  • “skeleton”:{ 哈希值,版本,宽高、纹理路径 }
  • “bones”:{ 关节名称、父级、长度、xy、旋转 }
  • “slots”:{ 插槽名称、关节、附件 }
  • “skins”:{ 皮肤 }
    • ”皮肤名程”
      • ”对应插槽”
        • ”对应附件”:{ 附件名称、路径、坐标、缩放、选装、宽高 }
  • “animations”:{ 动画 }
    • ”动画名称”
      • ”控制”
        • … (这里不再详细叙述,控制的部件不同,中间层级也不尽相同)
          • ”关键帧”:{ 时间、参数 }

大概就是这个样子,其中一些关键名词这里做出一些解释:

skeleton:骨骼。指的是整套骨骼,不是某一个关节。
bones:关节。骨骼中的一些关节节点,有层级关系。
slots:插槽。附着在关节上的,用于在关节上添加附件。
attachment:附件。例如为某个关节贴上图片,这个贴图就是一个附件。附件必须添加到插槽上,并且一个插槽只能同时拥有一个附件。附件种类不止贴图一种。
skin:皮肤。定义了每个插槽附件的实现,例如贴图附件,皮肤中会为该附件指定其对应纹理集合中的纹理区域,以及该纹理的其它参数。而插槽中的附件只定义了一个名字,具体的实现是在皮肤中定义的。
animation:动画。定义了骨骼中每个部件的动画形式和关键帧。

spine加载过程

1. 首先获取纹理集合,即拿到TextureAtlas;
2. 读取json文件,获取文件中包含的全部信息;
3. 用json信息中的骨骼部分(包含关节、插槽、附件、皮肤)初始化一个骨骼出来,仅仅是骨骼并不包含动画;
4. 用json信息中的动画部分初始化出一个动画控制器,并为每个动画创建一个时间轴;
5. 播放动画的时候,通过时间轴信息去控制每一帧骨骼的位移、旋转、缩放、颜色、形变等来达到动画效果。
6. 也可以直接控制骨骼,通过代码来做出一些特殊效果。

Spine运行库

了解了基本原理之后,就可以下载官方的libgdx-spine运行库,集成到libgdx中了。
到github上将运行库源码拷下来,放到工程中,或者自己打包成jar包。
https://github.com/EsotericSoftware/spine-runtimes
导入运行库之后就可以开始在项目中播放spine动画了,此处作个简单演示。

首先,创建libgdx工程,将spine官方示例中goblins文件导入到assets文件夹下。
共三个文件,必须放在相同路径下。如下:

接下来就可以写代码了,在主类中:

    private SkeletonMeshRenderer render;
    private SkeletonData sData;
    private AnimationState state;
    private Skeleton skeleton;
    private PolygonSpriteBatch polygonBatch;

    @Override
    public void create() {
        render = new SkeletonMeshRenderer();
        // 获取纹理集合
        TextureAtlas tAtlas = new TextureAtlas(Gdx.files.internal("goblins.atlas"));
        // 读取json信息
        SkeletonJson sJson = new SkeletonJson(tAtlas);
        sJson.setScale(1f);// 缩放,以后不可更改
        sData = sJson.readSkeletonData(Gdx.files.internal("goblins.json"));
        // 初始化动画信息
        AnimationStateData animData = new AnimationStateData(sData);
        state = new AnimationState(animData);
        // 初始化骨骼信息
        skeleton = new Skeleton(sData);
        // 初始化batch
        polygonBatch = new PolygonSpriteBatch();
        // 播放动画
        state.setAnimation(0, "walk", true);
        // 设置位置
        skeleton.setPosition(500, 200);
    }

    @Override
    public void render() {
        // 清屏
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        // 动画控制器更新时间步
        state.update(Gdx.graphics.getDeltaTime());
        // 动画控制器控制骨骼动画
        state.apply(skeleton);
        // 骨骼逐级进行矩阵变换
        skeleton.updateWorldTransform();
        // 绘制
        polygonBatch.begin();
        render.draw(polygonBatch, skeleton);
        polygonBatch.end();
    }

运行如下图:

博客已迁移:查看全文请点击AyoCrazy.com—Libgdx播放Spine动画(1)

时间: 2024-10-23 21:50:53

Libgdx播放Spine动画(1)-基础的相关文章

Libgdx播放Spine动画(2)-功能

博客已迁移:请前往 AyoCrazy.com-Libgdx播放Spine动画(2) 查看完整版 在上一篇博客<Libgdx播放Spine动画(1)-基础>中,写了关于Libgdx播放Spine动画的基本方法,也作了一个简单的示例.但在实际项目中,仅仅会这些还是远远不够,我们必须掌握Spine的一些高级功能,这样才能充分发挥Spine的特长,为我们的项目增添色彩.Spine的高级特性很多,但大多都是提供给动画设计师用的,程序这边只负责调用就行.这篇主要针对程序可以控制的内容,例如混合动画.无缝切

Android播放gif动画,增加屏幕掉金币效果

前言:播放gif的版本有很多,我这边使用Android自带的Movie类播放gif动画,也是在别人的基础上进行修改.有同样需求的朋友可以参考我的demo. 1.效果图如下:    2.部分主要代码 MainActivity.java  给封装的GifView设置背景gif图片资源, 绘制金币,同时开启金币屏幕掉下来的效果,监听gif播放完毕动画,结束掉金币的动画   public class MainActivity extends Activity implements OnClickList

Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现

Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还是要追究一下原理怎么做的,我们新建一个GifLibrary,然后右键Properties--Android,我们把架包勾上 然后我们新建一个类GifSurfaceView继承自SurfaceView并且实现它的Callback接口 GifSurfaceView package com.lgl.gif

PhotoShop制作图片循环滚动播放GIF动画教程

介绍PhotoShop制作屏幕上的图片循环滚动播放GIF动画效果,需要制作的图片要同样尺寸,不同尺寸的要调成同样大小,具体制作方法看教程, 喜欢的同学可以一起来学习一下! 最终效果图: 分类: PS入门教程

PS制作显示器播放效果动画图片

教程教飞特的朋友们用PS制作显示器播放效果动画图片,教程制作难度中等偏上,主要还是介绍PS制作动画的具体流程,这里介绍的是帧动画,对PS8.0以上的版本都适用,好了,先来看看最终的效果图吧: 效果图:   具体的制作过程如下: 效果图:   分类: PS入门教程

opengl-按键控制模型播放特定动画(OpenGL)

问题描述 按键控制模型播放特定动画(OpenGL) 导入了一个MD2模型文件,想实现按特定的键播放特定的动画的功能,比如,按"A"播放动画1,按"S"播放动画2.要怎么写代码?

Android实现可播放GIF动画的ImageView_Android

Android的原生控件并不支持播放GIF格式的图片.我们都知道,在Android中如果想要显示一张图片,可以借助ImageView来完成,但是如果将一张GIF图片设置到ImageView里,它只会显示这张图片的第一帧,不会产生任何的动画效果.今天我们来编写一个自定义的增强型ImageView(继承ImageView),可以播放GIF格式的图片,暂且叫做GifImageView吧. 1.自定义属性 <?xml version="1.0" encoding="utf-8&

缓动函数requestAnimationFrame 更好的实现浏览器经动画_基础知识

写缓动函数用到requestAnimationFrame函数,之前了解过一些,但总觉得又不是很了解,所以翻译一篇老外的文章,以便学习分享. requestAnimationFrame是什么? 以前我们做动画需要一个定时器,每间隔多少毫秒就做出一些改变.现在有个好消息:浏览器厂商已经决定提供一个专门做动画的方法,即requestAnimationFrame(),而且基于浏览器的层面也能更好的进行优化.但是呢,这只是一个做动画的基础API,即不基于DOM元素的style变化,也不基于canvas,或

Android中播放Gif动画取巧的办法_Android

由于做的项目,要有个动画的等待效果,第一时间想到的就是Gif(懒,省事),但是试了好多据说能播放Gif的控件,也写过,但是放到魅族手机上就是不能播放,所有就想了个招,既然Gif能在浏览器上播放,那android 的 WebView 也能播放,写了个Demo,果然能播放. 1.将gif的文件放到android的资源文件夹里面 2.写个html,将android的gif源放到WebView里面去加载 <RelativeLayout xmlns:android="http://schemas.a