Category5.MouseControl.Update C# (CSharp) Method

Update() public method

public Update ( float elapsedMilliseconds ) : void
elapsedMilliseconds float
return void
        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;
            }
        }