Input.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "Input.h"
  2. #include "Graphics.h" // window
  3. #include "sfwindow.h"
  4. #include <SFML/Window/Keyboard.hpp>
  5. #include <SFML/Window.hpp>
  6. #define INPUT WalrusRPG::Input
  7. using WalrusRPG::Input::Key;
  8. using WalrusRPG::Input::KeyState;
  9. using sf::Keyboard;
  10. struct InputMap
  11. {
  12. Key key;
  13. sf::Keyboard::Key key_code;
  14. sf::Keyboard::Key key_code_alt;
  15. };
  16. KeyState key_states[Key::K_SIZE] = {KeyState::KS_RELEASED};
  17. InputMap key_map[] = {
  18. {Key::K_A, Keyboard::W, Keyboard::Z},
  19. {Key::K_B, Keyboard::X, Keyboard::Unknown},
  20. {Key::K_L, Keyboard::Q, Keyboard::A},
  21. {Key::K_R, Keyboard::S, Keyboard::Unknown},
  22. {Key::K_UP, Keyboard::Up, Keyboard::Unknown},
  23. {Key::K_DOWN, Keyboard::Down, Keyboard::Unknown},
  24. {Key::K_LEFT, Keyboard::Left, Keyboard::Unknown},
  25. {Key::K_RIGHT, Keyboard::Right, Keyboard::Unknown},
  26. {Key::K_START, Keyboard::Return, Keyboard::Unknown},
  27. {Key::K_SELECT, Keyboard::BackSpace, Keyboard::Unknown},
  28. };
  29. void INPUT::key_poll()
  30. {
  31. bool hasFocus = window.hasFocus();
  32. for (unsigned i = 0; i < K_SIZE; i++)
  33. {
  34. bool current_key_state = hasFocus && Keyboard::isKeyPressed(key_map[i].key_code);
  35. KeyState previous_key_state = key_states[i];
  36. KeyState resulting_key_state = KS_RELEASED;
  37. if (current_key_state)
  38. {
  39. if (previous_key_state == KS_RELEASED ||
  40. previous_key_state == KS_JUST_RELEASED)
  41. resulting_key_state = KS_JUST_PRESSED;
  42. else if (previous_key_state == KS_JUST_PRESSED ||
  43. previous_key_state == KS_PRESSED)
  44. resulting_key_state = KS_PRESSED;
  45. }
  46. else
  47. {
  48. if (previous_key_state == KS_PRESSED || previous_key_state == KS_JUST_PRESSED)
  49. resulting_key_state = KS_JUST_RELEASED;
  50. else if (previous_key_state == KS_JUST_RELEASED ||
  51. previous_key_state == KS_RELEASED)
  52. resulting_key_state = KS_RELEASED;
  53. }
  54. key_states[i] = resulting_key_state;
  55. }
  56. }
  57. bool INPUT::key_pressed(Key key)
  58. {
  59. return key_states[key] == KS_JUST_PRESSED;
  60. }
  61. bool INPUT::key_released(Key key)
  62. {
  63. return key_states[key] == KS_JUST_RELEASED;
  64. }
  65. bool INPUT::key_down(Key key)
  66. {
  67. return key_states[key] == KS_JUST_PRESSED || key_states[key] == KS_PRESSED;
  68. }
  69. bool INPUT::key_up(Key key)
  70. {
  71. return key_states[key] == KS_JUST_RELEASED || key_states[key] == KS_RELEASED;
  72. }