Пример #1
0
        public void Update()
        {
            if (!Util.Glfw.JoystickIsGamepad(Index))
            {
                return;
            }

            var buttons = Buttons;

            for (var i = 0; i < buttons.Count; i++)
            {
                if (_cachedButtons.Count <= i)
                {
                    _cachedButtons[i] = default;
                }

                if (buttons[i].Pressed != _cachedButtons[i].Pressed)
                {
                    _cachedButtons[i] = buttons[i];
                    (buttons[i].Pressed ? ButtonDown : ButtonUp)?.Invoke(this, buttons[i]);
                }
            }

            var thumbsticks = Thumbsticks;

            for (var i = 0; i < thumbsticks.Count; i++)
            {
                if (_cachedThumbsticks.Count <= i)
                {
                    _cachedThumbsticks[i] = default;
                }

                if (thumbsticks[i].X != _cachedThumbsticks[i].X || thumbsticks[i].Y != _cachedThumbsticks[i].Y)
                {
                    _cachedThumbsticks[i] = thumbsticks[i];
                    ThumbstickMoved?.Invoke(this, Util.ApplyDeadzone(thumbsticks[i], Deadzone));
                }
            }

            var triggers = Triggers;

            for (var i = 0; i < triggers.Count; i++)
            {
                if (_cachedTriggers.Count <= i)
                {
                    _cachedTriggers[i] = default;
                }

                if (triggers[i].Position != _cachedTriggers[i].Position)
                {
                    _cachedTriggers[i] = triggers[i];
                    TriggerMoved?.Invoke(this, triggers[i]);
                }
            }
        }
Пример #2
0
        public void Update()
        {
            if (!GlfwProvider.GLFW.Value.GetGamepadState(Index, out var state))
            {
                // Detect when this gamepad disconnects
                if (_connected)
                {
                    OnConnectionChanged?.Invoke(this, false);
                    _connected = false;
                }

                return;
            }

            // Detect when this gamepad connects
            if (!_connected)
            {
                OnConnectionChanged?.Invoke(this, true);
                _connected = true;
            }

            // Buttons
            for (var i = 0; i < GamepadButtonCount; i++)
            {
                if ((_buttons[i].Pressed ? 1 : 0) != state.Buttons[i])
                {
                    (_buttons[i].Pressed ? ButtonUp : ButtonDown)?.Invoke
                        (this, _buttons[i] = new Button((ButtonName)i, i, state.Buttons[i] == 1));
                }

                _buttons[i] = new Button((ButtonName)i, i, state.Buttons[i] == 1);
            }

            // Left Thumbstick
            var thumbstick0 = new Thumbstick(0, Deadzone.Apply(state.Axes[0]), Deadzone.Apply(state.Axes[1]));

            if (_thumbsticks[0].X != thumbstick0.X || _thumbsticks[0].Y != thumbstick0.Y)
            {
                ThumbstickMoved?.Invoke
                (
                    this,
                    thumbstick0
                );
            }

            _thumbsticks[0] = thumbstick0;

            // Right Thumbstick
            var thumbstick1 = new Thumbstick(1, Deadzone.Apply(state.Axes[2]), Deadzone.Apply(state.Axes[3]));

            if (_thumbsticks[1].X != thumbstick1.X || _thumbsticks[1].Y != thumbstick1.Y)
            {
                ThumbstickMoved?.Invoke
                (
                    this,
                    thumbstick1
                );
            }

            _thumbsticks[1] = thumbstick1;

            // Left Trigger
            var trigger0 = new Trigger(0, Deadzone.Apply(state.Axes[4]));

            if (_triggers[0].Position != trigger0.Position)
            {
                TriggerMoved?.Invoke(this, trigger0);
            }

            _triggers[0] = trigger0;

            // Right Trigger
            var trigger1 = new Trigger(1, Deadzone.Apply(state.Axes[5]));

            if (_triggers[1].Position != trigger1.Position)
            {
                TriggerMoved?.Invoke(this, trigger1);
            }

            _triggers[1] = trigger1;
        }
Пример #3
0
        public void DoEvent(Event @event)
        {
            switch ((EventType)@event.Type)
            {
            case EventType.Controlleraxismotion:
            {
                switch ((GameControllerAxis)@event.Caxis.Axis)
                {
                case GameControllerAxis.ControllerAxisLeftx:
                {
                    _thumbsticksChanged[0] = true;
                    _thumbsticks[0]        = new Thumbstick
                                                 (0, (float)@event.Caxis.Value / short.MaxValue, _thumbsticks[0].Y);
                    break;
                }

                case GameControllerAxis.ControllerAxisLefty:
                {
                    _thumbsticksChanged[0] = true;
                    _thumbsticks[0]        = new Thumbstick
                                                 (0, _thumbsticks[0].X, (float)@event.Caxis.Value / short.MaxValue);
                    break;
                }

                case GameControllerAxis.ControllerAxisRightx:
                {
                    _thumbsticksChanged[1] = true;
                    _thumbsticks[1]        = new Thumbstick
                                                 (1, (float)@event.Caxis.Value / short.MaxValue, _thumbsticks[1].Y);
                    break;
                }

                case GameControllerAxis.ControllerAxisRighty:
                {
                    _thumbsticksChanged[1] = true;
                    _thumbsticks[1]        = new Thumbstick
                                                 (1, _thumbsticks[1].X, (float)@event.Caxis.Value / short.MaxValue);
                    break;
                }

                case GameControllerAxis.ControllerAxisTriggerleft:
                {
                    TriggerMoved?.Invoke
                        (this, _triggers[0] = new Trigger(0, (float)@event.Caxis.Value / short.MaxValue));
                    break;
                }

                case GameControllerAxis.ControllerAxisTriggerright:
                {
                    TriggerMoved?.Invoke
                        (this, _triggers[1] = new Trigger(1, (float)@event.Caxis.Value / short.MaxValue));
                    break;
                }
                }

                break;
            }

            case EventType.Controllerbuttondown:
            {
                var ogBtn = _buttons[@event.Cbutton.Button];
                ButtonDown?.Invoke
                    (this, _buttons[@event.Cbutton.Button] = new Button(ogBtn.Name, ogBtn.Index, true));
                break;
            }

            case EventType.Controllerbuttonup:
            {
                var ogBtn = _buttons[@event.Cbutton.Button];
                ButtonUp?.Invoke
                    (this, _buttons[@event.Cbutton.Button] = new Button(ogBtn.Name, ogBtn.Index, false));
                break;
            }

            case EventType.Controllerdeviceadded:
            {
                _ctx.ChangeConnection(this, true);
                break;
            }

            case EventType.Controllerdeviceremoved:
            {
                _ctx.ChangeConnection(this, false);
                break;
            }
            }

            for (var i = 0; i < _thumbsticksChanged.Length; i++)
            {
                if (_thumbsticksChanged[i])
                {
                    ThumbstickMoved?.Invoke(this, _thumbsticks[i]);
                    _thumbsticksChanged[i] = false;
                }
            }
        }