aboutsummaryrefslogtreecommitdiff
path: root/source/game/input/GamepadHelper.cs
blob: dfc317530e49a9082b57428e0aae297e56488cca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using Celesteia.Game.Input.Definitions;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;

namespace Celesteia.Game.Input {
    public static class GamepadHelper {
        private static GamePadState _prev;
        private static GamePadState _curr;

        public static void Update() {
            _prev = _curr;
            _curr = GamePad.GetState(0);
        }

        public static bool AnyButton() {
            foreach (Buttons b in Enum.GetValues<Buttons>())
                if (IsDown(b)) return true;

            return false;
        }

        // Was true, now true.
        public static bool Held(Buttons buttons) => _prev.IsButtonDown(buttons) && _curr.IsButtonDown(buttons);
        // Is true.
        public static bool IsDown(Buttons buttons) => _curr.IsButtonDown(buttons);
        // Was false, now true.
        public static bool Pressed(Buttons buttons) => !_prev.IsButtonDown(buttons) && _curr.IsButtonDown(buttons);
        // Was true, now false.
        public static bool Released(Buttons buttons) => _prev.IsButtonDown(buttons) && !_curr.IsButtonDown(buttons);

        public static bool PollButtons(Buttons buttons, InputPollType type) => type switch {
            InputPollType.Held => Held(buttons),
            InputPollType.IsDown => IsDown(buttons),
            InputPollType.Pressed => Pressed(buttons),
            InputPollType.Released => Released(buttons),
            _ => false
        };

        public static float PollSensor(GamePadSensor sensor) => sensor switch {
            GamePadSensor.LeftThumbStickX => _curr.ThumbSticks.Left.X,
            GamePadSensor.LeftThumbStickY => _curr.ThumbSticks.Left.Y,
            GamePadSensor.LeftTrigger => _curr.Triggers.Left,
            GamePadSensor.RightThumbStickX => _curr.ThumbSticks.Right.X,
            GamePadSensor.RightThumbStickY => _curr.ThumbSticks.Right.Y,
            GamePadSensor.RightTrigger => _curr.Triggers.Right,
            _ => 0f
        };
    }

    public enum GamePadSensor {
        LeftThumbStickX,
        LeftThumbStickY,
        LeftTrigger,
        RightThumbStickX,
        RightThumbStickY,
        RightTrigger
    }
}