LINUX.ORG.RU

История изменений

Исправление 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.

Какие будут предложения как это грамотно сделать?