2014-09-24 40 views
0

我正在为Windows Phone编写一个太空游戏,在一些不错的已停用XNA中。我需要船的速度逐渐降低,直到用户没有按住驱动器按钮时为零。这听起来很简单,但速度是一个Vector2,我不知道如何做到这一点。降低我的太空飞船的速度

 position += velocity; 
     speed = 0.04f; 

     switch (driveBtn.CurrentButtonState) 
     { 
      case ControlButton.ButtonState.Released: 
       //Need to slow down ship when drive is not being held. 
       break; 

      case ControlButton.ButtonState.Pressing: 
       velocity.X += (float)Math.Cos(rotation) * speed; 
       velocity.Y += (float)Math.Sin(rotation) * speed; 
       break; 
     } 
+0

所以只加与船舶运动完全相反的非常小的矢量 – 2014-09-24 19:40:38

+1

如果速度是一个矢量,只需添加'-velocity/factor',其中'factor'是数字值,可以缩放或减慢速度。一旦速度的大小为零,你停止添加。 – InBetween 2014-09-24 19:45:06

+2

啊,我的错误(这是漫长的一天......)但是,您应该将'speed'重命名为'acceleration'以实现更高的代码清晰度。 – 2014-09-24 19:49:12

回答

1

请尝试将速度:

velocity /= 2f; 
+1

你永远不会达到零! – 2014-09-24 19:41:51

+0

谢谢队友!这工作:)我必须等待7分钟,以标记这是一个答案,但生病等待。 – Aido 2014-09-24 19:46:27

+0

@OliverCharlesworth刚刚测试过。从'1'到低于'float.Epsilon'需要150次迭代。在60 fps时为2.5秒。但是你的“零”定义可能不同...... – Athari 2014-09-24 19:46:33

1

另一种选择,它可以为你提供更平滑,更可控的速度,你可以使用线性插值:

float rate = 0.5f; 
velocity = Vector2.Lerp(velocity, Vector2.Zero, rate);