如何实施减速?


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 2010年

如果您正在寻找与加速度无关的术语,Flixel称其为“拖动”。
Gregory Avery-Weir 2010年

“减速”是负加速度。你有没有做微积分?
3Dave 2010年

1
实际上,“减速度”不是真实的东西,也不是“负加速度”。这都是常规的加速度,只是方向不同。
MichaelHouse

Answers:


16

像这样简单

this.velocity.i *= 0.9;

效果很好。


嘿,我信任过度复杂它坏的。我最近读到,您可以通过乘以0.9来模拟基本空气阻力,但仍然没有想到。谢谢。
Xavura

哈哈,哦,是的。我正在计算逆向量法线,并将其乘以减速因子。我为什么不这样做呢?有时候,真正显而易见的答案最容易遗漏。
CodexArcanum 2010年

7

在伪代码中,我对此进行了变体:

速度+ =((MoveDirection * MaximumSpeed)-速度)* AccelerationFactor

哪里:

  • 速度是实体在当前轴上移动的当前速度。
  • MoveDirection是实体尝试在当前轴上行进的方向,1向前,0静止,-1向后。允许介于两者之间的所有值。
  • MaximumSpeed是一个常数,它确定实体可以在当前轴上移动的最快速度。
  • AccelerationFactor是介于0和1之间的常数,表示加速和减速的速率。1是即时的,0永远不会移动。

它以曲线而不是直线的方式很好地处理加速度和减速度。如果您想要不同的加速和减速速率,则可以执行IF语句来确定玩家是否在尝试不移动或向相反方向移动。


1
这是一个非常有趣的公式。我将在未来牢记这一点!
Ipsquiggle 2010年

+1看起来很有趣,我想我可以将其放入一些代码中以查看其工作原理。
David Young

很好的配方。我将使用这个。你从哪里得到的?还是您自己获得的?
琪(Riki)

抱歉,响应延迟,我隐约记得受Blitz3D演示之一的代码启发,但我不记得是哪一个。
earok,2011年

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。


我认为我也必须进行检查,但是似乎没有检查就可以了。
Xavura
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.