Способы плавного увеличения LibGDX?

Я создаю игру LibGDX, и мне нужно увеличивать и уменьшать масштаб камеры. Но когда я делаю camera.zoom = 1.2f;, он просто «перескакивает» к этому значению. Вместо этого я хочу иметь плавный зум.

Мой вопрос: как лучше всего плавно масштабировать?

Я хочу увеличить, как этот график ниже. y=0 — это начало cam.zoom, y=100 — желаемое cam.zoom, а ось X показывает время. Увеличить график

Должен ли я использовать cam.zoom = f(time);? (с некоторой модификацией f(x))

time — общее время, прошедшее с начала масштабирования.

Или лучше использовать:

cam.zoom += (desiredZoom - cam.zoom) * delta * scalar;

delta – это время между двумя кадрами, а
scalar – число с плавающей запятой, которое будет регулироваться для установки скорости.

Или есть другой, лучший способ? Что вы думаете?

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


person TVASO    schedule 07.12.2017    source источник
comment
github.com/libgdx/libgdx/wiki/Interpolation   -  person QBrute    schedule 07.12.2017
comment
При втором подходе camera.zoom никогда не достигнет желаемого масштаба, он просто будет бесконечно приближаться к нему. Поэтому используйте первый подход и интерполяцию, как предложил @QBrute.   -  person Arctic45    schedule 07.12.2017


Ответы (2)


Самый простой способ, который я знаю, - использовать обратный отсчет с интерполяцией.

// member variables:
float timeToCameraZoomTarget, cameraZoomTarget, cameraZoomOrigin, cameraZoomDuration;

private float zoomTo (float newZoom, float duration){
    cameraZoomOrigin = camera.zoom;
    cameraZoomTarget = newZoom;
    timeToCameraZoomTarget = cameraZoomDuration = duration;
}

// in render():
if (timeToCameraZoomTarget >= 0){
    timeToCameraZoomTarget -= deltaTime;
    float progress = timeToCameraZoomTarget < 0 ? 1 : 1f - timeToCameraZoomTarget / cameraZoomDuration;
    camera.zoom = Interpolation.pow3out.apply(cameraZoomOrigin, cameraZoomTarget, progress);        
}

Вы можете заменить Interpolation.pow3out любой из функций, изображенных здесь.

person Tenfour04    schedule 08.12.2017

Вы можете использовать MathUtils.lerp.

Пример:

MathUtils.lerp(currentZoom,targetZoom,progress);

Увеличьте значение прогресса, чтобы измениться быстрее, или уменьшите, чтобы замедлить скорость изменения значения.

person dfour    schedule 08.12.2017