All pastes #503873 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-05-23 02:11 UTC
rendered paste body
    [Flags]
    public enum GamePadControls : uint
    {
        None = 0,
        X = 0x00000001,
        Y = 0x00000002,
        A = 0x00000004,
        B = 0x00000008,
        RightStick = 0x00000010,
        LeftStick = 0x00000020,
        Start = 0x00000040,
        Back = 0x00000080,
        Up = 0x00000100,
        Down = 0x00000200,
        Left = 0x00000400,
        Right = 0x00000800,
        RightShoulder = 0x00001000,
        LeftShoulder = 0x00002000,

        AnalogLeftShoulder = 0x00004000,
        AnalogRightShoulder = 0x00008000,

        AnalogLeftStickLeft = 0x00010000,
        AnalogLeftStickRight = 0x00020000,
        AnalogLeftStickUp = 0x00040000,
        AnalogLeftStickDown = 0x00080000,

        AnalogRightStickLeft = 0x00100000,
        AnalogRightStickRight = 0x00200000,
        AnalogRightStickUp = 0x00400000,
        AnalogRightStickDown = 0x00800000,

        AllAnalogs = 0x00FFC000,
    }

/* */

        public static GamePadControls GetActiveControls(GamePadState gpdState)
        {
            GamePadButtons btns = gpdState.Buttons;
            Vector2 thumbleft = gpdState.ThumbSticks.Left;
            Vector2 thumbright = gpdState.ThumbSticks.Right;
            GamePadTriggers trigs = gpdState.Triggers;
            GamePadDPad dpad = gpdState.DPad;
            GamePadControls retval = GamePadControls.None;

            // Set button flags.
            // ButtonState is an enum with two values: Released = 0, Pressed = 1
            // Hence, taking that as a uint and shifting left to the proper
            // flag bit and ORing the flag variable with the result will either
            // set the correct flag if the button is pressed,
            // or do nothing if the button isn't pressed.
            retval |= (GamePadControls)((uint)btns.X);
            retval |= (GamePadControls)((uint)btns.Y << 1);
            retval |= (GamePadControls)((uint)btns.A << 2);
            retval |= (GamePadControls)((uint)btns.B << 3);
            retval |= (GamePadControls)((uint)btns.RightStick << 4);
            retval |= (GamePadControls)((uint)btns.LeftStick << 5);
            retval |= (GamePadControls)((uint)btns.Start << 6);
            retval |= (GamePadControls)((uint)btns.Back << 7);
            retval |= (GamePadControls)((uint)dpad.Up << 8);
            retval |= (GamePadControls)((uint)dpad.Down << 9);
            retval |= (GamePadControls)((uint)dpad.Left << 10);
            retval |= (GamePadControls)((uint)dpad.Right << 11);
            retval |= (GamePadControls)((uint)btns.RightShoulder << 12);
            retval |= (GamePadControls)((uint)btns.LeftShoulder << 13);

            // For analog controls, a comparison is required,
            // after which the result (1 or 0) can be shifted
            // in the manner described above to set (or not set) the correct flag.
            retval |= (GamePadControls)((trigs.Left > DeadZone ? 1u : 0u) << 14);
            retval |= (GamePadControls)((trigs.Right > DeadZone ? 1u : 0u) << 15);
            retval |= (GamePadControls)((thumbleft.X < -DeadZone ? 1u : 0u) << 16);
            retval |= (GamePadControls)((thumbleft.X > DeadZone ? 1u : 0u) << 17);
            retval |= (GamePadControls)((thumbleft.Y < -DeadZone ? 1u : 0u) << 18);
            retval |= (GamePadControls)((thumbleft.Y > DeadZone ? 1u : 0u) << 19);
            retval |= (GamePadControls)((thumbright.X < -DeadZone ? 1u : 0u) << 20);
            retval |= (GamePadControls)((thumbright.X > DeadZone ? 1u : 0u) << 21);
            retval |= (GamePadControls)((thumbright.Y < -DeadZone ? 1u : 0u) << 22);
            retval |= (GamePadControls)((thumbright.Y > DeadZone ? 1u : 0u) << 23);

            return retval;
        }