示例#1
0
        public override void Update(List <InputEvent> inputEvents)
        {
            var reading = Gamepad.GetCurrentReading();

            ClearButtonStates();

            // Check buttons
            for (int i = 0; i < 14; i++)
            {
                int           mask     = 1 << i;
                GamePadButton button   = buttonMap[(GamepadButtons)mask];
                var           oldState = (state.Buttons & button) != 0;
                var           newState = (reading.Buttons & (GamepadButtons)mask) != 0;
                if (oldState != newState)
                {
                    GamePadButtonEvent buttonEvent = InputEventPool <GamePadButtonEvent> .GetOrCreate(this);

                    buttonEvent.IsDown = newState;
                    buttonEvent.Button = button;
                    inputEvents.Add(buttonEvent);
                    if (state.Update(buttonEvent))
                    {
                        UpdateButtonState(buttonEvent);
                    }
                }
            }
            if (ChangeAxis(0, reading.LeftThumbstickX))
            {
                inputEvents.Add(CreateAxisEvent(GamePadAxis.LeftThumbX, reading.LeftThumbstickX));
            }
            if (ChangeAxis(1, reading.LeftThumbstickY))
            {
                inputEvents.Add(CreateAxisEvent(GamePadAxis.LeftThumbY, reading.LeftThumbstickY));
            }

            if (ChangeAxis(2, reading.RightThumbstickX))
            {
                inputEvents.Add(CreateAxisEvent(GamePadAxis.RightThumbX, reading.RightThumbstickX));
            }
            if (ChangeAxis(3, reading.RightThumbstickY))
            {
                inputEvents.Add(CreateAxisEvent(GamePadAxis.RightThumbY, reading.RightThumbstickY));
            }

            if (ChangeAxis(4, reading.LeftTrigger))
            {
                inputEvents.Add(CreateAxisEvent(GamePadAxis.LeftTrigger, reading.LeftTrigger));
            }
            if (ChangeAxis(5, reading.RightTrigger))
            {
                inputEvents.Add(CreateAxisEvent(GamePadAxis.RightTrigger, reading.RightTrigger));
            }
        }
示例#2
0
 /// <summary>
 /// Updates Pressed/Released/Down collections
 /// </summary>
 protected void UpdateButtonState(GamePadButtonEvent evt)
 {
     if (evt.IsDown && !downButtons.Contains(evt.Button))
     {
         pressedButtons.Add(evt.Button);
         downButtons.Add(evt.Button);
     }
     else if (!evt.IsDown && downButtons.Contains(evt.Button))
     {
         releasedButtons.Add(evt.Button);
         downButtons.Remove(evt.Button);
     }
 }
示例#3
0
        /// <summary>
        /// Updates the state from any gamepad events received that have mapped buttons
        /// </summary>
        /// <param name="buttonEvent">The gamepad event to process</param>
        /// <returns><c>true</c> if the event made any changes</returns>
        public bool Update(GamePadButtonEvent buttonEvent)
        {
            if (buttonEvent.IsDown)
            {
                if ((Buttons & buttonEvent.Button) != 0)
                {
                    return(false);
                }

                Buttons |= buttonEvent.Button; // Set bits
            }
            else
            {
                if ((Buttons & buttonEvent.Button) == 0)
                {
                    return(false);
                }

                Buttons &= ~buttonEvent.Button; // Clear bits
            }

            return(true);
        }
