示例#1
0
        public void Press(XINPUT_GAMEPAD_BUTTONS btn, int ticks = 0)
        {
            lock (_outputlock)
            {
                _nextButtons[btn] = ticks;

                // Zero opposite shoulder button
                if (btn == XINPUT_GAMEPAD_BUTTONS.RIGHT_SHOULDER)
                {
                    _nextButtons[XINPUT_GAMEPAD_BUTTONS.LEFT_SHOULDER] = 0;
                }
                else if (btn == XINPUT_GAMEPAD_BUTTONS.LEFT_SHOULDER)
                {
                    _nextButtons[XINPUT_GAMEPAD_BUTTONS.RIGHT_SHOULDER] = 0;
                }
            }
        }
示例#2
0
        private void Controler_ButtonPressed(object sender, XINPUT_GAMEPAD_BUTTONS e)
        {
            switch (e)
            {
            case XINPUT_GAMEPAD_BUTTONS.DPAD_UP:
                Timeline.ResetGameFromSavePointByMenu();
                break;

            case XINPUT_GAMEPAD_BUTTONS.DPAD_DOWN:
                Timeline.UpdateLocationFromMenu();
                break;

            case XINPUT_GAMEPAD_BUTTONS.START:
                MCP.BankHold     = false;
                MCP.HeadingHold  = false;
                MCP.VSHold       = false;
                MCP.AltitudeHold = false;
                MCP.IASHold      = false;
                MCP.LNAV         = false;
                break;

            case XINPUT_GAMEPAD_BUTTONS.BACK:
                if (MCP.BankHold || MCP.HeadingHold || MCP.VSHold || MCP.AltitudeHold || MCP.IASHold | MCP.LNAV)
                {
                    MCP.BankHold     = false;
                    MCP.HeadingHold  = false;
                    MCP.VSHold       = false;
                    MCP.AltitudeHold = false;
                    MCP.IASHold      = false;
                    MCP.LNAV         = false;
                }
                else
                {
                    MCP.AltitudeHold = true;
                    MCP.LNAV         = true;
                    MCP.IASHold      = true;
                }
                break;
            }

            Trace.WriteLine($"Button Pressed: {e}");
        }
示例#3
0
        private bool UpdateState(int controller)
        {
            XINPUT_STATE pState = new XINPUT_STATE();
            UInt32       err    = XInputGetState((UInt32)controller, ref pState);

            if (err != ERROR_SUCCESS)
            {
                return(false);
            }

            if (pState.dwPacketNumber == lastPacketNumber[controller])
            {
                // Controller state hasn't changed since last time
                return(true);
            }

            lastPacketNumber[controller] = pState.dwPacketNumber;

            XINPUT_GAMEPAD_BUTTONS buttons = pState.Gamepad.wButtons;

            // Face buttons
            buttonStates[controller, (int)XInputElement.BTN_A] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_A);
            buttonStates[controller, (int)XInputElement.BTN_B] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_B);
            buttonStates[controller, (int)XInputElement.BTN_X] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_X);
            buttonStates[controller, (int)XInputElement.BTN_Y] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_Y);

            buttonStates[controller, (int)XInputElement.BTN_BACK]  = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_BACK);
            buttonStates[controller, (int)XInputElement.BTN_START] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_START);

            // D-pad
            buttonStates[controller, (int)XInputElement.BTN_DPAD_UP]    = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_UP);
            buttonStates[controller, (int)XInputElement.BTN_DPAD_DOWN]  = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_DOWN);
            buttonStates[controller, (int)XInputElement.BTN_DPAD_LEFT]  = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_LEFT);
            buttonStates[controller, (int)XInputElement.BTN_DPAD_RIGHT] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_RIGHT);

            // Thumb buttons
            buttonStates[controller, (int)XInputElement.BTN_LSTICK] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_LEFT_THUMB);
            buttonStates[controller, (int)XInputElement.BTN_RSTICK] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_RIGHT_THUMB);

            // Shoulder buttons
            buttonStates[controller, (int)XInputElement.BTN_LSHOULDER] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_RIGHT);
            buttonStates[controller, (int)XInputElement.BTN_RSHOULDER] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_RIGHT);

            // Translate analog triggers to buttons
            buttonStates[controller, (int)XInputElement.BTN_LTRIGGER] = pState.Gamepad.bLeftTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
            buttonStates[controller, (int)XInputElement.BTN_RTRIGGER] = pState.Gamepad.bRightTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD;

            // Translate analog sticks to buttons
            Int16 lStickX = pState.Gamepad.sThumbLX;
            Int16 lStickY = pState.Gamepad.sThumbLY;

            if (Math.Sqrt(lStickX * lStickX + lStickY * lStickY) > XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE)
            {
                double angle = Math.Atan2(lStickY, lStickX) + Math.PI;

                buttonStates[controller, (int)XInputElement.BTN_LSTICK_UP]    = (angle >= 3.53429174 && angle <= 5.89048623);
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_DOWN]  = (angle >= 0.39269908 && angle <= 2.74889357);
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_LEFT]  = (angle >= 5.10508806 || angle <= 1.17809725);
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_RIGHT] = (angle >= 1.96349541 && angle <= 4.3196899);
            }
            else
            {
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_UP]    = false;
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_DOWN]  = false;
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_LEFT]  = false;
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_RIGHT] = false;
            }

            Int16 rStickX = pState.Gamepad.sThumbLX;
            Int16 rStickY = pState.Gamepad.sThumbLY;

            if (Math.Sqrt(rStickX * rStickX + rStickY * rStickY) > XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE)
            {
                double angle = Math.Atan2(lStickY, lStickX) + Math.PI;

                buttonStates[controller, (int)XInputElement.BTN_RSTICK_UP]    = (angle >= 3.53429174 && angle <= 5.89048623);
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_DOWN]  = (angle >= 0.39269908 && angle <= 2.74889357);
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_LEFT]  = (angle >= 5.10508806 || angle <= 1.17809725);
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_RIGHT] = (angle >= 1.96349541 && angle <= 4.3196899);
            }
            else
            {
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_UP]    = false;
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_DOWN]  = false;
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_LEFT]  = false;
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_RIGHT] = false;
            }

            return(true);
        }