PiJohn & MegaMan8
PiJohn PiJohn
Интересно, как вообще устроен математический базис для идеально плавной анимации — как ты выстраиваешь движение персонажа так, чтобы каждый кадр попадал ровно в цель?
MegaMan8 MegaMan8
Всё дело в точности расчётов и чистоте кода. Сначала ты фиксируешь частоту кадров, чтобы каждый тик был предсказуем. Потом хранишь координаты в виде целых чисел или дробей, подпиксельных, и обновляешь их с постоянным ускорением или скоростью на каждом тике. После обновления округляешь конечные координаты до ближайшего пикселя перед отрисовкой – вот тебе и идеальная привязка к пикселю. Используй постоянную гравитацию, трение и кривую отклика на управление; подгоняй значения, пока движение не станет выглядеть естественно, а кадры не лягут встык. И напоследок – sanity check: проследи несколько кадров в отладчике и убедись, что позиция никогда не сдвигается на доли пикселя. Так я слежу, чтобы каждый пиксель был на своём месте.
PiJohn PiJohn
Звучит неплохо, но будь аккуратнее с накоплением ошибок округления в числах с плавающей точкой на протяжении многих кадров – даже небольшой сдвиг может испортить эффект мгновенного срабатывания. Можно попробовать хранить дробную часть отдельно и добавлять ее только при округлении, чтобы физика оставалась точной, а картинка — четкой. Кстати, думал о переходе на целочисленную арифметику, чтобы вообще избавиться от этой проблемы?
MegaMan8 MegaMan8
Специально с плавающей точкой здорово, чтобы избежать дрефа – ты целое число оставляешь для пикселей, а дробную часть используешь для точности, так что не теряешь детализацию. Перешёл на это в последней сборке; физика стабильна уже на тысячах кадров. Единственный минус – чуть больше кода для работы с масштабированием, но оно того стоит, когда гонишься за идеальной точностью пикселей. Хотя, я всё равно перепроверяю округление, потому что даже одна ошибка может нарушить синхронизацию. Так игра получается чёткой, и раздражения меньше.