Разработка игр: Как добавить ускорение в скорость? - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть вид, который мне нужно масштабировать с ускорением, я имею в виду, что когда масштаб равен MIN_SCALE, скорость должна быть медленной, но когда масштаб приближается к MAX_SALE, скорость должна быть большебыстрый.Теперь моя скорость всегда одинакова.

Существует несколько кадров, которые View будет использовать для своего движения:

numberOfFrames = Math.round((float)ANIMATION_TIME/GameLoopThread.FRAME_PERIOD);
frameCount = 0;

, и я рассчитываю scaleVelocity с таким количеством кадров:

scaleVelocity = (MAX_SCALE-MIN_SCALE)/numberOfFrames;

На каждой итерации игрового цикла я обновляю масштаб представления следующим кодом:

if (frameCount<numberOfFrames) {
    currentScale = currentScale + scaleVelocity;
    frameCount++;
}

Когда количество кадров достигает numberOfFrames, анимация должна заканчиваться.

Как я могу добавить ускорение к этому коду?помните, что ускорение должно учитывать, что представление должно достигать MAX_SCALE в последнем кадре из переменной frameCount.

Большое спасибо

1 Ответ

1 голос
/ 27 сентября 2019

screenshot from android docs

Определите свой интерполятор

INTERPOLATOR = new AccelerateInterpolator();  

при расчете scaleVelocity, получите текущее интерполированное значение

float interpolatedValue = INTERPOLATOR.getInterpolation(frameCount / numberOfFrames);

getInterpolation ()возвращает значение от 0 (начало анимации) до 1 (конец анимации)

scaleVelocity = (MAX_SCALE-MIN_SCALE)/numberOfFrames * interpolatedValue;  // use min,max func if needed.

Математическое уравнение ускоренного интерполятора: f (x) = x², если вы хотите больше изменений, то создайте свой собственный интерполятор.

рабочий метод испытаний для анимации.

 private void testAnim() {
    int numberOfFrames = 100;//Math.round((float)ANIMATION_TIME/GameLoopThread.FRAME_PERIOD);
    float frameCount = 0;
    float MAX_SCALE = 4;
    float MIN_SCALE = 0.1f;
    float scaleVelocity;
    float currentScale ;
    Interpolator INTERPOLATOR = new AccelerateInterpolator();

    do {
        float interpolatedValue = INTERPOLATOR.getInterpolation(frameCount / numberOfFrames);
        scaleVelocity = (MAX_SCALE - MIN_SCALE) * interpolatedValue;

        currentScale = Math.max(MIN_SCALE, scaleVelocity);
        ++frameCount;
        Log.d("STACK", "testAnim: currentScale = " + currentScale);
        // apply scale to view.
    } while (frameCount < numberOfFrames);

    // finally set final value of animation.
    currentScale = MAX_SCALE;
    // apply scale to view.

}
...