private void UpdatePosition(float elapsedMilliseconds)
{
float accelFactor = (0.0007f * (float)RotationalSpeed) + (0.00001f * (float)Math.Sqrt(TotalMass));
// zero acceleration
Acceleration.X = 0f;
Acceleration.Y = 0f;
if (Input.KeyboardState[Microsoft.Xna.Framework.Input.Keys.Left] == Microsoft.Xna.Framework.Input.KeyState.Down
|| Input.KeyboardState[Microsoft.Xna.Framework.Input.Keys.A] == Microsoft.Xna.Framework.Input.KeyState.Down)
{
Acceleration.X = Acceleration.X - accelFactor;
}
if (Input.KeyboardState[Microsoft.Xna.Framework.Input.Keys.Right] == Microsoft.Xna.Framework.Input.KeyState.Down
|| Input.KeyboardState[Microsoft.Xna.Framework.Input.Keys.D] == Microsoft.Xna.Framework.Input.KeyState.Down)
{
Acceleration.X = Acceleration.X + accelFactor;
}
if (Input.KeyboardState[Microsoft.Xna.Framework.Input.Keys.Up] == Microsoft.Xna.Framework.Input.KeyState.Down
|| Input.KeyboardState[Microsoft.Xna.Framework.Input.Keys.W] == Microsoft.Xna.Framework.Input.KeyState.Down)
{
Acceleration.Y = Acceleration.Y - accelFactor;
}
if (Input.KeyboardState[Microsoft.Xna.Framework.Input.Keys.Down] == Microsoft.Xna.Framework.Input.KeyState.Down
|| Input.KeyboardState[Microsoft.Xna.Framework.Input.Keys.S] == Microsoft.Xna.Framework.Input.KeyState.Down)
{
Acceleration.Y = Acceleration.Y + accelFactor;
}
//Check for control from game pad
if (Input.GamePadConnected)
{
Acceleration.X = Acceleration.X + Input.GamePadState.ThumbSticks.Left.X * accelFactor;
Acceleration.Y = Acceleration.Y - Input.GamePadState.ThumbSticks.Left.Y * accelFactor;
}
// keep acceleration to max
float maxAccel = 1f;
if (Acceleration.Length() > maxAccel)
{
Acceleration.Normalize();
Acceleration = Acceleration * maxAccel;
}
// decelerate
float decelFactor = 0.05f;
Vector2 decel = Velocity * decelFactor * elapsedMilliseconds;
if (decel.Length() > Velocity.Length())
{
Velocity.X = 0f;
Velocity.Y = 0f;
}
else
{
Velocity = Velocity - decel;
}
// accelerate
Velocity = Velocity + Acceleration * elapsedMilliseconds;
// limit maximum velocity
float maxVelocity = 100f;
if (Velocity.Length() > maxVelocity)
{
Velocity.Normalize();
Velocity = Velocity * maxVelocity;
}
// move
Position = Position + Velocity * elapsedMilliseconds;
// keep in bounds
if (Position.X < 0f)
Position.X = 0f;
if (Position.X > (float)ParentLevel.levelWidthSize())
Position.X = (float)ParentLevel.levelWidthSize();
if (Position.Y < 0f)
Position.Y = 0f;
if (Position.Y > (float)ParentLevel.levelHeightSize())
Position.Y = (float)ParentLevel.levelHeightSize();
}