public void Update(float elapsedMilliseconds)
{
RotationalAccelerationFactor = 0.0f;
float rotAccel = 0.0f;
Vector2 currentMouseMovement = new Vector2(Input.CurrentMouseMoveState.XChange, Input.CurrentMouseMoveState.YChange);
MouseMovements.Add(currentMouseMovement);
//Debug.WriteLine("Mouse (dx,dy): " + currentMouseMovement.X.ToString() + "," + currentMouseMovement.Y.ToString());
//Debug.WriteLine("Mouse (dx,dy): " + Input.CurrentMouseMoveState.XChange.ToString() + "," + Input.CurrentMouseMoveState.YChange.ToString());
if (MouseMovements.Count >= 2 && (Math.Abs(currentMouseMovement.X) > 0 || Math.Abs(currentMouseMovement.Y) > 0))
{
// average first two and last two into vetors
//Vector2 firstTwo = MouseMovements[MouseMovements.Count - 1] + MouseMovements[MouseMovements.Count - 2];
//Vector2 lastTwo = MouseMovements[MouseMovements.Count - 3] + MouseMovements[MouseMovements.Count - 4];
Vector2 firstTwo = MouseMovements[MouseMovements.Count - 1];
Vector2 lastTwo = MouseMovements[MouseMovements.Count - 2];
// cut out straight up/down movements
if (Math.Abs(firstTwo.Y) > Math.Abs(firstTwo.X) * 4f)
firstTwo = new Vector2(0f, 0f);
if (Math.Abs(lastTwo.Y) > Math.Abs(lastTwo.X) * 4f)
lastTwo = new Vector2(0f, 0f);
// calculate delta angle
float v1Angle = (float)Math.Atan2(firstTwo.Y, firstTwo.X);
float v2Angle = (float)Math.Atan2(lastTwo.Y, lastTwo.X);
//Console.Write(" v1angle: " + v1Angle.ToString());
//Console.Write(" v2angle: " + v2Angle.ToString());
float deltaAngle = v1Angle - v2Angle;
//Console.Write(" DAngle: " + deltaAngle.ToString());
if (deltaAngle > (float)Math.PI)
deltaAngle = deltaAngle - 2f * (float)Math.PI;
else if (deltaAngle < -(float)Math.PI)
deltaAngle = deltaAngle + 2f * (float)Math.PI;
float desiredAngle = (float)Math.PI / 8f;
// cut unreasonable amounts of angle
if (Math.Abs(deltaAngle) > 2f * Math.Abs(desiredAngle))
deltaAngle = 0.0f;
// get the rotational acceleration
if (deltaAngle <= desiredAngle)
{
// calc how close the delta angle is the to the desired angle
rotAccel = (deltaAngle / desiredAngle) * 0.01f * (firstTwo.Length() + lastTwo.Length());
}
else if (deltaAngle > desiredAngle)
{
// calc how close the delta angle is the to the desired angle
rotAccel = (desiredAngle / deltaAngle) * 0.01f * (firstTwo.Length() + lastTwo.Length());
}
}
rotAccel = -rotAccel;
if (rotAccel < 0.0f)
rotAccel = 0.0f;
// only keep 10 movements
if (MouseMovements.Count > 10)
{
MouseMovements.RemoveAt(0);
}
RotationalAccelerationFactor = rotAccel;
// check for god mode
if (Input.KeysHit.Contains(Microsoft.Xna.Framework.Input.Keys.F6))
{
GodMode = !GodMode;
}
if (GodMode)
{
RotationalAccelerationFactor = 0.08f * elapsedMilliseconds;
}
}