Нефиксированное поведение простоты ввода для двумерных объектов

Я создаю класс для спрайтов, которые поддерживают различные типы поведения, которые перемещают спрайт к целевой точке, и я тестирую их с помощью мыши.

Я хочу, чтобы он поддерживал простое поведение, ускоряя его, а затем замедляя по мере приближения к целевой точке.

Это не должна быть фиксированная анимация с фиксированной продолжительностью и другими фиксированными обстоятельствами, скорее это должно быть поведение, принимающее форму функции, которая вызывается один раз за каждый шаг, без ссылки на то, было ли начато перемещение или сколько времени это займет или что-то в этом роде — только его текущая целевая позиция и некоторые модификаторы самого поведения. Чтобы проиллюстрировать концепцию, вот две другие функции, которые я создал для класса, начиная с самой простой:

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;
}

В точности то, что написано на жестяной банке, эта функция заставляет спрайт вести себя резиново, ускоряться после целевой точки, а затем перемещаться вперед и назад по ней, пока не замедлится до полной остановки. Если вы начнете перемещать целевую точку вокруг (мышь, в моем случае), поведение не будет сброшено, оно вместо этого начнет идти после новой целевой точки.

Мне нужна функция облегчения и ускорения, и, соответственно, версия rubberMove, которая ускоряется по тому же правилу, но я совершенно не понимаю, как она должна работать. Я хочу, чтобы скорость ускорения этой функции зависела от расстояния между текущей позицией спрайта и его целевой позицией (targetX-_xPosition а также targetY-_yPosition(умножается на модификатор ускорения), что означает, что если спрайт начинается полностью по-прежнему в одной позиции, ему потребуется такое же количество времени, чтобы достичь любой другой позиции, его пиковая скорость находится в средней точке как во времени, так и расстояние.

У кого-нибудь есть предложения относительно того, как это поведение может быть реализовано?

0

Решение

«Если вы начнете перемещать целевую точку (мышь, в моем случае), поведение не будет сброшено, вместо этого оно начнет двигаться после новой целевой точки».

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.
0

Другие решения


По вопросам рекламы [email protected]