#c #easing
#c #ослабление
Вопрос:
Я создаю класс для спрайтов, которые поддерживают различные варианты поведения, которые перемещают спрайт к целевой точке, и я тестирую их с помощью последователя мыши.
Я хочу, чтобы он поддерживал поведение ease-in-out, ускоряя его, а затем замедляя по мере приближения к целевой точке.
Это не должно быть фиксированной анимацией с фиксированной продолжительностью и другими фиксированными обстоятельствами, скорее это должно быть, ну, поведение, принимающее форму функции, которая вызывается один раз при каждом временном шаге, без ссылки на то, было ли начато перемещение или сколько времени это займет, или что-то в этом роде -только его текущая целевая позиция и некоторые модификаторы для самого поведения. Чтобы проиллюстрировать концепцию, вот две другие функции, которые я создал для класса, начиная с простейшей:
void ElasticSprite::easeOutMove(int targetX, int targetY, unsigned friction)
{
_xPosition = (targetX-_xPosition)/friction;
_yPosition = (targetY-_yPosition)/friction;
}
(Я изменил код так, чтобы он не зависел от библиотеки, в реальной работе используется материал SFML)
Эта функция простым способом перемещает спрайт к целевой точке.
Мой второй пример:
void ElasticSprite::rubberMove(int targetX, int targetY, unsigned friction, unsigned elasticity)
{
_xSpeed = (targetX-_xPosition)/friction-_xSpeed/elasticity;
_ySpeed = (targetY-_yPosition)/friction-_ySpeed/elasticity;
_xPosition = _xSpeed;
_yPosition = _ySpeed;
}
Именно то, что написано на tin, эта функция заставляет спрайт вести себя как резиновый, ускоряясь мимо целевой точки, а затем перемещаясь по ней взад и вперед, пока она не замедлится до остановки. Если вы начнете перемещать целевую точку (в моем случае мышь), поведение не сбрасывается, вместо этого оно начинает следовать за новой целевой точкой.
Мне нужна функция простого ввода-вывода и, соответственно, версия rubberMove, которая ускоряется по тому же правилу, но я совершенно не понимаю, как это должно работать. Я хочу, чтобы скорость ускорения этой функции зависела от расстояния между текущей позицией спрайта и его целевой позицией ( targetX-_xPosition
и targetY-_yPosition
, умноженное на модификатор ускорения), что означает, что если спрайт запускается полностью неподвижно в одной позиции, для достижения любой позиции должно потребоваться столько же времени.в другом положении максимальная скорость находится в средней точке как по времени, так и по расстоянию.
Есть ли у кого-нибудь какие-либо предложения относительно того, как это поведение может быть реализовано?
Ответ №1:
«Если вы начнете перемещать целевую точку (в моем случае мышь), поведение не сбрасывается, вместо этого оно начинает следовать за новой целевой точкой».
1) вам нужно иметь функцию таймера, чтобы она принимала целевую позицию в определенное время и переходила к точке, вместо того, чтобы повсюду следовать за мышью. 2) вы можете использовать концепцию инерции для постепенного ускорения.
void ElasticSprite::rubberMove(int targetX, int targetY, unsigned friction, unsigned elasticity)
{
//the timer event will set the initial x speed and y speed.
_xSpeed *= 1-friction // where friction < 1;
_ySpeed *= 1-friction // where friction < 1;
_xPosition = _xSpeed;
_yPosition = _ySpeed;
}
do this until you get to desired point.
Комментарии:
1.
rubberMove
это не попытка достичь желаемого поведения. Кроме того, я хочу, чтобы спрайт выполнял именно то, что я хочу, чтобы он выполнял это в соответствии с его поведением при простоте ввода-вывода.