LibGDX - 缩放动画

5

又是新的一天,又遇到了新的问题。

我正在尝试从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);

但是图片仍然保持原始大小,“scaler”没有任何效果。
1个回答

6

2018年更新: 在LibGDX的新版本中,Animation类不再局限于TextureRegions。它可以动画任何一组通用对象,因此您可以创建一个Animation<Sprite>,尽管您需要确保每次获取关键帧精灵时应用适当的比例尺。个人认为应避免使用Sprite类,因为它将资源(图像)与游戏状态混淆。


您没有说明如何绘制动画,但是可以假设您正在使用不知道精灵比例的方法进行绘制。

由于Animation类存储TextureRegions,因此如果您从动画中获取要绘制的帧,就像这样:

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

如果SpriteBatch不知道它是Sprite的实例,只知道它是TextureRegion的实例,而TextureRegion不包含缩放信息。解决的一种快速、简单的方法是这样的:
Sprite sprite = (Sprite)animation.getKeyFrame(time));
spriteBatch.draw(sprite, x, y, 0, 0, sprite.width, sprite.height, sprite.scaleX, sprite.scaleY, 0);

但如果您想要一个行为类似于精灵的动画,您可以对其进行子类化,以便存储缩放数据(如果需要,还可以存储旋转和位置),并绘制自身。然后您就不必再担心精灵实例的问题。

例如:

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);

我不得不稍微更改绘制方法(创建2个新变量newHeight和newWidth并在那里进行缩放),但除此之外,这是一个相当不错的解决方案,谢谢。 - Kierek93
这个方法的使用方式有什么不同吗?我尝试了 batch.draw(animation.getKeyFrame(elapsedTime, true), 0, 0); 但与使用扩展类之前相比没有任何区别,仍然将巨大的精灵绘制到屏幕上。 是的,我是这样设置缩放并初始化SpriteAnimation的: animation = new SpriteAnimation(1/15f, atlas.getRegions()); animation.setScaling(0.01f); - kacpr
@kacpr,该绘制方法的重载没有比例参数。选择一个具有所需参数的draw的重载形式,使SpriteBatch能够识别它们。 - Tenfour04

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接