2014-09-24 2 views
0

Я пишу космическую игру для Windows Phone в какой-то хорошей прекращенной XNA. Мне нужно, чтобы скорость корабля постепенно уменьшалась, пока он не достигнет нуля, когда пользователь не удерживает кнопку привода. Это звучит просто, но Velocity - это 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

так просто добавить очень маленький вектор, который точно противопоставляет движение судна. –

+1

Если скорость - это вектор, просто добавьте «-величина/коэффициент», где «factor» - это числовое значение, которое масштабирует, как медленно или быстро вы теряете скорость. Как только величина скорости равна нулю, вы перестанете добавлять. – InBetween

+2

А, моя ошибка (это был долгий день ...) Однако вы должны переименовать 'speed' в' acceleration', чтобы добиться большей четкости кода. –

ответ

1

Try разделив скорость:

velocity /= 2f; 
+1

Вы никогда не достигнете нуля! –

+0

Спасибо, помощник! Это сработало :) Я должен подождать 7 минут, чтобы отметить это как ответ, но плохо ждать. – Aido

+0

@OliverCharlesworth Только что протестировано. Требуется 150 итераций, чтобы получить от '1' до' float.Epsilon'. Это 2,5 секунды при скорости 60 кадров в секунду. Но ваше определение «нуля» может быть различным ... – Athari

1

Другой вариант, который может предоставить вам более гладкой и более контролируемой скорости, вы можете использовать линейную интерполяцию:

float rate = 0.5f; 
velocity = Vector2.Lerp(velocity, Vector2.Zero, rate); 
Смежные вопросы