示例#4
0
        /// <summary>
        /// Maps game controller events to gamepad events
        /// </summary>
        /// <returns>The equivalent gamepad event</returns>
        /// <param name="targetDevice">The gamepad that events are mapped to</param>
        /// <param name="sourceDevice">The game controller that is mapped to a gamepad</param>
        /// <param name="controllerEvent">The controller input event as a source</param>
        /// <param name="target">Target list</param>
        public virtual void MapInputEvent(IGamePadDevice targetDevice, IGameControllerDevice sourceDevice, InputEvent controllerEvent, List <InputEvent> target)
        {
            var buttonEvent = controllerEvent as GameControllerButtonEvent;

            if (buttonEvent != null)
            {
                if (buttonEvent.Index < buttonMap.Count &&
                    buttonMap[buttonEvent.Index] != GamePadButton.None)
                {
                    GamePadButtonEvent buttonEvent1 = InputEventPool <GamePadButtonEvent> .GetOrCreate(targetDevice);

                    buttonEvent1.Button = buttonMap[buttonEvent.Index];
                    buttonEvent1.IsDown = buttonEvent.IsDown;
                    target.Add(buttonEvent1);
                }

                if (buttonEvent.Index < buttonsToTriggerMap.Count &&
                    buttonsToTriggerMap[buttonEvent.Index].Axis != GamePadAxis.None)
                {
                    var mappedAxis = buttonsToTriggerMap[buttonEvent.Index];

                    GamePadAxisEvent axisEvent1 = InputEventPool <GamePadAxisEvent> .GetOrCreate(targetDevice);

                    axisEvent1.Axis  = mappedAxis.Axis;
                    axisEvent1.Value = buttonEvent.IsDown ? 1.0f : 0.0f;
                    if (mappedAxis.Invert)
                    {
                        axisEvent1.Value = -axisEvent1.Value;
                    }
                    target.Add(axisEvent1);
                }
            }
            else
            {
                var axisEvent = controllerEvent as GameControllerAxisEvent;
                if (axisEvent != null)
                {
                    if (axisEvent.Index < axisMap.Count &&
                        axisMap[axisEvent.Index].Axis != GamePadAxis.None)
                    {
                        var mappedAxis = axisMap[axisEvent.Index];

                        GamePadAxisEvent axisEvent1 = InputEventPool <GamePadAxisEvent> .GetOrCreate(targetDevice);

                        axisEvent1.Axis = mappedAxis.Axis;
                        if (mappedAxis.Invert)
                        {
                            axisEvent1.Value = -axisEvent.Value;
                        }
                        else
                        {
                            axisEvent1.Value = axisEvent.Value;
                        }
                        if (mappedAxis.Remap)
                        {
                            axisEvent1.Value = (axisEvent1.Value + 1.0f) * 0.5f;
                            if (axisEvent1.Value < 0.0001f)
                            {
                                axisEvent1.Value = 0.0f;
                            }
                        }

                        target.Add(axisEvent1);
                    }
                    if (axisEvent.Index < axisToButtonMap.Count &&
                        axisToButtonMap[axisEvent.Index] != GamePadButton.None)
                    {
                        GamePadButtonEvent buttonEvent1 = InputEventPool <GamePadButtonEvent> .GetOrCreate(targetDevice);

                        buttonEvent1.Button = axisToButtonMap[axisEvent.Index];
                        buttonEvent1.IsDown = axisEvent.Value > 0.5f;
                        target.Add(buttonEvent1);
                    }
                }
                else if (mapFirstPovToPad)
                {
                    var directionEvent = controllerEvent as GameControllerDirectionEvent;
                    if (directionEvent?.Index == 0)
                    {
                        GamePadButton targetButtons = GameControllerUtils.DirectionToButtons(directionEvent.Direction);

                        // Pad buttons down
                        for (int i = 0; i < 4; i++)
                        {
                            int mask = (1 << i);
                            if (((int)targetDevice.State.Buttons & mask) != ((int)targetButtons & mask))
                            {
                                GamePadButtonEvent buttonEvent1 = InputEventPool <GamePadButtonEvent> .GetOrCreate(targetDevice);

                                buttonEvent1.Button = (GamePadButton)mask;
                                buttonEvent1.IsDown = ((int)targetButtons & mask) != 0;
                                target.Add(buttonEvent1);
                            }
                        }
                    }
                }
            }
        }
示例#5
0
        public override void Update(List <InputEvent> inputEvents)
        {
            if ((int)controller.UserIndex != Index)
            {
                SetIndexInternal((int)controller.UserIndex);
            }

            ClearButtonStates();

            if (controller.GetState(out xinputState))
            {
                // DPad/Shoulder/Thumb/Option buttons
                for (int i = 0; i < 16; i++)
                {
                    int mask   = 1 << i;
                    var masked = (int)xinputState.Gamepad.Buttons & mask;
                    if (masked != ((int)state.Buttons & mask))
                    {
                        bool buttonState = (masked != 0);
                        GamePadButtonEvent buttonEvent = InputEventPool <GamePadButtonEvent> .GetOrCreate(this);

                        buttonEvent.IsDown = buttonState;
                        buttonEvent.Button = (GamePadButton)mask; // 1 to 1 mapping with XInput buttons
                        inputEvents.Add(buttonEvent);
                        if (state.Update(buttonEvent))
                        {
                            UpdateButtonState(buttonEvent);
                        }
                    }
                }

                // Axes
                if (ChangeAxis(0, xinputState.Gamepad.LeftThumbX))
                {
                    inputEvents.Add(CreateAxisEvent(GamePadAxis.LeftThumbX, xinputState.Gamepad.LeftThumbX / 32768.0f));
                }
                if (ChangeAxis(1, xinputState.Gamepad.LeftThumbY))
                {
                    inputEvents.Add(CreateAxisEvent(GamePadAxis.LeftThumbY, xinputState.Gamepad.LeftThumbY / 32768.0f));
                }

                if (ChangeAxis(2, xinputState.Gamepad.RightThumbX))
                {
                    inputEvents.Add(CreateAxisEvent(GamePadAxis.RightThumbX, xinputState.Gamepad.RightThumbX / 32768.0f));
                }
                if (ChangeAxis(3, xinputState.Gamepad.RightThumbY))
                {
                    inputEvents.Add(CreateAxisEvent(GamePadAxis.RightThumbY, xinputState.Gamepad.RightThumbY / 32768.0f));
                }

                if (ChangeAxis(4, xinputState.Gamepad.LeftTrigger))
                {
                    inputEvents.Add(CreateAxisEvent(GamePadAxis.LeftTrigger, xinputState.Gamepad.LeftTrigger / 255.0f));
                }
                if (ChangeAxis(5, xinputState.Gamepad.RightTrigger))
                {
                    inputEvents.Add(CreateAxisEvent(GamePadAxis.RightTrigger, xinputState.Gamepad.RightTrigger / 255.0f));
                }
            }

            if (!controller.IsConnected)
            {
                DisconnectAndDispose();
            }
        }