Всех приветствую! Хочу двигать персонаж вправо на 10.0f ровно за свое заданное время: 2 сек, 0.5 сек и т.п.
Имеются следующие функции и глобальные переменные (очищенный от несущественного псевдокод):
float personage_X=-5.0f, personage_Y=-5.0f;
float distance_X=10.0, distance_Y=0.0;
float dX, dY;
double DELTA_T = 0.01667; //среднее значение delta_T даваемое программой
//(по сути это 1000/60=16.6(6) мс/кадр)
double last_T_move;
double duration_T;
int duration_tick;
bool bmoveLeft = false;
bool bmoveRight = false;
moveRight
{
bmoveRight = true; // начинаю движение
duration_T = 0.9; // длительность в сек
duration_tick = (int) (duration_T/DELTA_T); // кол-во тиков(кадров) для перемещения
dX = distance_X/duration_tick; // шаг перемещения
last_T_move = get_time();
}
update
{
printf("update()\n");
if (bmoveRight)
{
personage_X += dX;
printf("now_T - last_T_move = %5.7f\n", now_T - last_T_move);
if (now_T - last_T_move >= duration_T )
{
bmoveRight = false; // остановить движение
}
}
}
idle
{
const double now_T = get_time();
const double delta_T = now_T - last_T;
last_T = now_T;
printf("delta_T = %5.5f\n", delta_T);
update(now_T);
redisplay();
}
display
{
printf("display()\n");
render_personage();
swap_buffers();
}
Вывод консоли работающей программы:
delta_T = 0.01669 update() display() delta_T = 0.01667 update() display() delta_T = 0.01667 update() display() delta_T = 0.01666 update() display() delta_T = 0.01667 update() display() delta_T = 0.01670 update() display() ...
1) Теперь я начинаю движение, например за 2.2 сек вправо на 10:
personage coords: [-5.000, -5.000] duration_tick = 131 // 131 кадр необходимо для достижения конечной точки перемещения dX = 0.07634 // шаг now_T - last_T_move = 0.0156779 now_T - last_T_move = 0.0324781 now_T - last_T_move = 0.0491800 now_T - last_T_move = 0.0658500 now_T - last_T_move = 0.0825200 ... now_T - last_T_move = 2.1999640 now_T - last_T_move = 2.2166250 personage coords: [5.153, -5.000] // в идеале должно быть [5.000, -5.000] // еще только маленькая погрешность
2) Движение за 0.9 сек вправо на 10:
personage coords: [-5.000, -5.000] duration_tick = 53 // 53 кадра необходимо для достижения конечной точки перемещения dX = 0.18868 // шаг now_T - last_T_move = 0.0135901 now_T - last_T_move = 0.0302720 now_T - last_T_move = 0.0469420 now_T - last_T_move = 0.0636110 ... now_T - last_T_move = 0.9139049 personage coords: [5.377, -5.000] // в идеале должно быть [5.000, -5.000] // уже существенная погрешность
3) Движение за 0.2 сек вправо на 10:
personage coords: [-5.000, -5.000] duration_tick = 11 dX = 0.90909 now_T - last_T_move = 0.0133729 now_T - last_T_move = 0.0302980 now_T - last_T_move = 0.0469708 now_T - last_T_move = 0.0636489 now_T - last_T_move = 0.0803308 ... now_T - last_T_move = 0.1970379 now_T - last_T_move = 0.2136910 personage coords: [6.818, -5.000] // в идеале должно быть [5.000, -5.000] // бешенейшая погрешность (!) // Alarm! Что делать?
Из трех экспериментов видно, что чем быстрее я хочу переместиться, то тем дальше перелетаю требуемую конечную точку.
Хотелось бы услышать компетентное мнение по устранению данной проблемы и/или возможного изменения подхода к анимации в принципе. Спасибо за помощь!