2016-01-22 16 views
2

Я ищу способ подключения жесты панорамы с процентом завершения анимации. Позвольте мне показать вам, что я имею в виду.создание интерактивной анимации с помощью libgdx

enter image description here

Это изображение представляет собой анимацию, которую я хочу выполнить, а именно движущегося изображения актера или спрайт. Анимация исполняется pan жест. Анимация завершена на 100% и на этапе 6, когда пользователь слайд 200px. Если пользователь переместился всего на 100 пикселей, он будет на 50% завершен и на этапе 3. Если пользователь не выполнил жест панорамы, анимация останется на уровне 0% и на этапе 1. Я ищу советы о том, как начать строить такую ​​модель , Я считаю, что это называется интерактивным. Есть ли у вас какие-либо предложения?

+0

Имеют вид прокрутки. Контролируйте, сколько он прокрутил. Настройте анимацию для анимации в кадрах. анимация текущий кадр = Math.floor (scrollview.scrollX/scrollview.totalScrollX * animation.totalFrames) – Diniden

+0

хорошо. проблема в том, что я не могу записывать фреймы заранее, потому что пользователю нужно создать собственный «синий прямоугольник». – brumbrum

+0

Тогда вам придется объяснить более подробно ваш сценарий. Даже если пользователь создает свой собственный контент, вы должны иметь контроль над сгенерированными кадрами. Я не понимаю, как мой подход потребует «предварительно вычисленных» значений. – Diniden

ответ

1

Вы можете использовать GestureDetector для обработки ввода панорамирования. Метод gestureListener.pan может обновить параметр позиции анимации.

private int screenPixelsToAnimationPositionRatio = 0.01f; //will need to tweak this and probably adjust it at runtime based on screen dimensions and resolution 
private float animationPosition = 0; //from 0 to 1, fraction of animation complete 

public void create() { 

    //... 

    GestureAdapter gestureAdapter = new GestureAdapter { 
     @Override 
     public boolean pan (float x, float y, float deltaX, float deltaY) { 
      animationPosition += deltaX * screenPixelsToAnimationPositionRatio; 
      animationPosition = MathUtils.clamp(animationPosition, 0, 1); 
      return true; 
     } 
    }; 

    GestureDetector gestureDetector = new GestureDetector(gestureAdapter); 
    Gdx.input.setInputProcessor(gestureDetector); //or put the detector in an InputMultiplexer with your other input listeners. 
} 

Тогда вы можете создать метод, который может обновлять положение и вращение вашего объекта на основе текущей стоимости animationPosition. Вам нужно будет выяснить уравнения, которые определяют движение, которое вы хотите. Например, то, что выглядит вроде как то, что вы показано выше:

private void updateAnimation(){ 
    x = animationPosition * 30; 
    float y = 0, rotation = 0; 
    if (animationPosition >= 0.25f) { 
     float jumpPosition = Math.min(1, (animationPosition - 0.25f)/0.5f); 
     y = 30 * (1 - Interpolation.pow2In.apply(Math.abs(2 * jumpPosition - 1))); 
     rotation = 180 * jumpPosition; 
    } 

    mySprite.setPosition(x, y); 
    mySprite.setRotation(rotation); 
} 

Затем вызовите этот метод обновления где-то в render.

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