LibGDX-масштабирование анимации



Еще один день, еще одна проблема.



Я пытаюсь сделать анимацию из TextureRegions, но мне нужно масштабировать ее на некоторое значение. У меня нет проблем с масштабированием неподвижных изображений(спрайтов, сделанных из текстурных областей), но я понятия не имею, почему это не работает с анимационными кадрами.

С неподвижными изображениями я делаю что-то вроде этого:



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


А затем я рендерю его в renderer просто отлично.



С анимацией я пытаюсь сделать что-то вроде этого:



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


Но образ есть все еще в первоначальном размере, "скалер" не имел никакого значения.

571   1  

1 ответ:

Вы не сказали, как вы рисуете анимацию, но, вероятно, вы используете метод, который не знает о масштабах спрайтов.

Так как класс анимации хранит TextureRegions, если вы получаете кадр из анимации, чтобы нарисовать так:

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

Тогда пакет sprite не знает, что это экземпляр Sprite, только что это экземпляр 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);

Comments

    Ничего не найдено.