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);
Но образ есть все еще в первоначальном размере, "скалер" не имел никакого значения.
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