Microsoft.Xna.Framework.Input.GamePadThumbSticks.ApplyDeadZone C# (CSharp) Method

ApplyDeadZone() private method

private ApplyDeadZone ( GamePadDeadZone dz ) : void
dz GamePadDeadZone
return void
        private void ApplyDeadZone(GamePadDeadZone dz)
        {
#if DIRECTX && !WINDOWS_PHONE && !WINDOWS_PHONE81 && !WINDOWS_UAP
            // XInput Xbox 360 Controller dead zones
            // Dead zones are slighty different between left and right sticks, this may come from Microsoft usability tests
            const float leftThumbDeadZone = SharpDX.XInput.Gamepad.LeftThumbDeadZone / (float)short.MaxValue;
            const float rightThumbDeadZone = SharpDX.XInput.Gamepad.RightThumbDeadZone / (float)short.MaxValue;
#elif OUYA
            // OUYA dead zones should
            // They are a bit larger to accomodate OUYA Gamepad (but will also affect Xbox 360 controllers plugged to an OUYA)
            const float leftThumbDeadZone = 0.3f;
            const float rightThumbDeadZone = 0.3f;
#else
            // Default & SDL Xbox 360 Controller dead zones
            // Based on the XInput constants
            const float leftThumbDeadZone = 0.24f;
            const float rightThumbDeadZone = 0.265f;
#endif
            switch (dz)
            {
                case GamePadDeadZone.None:
                    break;
                case GamePadDeadZone.IndependentAxes:
                    if (Math.Abs(left.X) < leftThumbDeadZone)
                        left.X = 0f;
                    if (Math.Abs(left.Y) < leftThumbDeadZone)
                        left.Y = 0f;
                    if (Math.Abs(right.X) < rightThumbDeadZone)
                        right.X = 0f;
                    if (Math.Abs(right.Y) < rightThumbDeadZone)
                        right.Y = 0f;
                    break;
                case GamePadDeadZone.Circular:
                    if (left.LengthSquared() < leftThumbDeadZone * leftThumbDeadZone)
                        left = Vector2.Zero;
                    if (right.LengthSquared() < rightThumbDeadZone * rightThumbDeadZone)
                        right = Vector2.Zero;
                    break;
            }

            // excluding deadZone from the final output range
            if (dz == GamePadDeadZone.IndependentAxes)
            {
                if (left.X < -leftThumbDeadZone)
                     left.X = left.X + leftThumbDeadZone;
                else if (left.X > leftThumbDeadZone)
                    left.X = left.X - leftThumbDeadZone;
                if (left.Y < -leftThumbDeadZone)
                    left.Y = left.Y + leftThumbDeadZone;
                else if (left.Y > leftThumbDeadZone)
                    left.Y = left.Y - leftThumbDeadZone;

                if (right.X < -rightThumbDeadZone)
                    right.X = right.X + rightThumbDeadZone;
                else if (right.X > rightThumbDeadZone)
                    right.X = right.X - rightThumbDeadZone;
                if (right.Y < -rightThumbDeadZone)
                    right.Y = right.Y + rightThumbDeadZone;
                else if (right.Y > rightThumbDeadZone)
                    right.Y = right.Y - rightThumbDeadZone;

                left.X = left.X / (1.0f - leftThumbDeadZone);
                left.Y = left.Y / (1.0f - leftThumbDeadZone);
                right.X = right.X / (1.0f - rightThumbDeadZone);
                right.Y = right.Y / (1.0f - rightThumbDeadZone);
            }
            else if (dz == GamePadDeadZone.Circular)
            {
                if (left.LengthSquared() >= leftThumbDeadZone * leftThumbDeadZone)
                {
                    Vector2 norm = left;
                    norm.Normalize();
                    left = left - norm * leftThumbDeadZone; // excluding deadzone
                    left = left / leftThumbDeadZone; // re-range output
                }
                if (right.LengthSquared() >= rightThumbDeadZone * rightThumbDeadZone)
                {
                    Vector2 norm = right;
                    norm.Normalize();
                    right = right - norm * rightThumbDeadZone;
                    right = right / rightThumbDeadZone;
                }
            }
        }

Usage Example

Exemplo n.º 1
0
        static GamePadState ReadState(PlayerIndex index, GamePadDeadZone deadZone)
        {
            const float DeadZoneSize = 0.27f;
            IntPtr      device       = GetDevice(index);
            PadConfig   c            = GetConfig(index);

            if (device == IntPtr.Zero || c == null)
            {
                return(GamePadState.InitializedState);
            }

            var leftStick             = c.LeftStick.ReadAxisPair(device);
            var rightStick            = c.RightStick.ReadAxisPair(device);
            GamePadThumbSticks sticks = new GamePadThumbSticks(new Vector2(leftStick.X, leftStick.Y), new Vector2(rightStick.X, rightStick.Y));

            sticks.ApplyDeadZone(deadZone, DeadZoneSize);
            GamePadTriggers triggers    = new GamePadTriggers(c.LeftTrigger.ReadFloat(device), c.RightTrigger.ReadFloat(device));
            Buttons         buttonState = ReadButtons(device, c, DeadZoneSize);

            buttonState |= StickToButtons(sticks.Left, Buttons.LeftThumbstickLeft, Buttons.LeftThumbstickRight, Buttons.LeftThumbstickUp, Buttons.LeftThumbstickDown, DeadZoneSize);
            buttonState |= StickToButtons(sticks.Right, Buttons.RightThumbstickLeft, Buttons.RightThumbstickRight, Buttons.RightThumbstickUp, Buttons.RightThumbstickDown, DeadZoneSize);
            buttonState |= TriggerToButton(triggers.Left, Buttons.LeftTrigger, DeadZoneSize);
            buttonState |= TriggerToButton(triggers.Right, Buttons.RightTrigger, DeadZoneSize);
            GamePadButtons buttons = new GamePadButtons(buttonState);
            GamePadDPad    dpad    = new GamePadDPad(buttons.buttons);

            GamePadState g = new GamePadState(sticks, triggers, buttons, dpad);

            return(g);
        }
All Usage Examples Of Microsoft.Xna.Framework.Input.GamePadThumbSticks::ApplyDeadZone