2015-01-25 4 views
2

Еще один день, еще одна проблема.LibGDX - масштабирование анимации

Я пытаюсь сделать анимацию из 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); 

, но изображение все еще в оригинальном размере, «скейлер» не имеет никакого значения.

ответ

2

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

Поскольку магазины анимации класса 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); 
    } 
} 

Вы можете настроить это, как вы хотели бы хранить х и у, вращение, происхождение и т.д., как спрайт, если вам нравится. Когда вы его создадите, вы не будете использовать класс 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); 
+0

Мне пришлось слегка изменить метод рисования (сделать 2 новые переменные, newHeight и newWidth и масштабировать их там), но в остальном это довольно опрятное решение, спасибо. – Kierek93

+0

Является ли использование этого метода другим? Я попробовал 'batch.draw (animation.getKeyFrame (elapsedTime, true), 0, 0);' , но это не имеет никакого значения по сравнению с использованием расширенного класса, все еще рисуя огромный спрайт на экран. И да, я настраиваю масштабирование и инициализацию SpriteAnimation следующим образом: 'animation = new SpriteAnimation (1/15f, atlas.getRegions()); animation.setScaling (0.01f); ' – kacpr

+0

@kacpr, что перегрузка метода draw не имеет параметров масштабирования. Выберите перегрузку ничьей, у которой есть параметры, которым вам нужен SpriteBatch. – Tenfour04

Смежные вопросы