Как мне реализовать замедление?


11

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

Я новичок в векторах и не очень хорош с физикой и тому подобное. Как обычно обрабатывается «замедление»?


То, что у меня сейчас работает, но вроде как хакерское .

update:function(Game, t, dt) {
    var speed = Game.Input.isKeyDown('shift') ? 8 : 4;

    if (Game.Input.isKeyDown('a')) {
        this.velocity.i -= speed;
    }
    else if (Game.Input.isKeyDown('d')) {
        this.velocity.i += speed;
    }
    else {
        if (Math.abs(this.velocity.i) > 3) {
            this.velocity.i += (this.velocity.i > 0) ? -speed : speed;
        }
        else {
            this.velocity.i = 0;
        }
    }

    if (Game.Input.isKeyDown('w')) {
        this.velocity.j -= speed;
    }
    else if (Game.Input.isKeyDown('s')) {
        this.velocity.j += speed;
    }
    else {
        if (Math.abs(this.velocity.j) > 3) {
            this.velocity.j += (this.velocity.j > 0) ? -speed : speed;
        }
        else {
            this.velocity.j = 0;
        }
    }

    this.updateVectors(dt);
}

Я использовал 3, потому что все, что ниже, демонстрирует странное поведение, я предполагаю, что если я увеличу скорость, то это нужно будет изменить.


2
Также немного семантическая деталь .. в заявлении в действительности ваше ускорение, то есть скорость , что скорость изменяется на. :)velocity.i += speed;speed
Ipsquiggle

Flixel называет это «перетаскиванием», если вы ищете термин, который не зависит от ускорения.
Грегори Эйвери-Вейр

«Замедление» - это отрицательное ускорение. Вы взяли исчисление?
3Dave

1
На самом деле «замедление» не является реальной вещью, равно как и «отрицательное ускорение». Это все обычное ускорение, просто в разные стороны.
MichaelHouse

Ответы:


16

Что-то простое, как

this.velocity.i *= 0.9;

работает хорошо.


Хех, доверие меня к чрезмерному усложнять , что плохо. Я только что прочитал, что вы можете смоделировать базовое сопротивление воздуха, умножив на 0,9, и все же это не пришло в голову. Спасибо.
Ксавура

Ха-ха, вау, да. Я рассчитывал обратный вектор нормали и умножал его на коэффициент замедления. Почему я просто не сделал это? Иногда действительно очевидные ответы легче всего пропустить.
CodexArcanum

7

В псевдокоде я делаю варианты этого:

Скорость + = ((MoveDirection * MaximumSpeed) - Скорость) * AccelerationFactor

Куда:

  • Скорость - это текущая скорость, с которой объект движется по текущей оси.
  • MoveDirection - это направление, в котором объект пытается двигаться по текущей оси, 1 - вперед, 0 - все еще, а -1 - назад. Все значения между допускаются.
  • MaximumSpeed ​​- это константа, определяющая, насколько быстро объект может перемещаться по текущей оси.
  • AccelerationFactor - это константа от 0 до 1, которая представляет скорость ускорения и замедления. 1 мгновенно, а 0 никогда не будет двигаться.

Который обрабатывает и Ускорение и Замедление приятно в изогнутой, а не линии. Если вам нужны разные скорости ускорения и замедления, вы можете сделать операторы IF, которые определяют, пытается ли игрок не двигаться или двигаться в противоположном направлении.


1
Это очень интересная формула. Я должен иметь это в виду на будущее!
Ipsquiggle

+1 Выглядит интересно, я думаю, я мог бы бросить это в некоторый код, чтобы увидеть, как это работает.
Дэвид Янг

Очень хорошая формула. Я собираюсь использовать это. Откуда ты это взял? Или вы получили это сами?
Riki

Извините за задержку с ответом, я смутно помню, как меня вдохновил код одной из демонстраций Blitz3D, хотя я не могу вспомнить, какая именно.
Earok

3

Ответы здесь ( vel = vel * 0.9) на самом деле затухающие , а не то, что я бы назвал «замедлением» .

Я часто делаю замедление вот так:

if ( Game.Input.isKeyDown( "w" ) )
{
    this.velocity.i = Math.max( -WALKSPEED, this.velocity.i - WALKFORCE);
}
else if ( Game.Input.isKeyDown( "d" ) )
{
    this.velocity.i = Math.min( WALKSPEED, this.velocity.i + WALKFORCE);
}
else
{
    if (this.velocity.i < 0)
    {
        this.velocity.i = Math.min( 0, this.velocity.i + WALKFORCE);
    }
    else if (this.velocity.i > 0)
    {
        this.velocity.i = Math.max( 0, this.velocity.i - WALKFORCE);
    }
}

Некоторые плюсы и минусы против демпфирования:

Плюсы :

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

Минусы :

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

1

Проще говоря, в псевдокоде:

if(no movement keys pressed) [Meaning we want to start to decelerate]
current speed *= 0.85 [Or some number between 0 and 1, the smaller the faster the deceleration]

Тем не менее, вам нужно проверить, если (текущая скорость <0,001f) или что-то и установить в 0.


Я подумал, что должен был бы поставить чек на месте, но, похоже, он работает без него.
Ксавура
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.