История изменений
Исправление Gyros, (текущая версия) :
Да, огромное спасибо firkax! Перевел все на тики. Проверка на время стала не нужна, вместо нее в update теперь:
if (current_Tick < duration_Tick )
{
personage_X -= dX;
current_Tick++;
}
Эта анимация (буду называть ее «шаговой», т.к. все время прибавляется или отнимается шаг: +/-dX) работает точно как часы.
Вот тут я сдвигаюсь влево на 10 за 0.25 сек:
personage coords: [-5.000, -5.000]
duration_Tick = 14 // 14 кадров необходимо для достижения конечной точки перемещения
dX = 0.71429 // шаг
current_Tick = 0 personage_X = -5.000
current_Tick = 1 personage_X = -5.714
current_Tick = 2 personage_X = -6.429
...
current_Tick = 12 personage_X = -13.571
current_Tick = 13 personage_X = -14.286
current_Tick = 14 personage_X = -15.000
elapsed time = 0.24698
personage coords: [-15.000, -5.000]
Теперь я хочу сделать анимацию не «шаговую», а с использованием интерполяции:
moveRight_WithLerp()
{
bmoveRight = true; // начинаю движение вправо
duration_T = 0.45; // длительность в сек
duration_Tick = (int) (duration_T/DELTA_T); // кол-во тиков(кадров) для перемещения
old_personage_X = personage_X; // начальная(где он сейчас) позиция персонажа
new_personage_X = personage_X + 10.0f; // конечная (будущая) позиция персонажа
animationValue = 0.0f; // параметр анимации (изменяется от 0 до 1)
start_move_T = get_time(); // фиксирую время начала движения
}
update(double now_T)
{
printf("update()\n");
if (bmoveRight)
{
if ( animationValue < 1.0f )
{
printf("animationValue = %5.5f personage_X = %5.3f\n", animationValue, personage_X);
animationValue += ?;
personage_X = lerp(old_personage_X, new_personage_X, animationValue);
}
else
{
bmoveRight = false; // остановить движение
end_move_T = now_T;
printf("elapsed time = %5.5f\n", end_move_T - start_move_T);
}
}
}
Тут проблема, что надо иметь шаг для animationValue, которое изменяется от 0 до 1.
Как получить этот шаг для такого нормированного времени?
Есть просто время double now_T.
Нужно его как-то нормировать с учетом duration_T = 0.45.
Какие будут предложения как это грамотно сделать?
Исправление Gyros, :
Да, огромное спасибо firkax! Перевел все на тики. Проверка на время стала не нужна, вместо нее в update теперь:
if (current_Tick < duration_Tick )
{
personage_X -= dX;
current_Tick++;
}
Эта анимация (буду называть ее «шаговой», т.к. все время прибавляется или отнимается шаг: +/-dX) работает точно как часы.
Вот тут я сдвигаюсь влево на 10 за 0.25 сек:
personage coords: [-5.000, -5.000]
duration_Tick = 14 // 14 кадров необходимо для достижения конечной точки перемещения
dX = 0.71429 // шаг
current_Tick = 0 personage_X = -5.000
current_Tick = 1 personage_X = -5.714
current_Tick = 2 personage_X = -6.429
...
current_Tick = 12 personage_X = -13.571
current_Tick = 13 personage_X = -14.286
current_Tick = 14 personage_X = -15.000
elapsed time = 0.24698
personage coords: [-15.000, -5.000]
Теперь я хочу сделать анимацию не «шаговую», а с использованием интерполяции:
moveRight_WithLerp
{
bmoveRight = true; // начинаю движение вправо
duration_T = 0.45; // длительность в сек
duration_Tick = (int) (duration_T/DELTA_T); // кол-во тиков(кадров) для перемещения
old_personage_X = personage_X; // начальная(где он сейчас) позиция персонажа
new_personage_X = personage_X + 10.0f; // конечная (будущая) позиция персонажа
animationValue = 0.0f; // параметр анимации (изменяется от 0 до 1)
start_move_T = get_time(); // фиксирую время начала движения
}
update(double now_T)
{
printf("update()\n");
if (bmoveRight)
{
if ( animationValue < 1.0f )
{
printf("animationValue = %5.5f personage_X = %5.3f\n", animationValue, personage_X);
animationValue += ?;
personage_X = lerp(old_personage_X, new_personage_X, animationValue);
}
else
{
bmoveRight = false; // остановить движение
end_move_T = now_T;
printf("elapsed time = %5.5f\n", end_move_T - start_move_T);
}
}
}
Тут проблема, что надо иметь шаг для animationValue, которое изменяется от 0 до 1.
Как получить этот шаг для такого нормированного времени?
Есть просто время double now_T.
Нужно его как-то нормировать с учетом duration_T = 0.45.
Какие будут предложения как это грамотно сделать?
Исходная версия Gyros, :
Да, огромное спасибо firkax! Перевел все на тики. Проверка на время стала не нужна, вместо нее в update теперь:
if (current_Tick < duration_Tick )
{
personage_X -= dX;
current_Tick++;
}
Эта анимация (буду называть ее «шаговой», т.к. все время прибавляется или отнимается шаг: +/-dX) работает точно как часы.
Вот тут я сдвигаюсь влево на 10 за 0.25 сек:
personage coords: [-5.000, -5.000]
duration_Tick = 14 // 14 кадров необходимо для достижения конечной точки перемещения
dX = 0.71429 // шаг
current_Tick = 0 personage_X = -5.000
current_Tick = 1 personage_X = -5.714
current_Tick = 2 personage_X = -6.429
...
current_Tick = 12 personage_X = -13.571
current_Tick = 13 personage_X = -14.286
current_Tick = 14 personage_X = -15.000
elapsed time = 0.24698
personage coords: [-15.000, -5.000]
Теперь я хочу сделать анимацию не «шаговую», а с использованием интерполяции:
moveRight_WithLerp
{
bmoveRight = true; // начинаю движение вправо
duration_T = 0.45; // длительность в сек
duration_Tick = (int) (duration_T/DELTA_T); // кол-во тиков(кадров) для перемещения
old_personage_X = personage_X; // начальная(где он сейчас) позиция персонажа
new_personage_X = personage_X + 10.0f; // конечная (будущая) позиция персонажа
animationValue = 0.0f; // параметр анимации (изменяется от 0 до 1)
start_move_T = get_time(); // фиксирую время начала движения
}
update(double now_T)
{
printf("update()\n");
if (bmoveRight)
{
if ( animationValue < 1.0f )
{
printf("animationValue = %5.5f personage_X = %5.3f\n", animationValue, personage_X);
animationValue += ?;
personage_X = lerp(old_personage_X, new_personage_X, animationValue);
}
else
{
bmoveRight = false; // остановить движение
end_move_T = now_T;
printf("elapsed time = %5.5f\n", end_move_T - start_move_T);
}
}
}
Тут проблема, что надо иметь шаг для animationValue, которое изменяется от 0 до 1.
Как его этот шаг для такого нормированного времени?
Есть просто время double now_T.
Нужно его как-то нормировать с учетом duration_T = 0.45.
Какие будут предложения как это грамотно сделать?