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

0

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

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

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

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, умноженное на модификатор ускорения), что означает, что если спрайт полностью выйдет в одном положении он должен занимать одинаковое количество времени, чтобы достичь любой другой позиции, причем максимальная скорость находится в середине и по времени, и по времени.

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

Теги:
easing

1 ответ

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
    rubberMove не является попыткой достижения желаемого поведения. Более того, следование мышью везде - это именно то, что я хочу, чтобы спрайт делал, и я хочу, чтобы он делал это в соответствии с его поведением «простота в облегчении».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню