LibGDX - 缩放动画

时间:2015-01-25 17:53:27

标签: java animation libgdx sprite scaling

另一天,另一个问题。

我正在尝试从TextureRegions制作动画,但我需要按一些值进行缩放。我对缩放静止图像(由纹理区域制作的精灵)没有任何问题,但是,我不知道为什么,它不适用于动画帧。

对于静止图像,我会做类似的事情:

    darknessActive = new Sprite(AssetLoaderUI.darknessActive);
    darknessActive.setPosition(50, 20);
    darknessActive.setScale(scaler);

然后我在渲染器中渲染它就好了。

通过动画,我尝试做这样的事情:

    Frame1 = new TextureRegion(texture, 764, 75, 141, -74);
    Frame2 = new TextureRegion(texture, 907, 75, 133, -75);

    Frame1S = new Sprite(Frame1);
    Frame1S.setScale(scaler);
    Frame2S = new Sprite(Frame2);
    Frame2S.setScale(scaler);

    Sprite[] Frames = { Frame1S, Frame2S };

    myAnimation = new Animation(0.06f, Frames);
    myAnimation.setPlayMode(Animation.PlayMode.LOOP);

但是图像仍处于原始大小,“缩放器”没有任何区别。

1 个答案:

答案 0 :(得分:3)

2018编辑:在较新版本的LibGDX中,Animation类不仅限于TextureRegions。它可以为任何通用的对象数组制作动画,因此您可以创建Animation<Sprite>,尽管每次获得关键帧精灵时都需要确保应用了适当的比例。就个人而言,我认为应该避免Sprite类,因为它将资源(图像)与游戏状态混为一谈。


你没有说你是如何绘制动画的,但可能你使用的是一种不知道精灵比例的方法。

由于Animation类存储了TextureRegions,如果你从动画中得到一个框架来绘制如下:

spriteBatch.draw(animation.getKeyFrame(time), x, y);

然后精灵批处理不知道它是Sprite的一个实例,只是它是TextureRegion的一个实例,它不包括缩放信息。

快速而肮脏的方法就是这样:

Sprite sprite = (Sprite)animation.getKeyFrame(time));
spriteBatch.draw(sprite, x, y, 0, 0, sprite.width, sprite.height, sprite.scaleX, sprite.scaleY, 0);

但是如果你想要一个类似于精灵的动画,你可以将它子类化以使其存储缩放数据(如果你愿意,还可以旋转和定位)并绘制自己。然后你根本不必担心Sprite实例。

例如:

public class SpriteAnimation extends Animation {

    float scaleX = 1;
    float scaleY = 1;

    /*...duplicate and call through to super constructors here...*/

    public void setScaling(float scale){
        scaleX = scale;
        scaleY = scale;
    }

    public void draw (float stateTime, Batch batch, float x, float y) {
        TextureRegion region = getKeyFrame(stateTime);
        batch.draw(region, x, y, region.width*scaleX, region.height*scaleY);
    }
}

如果您愿意,您可以自定义此项,以便像精灵一样存储x和y,旋转,原点等。创建它时,根本不会使用Sprite类。你会做这样的事情。

frame1 = new TextureRegion(texture, 764, 75, 141, -74);
frame2 = new TextureRegion(texture, 907, 75, 133, -75);

TextureRegion[] frames = { frame1, frame2 };

mySpriteAnimation = new SpriteAnimation(0.06f, frames);
mySpriteAnimation.setScaling(scaler);
mySpriteAnimation.setPlayMode(Animation.PlayMode.LOOP);