InputKeyboard.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using Microsoft.Xna.Framework.Input;
  2. using System.Linq;
  3. namespace OpenVIII
  4. {
  5. public class InputKeyboard : Input2
  6. {
  7. #region Fields
  8. private static KeyboardState last_state;
  9. private static KeyboardState state;
  10. #endregion Fields
  11. #region Constructors
  12. public InputKeyboard(bool skip = true) : base(skip)
  13. {
  14. }
  15. #endregion Constructors
  16. #region Properties
  17. protected static KeyboardState Last_State => last_state;
  18. public static KeyboardState State
  19. {
  20. get => state; protected set
  21. {
  22. last_state = state;
  23. state = value;
  24. }
  25. }
  26. #endregion Properties
  27. #region Methods
  28. public override bool ButtonTriggered(InputButton test, ButtonTrigger trigger = ButtonTrigger.None)
  29. {
  30. if (test != null && test.Key != Keys.None &&
  31. (state.GetPressedKeys().Contains(test.Key) || last_state.GetPressedKeys().Contains(test.Key)))
  32. {
  33. var combotest = false;
  34. if (test.Combo != null)
  35. {
  36. foreach (var item in test.Combo)
  37. {
  38. item.Trigger = ButtonTrigger.Press;
  39. if (!base.ButtonTriggered(item))
  40. {
  41. return false;
  42. }
  43. }
  44. combotest = true;
  45. }
  46. var triggertest = trigger.HasFlag(ButtonTrigger.Force) ? trigger : (test.Trigger | trigger);
  47. return ((test.Combo == null || combotest) &&
  48. ((triggertest & ButtonTrigger.OnPress) != 0 && OnPress(test.Key)) ||
  49. ((triggertest & ButtonTrigger.OnRelease) != 0 && OnRelease(test.Key)) ||
  50. ((triggertest & ButtonTrigger.Press) != 0 && Press(test.Key)));
  51. }
  52. return false;
  53. }
  54. protected override bool UpdateOnce()
  55. {
  56. State = Microsoft.Xna.Framework.Input.Keyboard.GetState();
  57. return false;
  58. }
  59. private bool OnPress(Keys k) => Press(k) && last_state.IsKeyUp(k);
  60. private bool OnRelease(Keys k) => !OnPress(k);
  61. private bool Press(Keys k)
  62. {
  63. if (state.IsKeyDown(k))
  64. return true;
  65. return false;
  66. }
  67. #endregion Methods
  68. }
  69. }