[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 (true = 1, false = 0) can be shifted // in the manner described above to set (or not set) the correct flag. retval |= (GamePadControls)((uint)(trigs.Left > DeadZone) << 14); retval |= (GamePadControls)((uint)(trigs.Right > DeadZone) << 15); retval |= (GamePadControls)((uint)(thumbleft.X < -DeadZone) << 16); retval |= (GamePadControls)((uint)(thumbleft.X > DeadZone) << 17); retval |= (GamePadControls)((uint)(thumbleft.Y < -DeadZone) << 18); retval |= (GamePadControls)((uint)(thumbleft.Y > DeadZone) << 19); retval |= (GamePadControls)((uint)(thumbright.X < -DeadZone) << 20); retval |= (GamePadControls)((uint)(thumbright.X > DeadZone) << 21); retval |= (GamePadControls)((uint)(thumbright.Y < -DeadZone) << 22); retval |= (GamePadControls)((uint)(thumbright.Y > DeadZone) << 23); return retval; }