Input.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #include "Input.h"
  2. // Constructeur et Destructeur
  3. Input::Input()
  4. : m_x(0), m_y(0), m_xRel(0), m_yRel(0),
  5. m_avancer(SDL_SCANCODE_UP), m_reculer(SDL_SCANCODE_DOWN), m_droite(SDL_SCANCODE_RIGHT), m_gauche(SDL_SCANCODE_LEFT),
  6. m_terminer(false), m_relativeMouse(false), m_window(0), m_windowHalfHeight(0), m_windowHalfWidth(0)
  7. {
  8. // Initialisation du tableau m_touches[]
  9. for(int i(0); i < SDL_NUM_SCANCODES; i++)
  10. m_touches[i] = false;
  11. // Initialisation du tableau m_boutonsSouris[]
  12. for(int i(0); i < 8; i++)
  13. m_boutonsSouris[i] = false;
  14. }
  15. Input::~Input()
  16. {}
  17. // Méthodes
  18. void Input::updateEvenements()
  19. {
  20. // Pour éviter des mouvements fictifs de la souris, on réinitialise les coordonnées relatives
  21. m_xRel = 0;
  22. m_yRel = 0;
  23. // Boucle d'évènements
  24. while(SDL_PollEvent(&m_evenements))
  25. {
  26. // Switch sur le type d'évènement
  27. switch(m_evenements.type)
  28. {
  29. // Cas d'une touche enfoncée
  30. case SDL_KEYDOWN:
  31. m_touches[m_evenements.key.keysym.scancode] = true;
  32. break;
  33. // Cas d'une touche relâchée
  34. case SDL_KEYUP:
  35. m_touches[m_evenements.key.keysym.scancode] = false;
  36. break;
  37. // Cas de pression sur un bouton de la souris
  38. case SDL_MOUSEBUTTONDOWN:
  39. m_boutonsSouris[m_evenements.button.button] = true;
  40. break;
  41. // Cas du relâchement d'un bouton de la souris
  42. case SDL_MOUSEBUTTONUP:
  43. m_boutonsSouris[m_evenements.button.button] = false;
  44. break;
  45. // Cas d'un mouvement de souris
  46. case SDL_MOUSEMOTION:
  47. if (m_relativeMouse)
  48. {
  49. m_xRel = m_evenements.motion.x-m_windowHalfWidth;
  50. m_yRel = m_evenements.motion.y-m_windowHalfHeight;
  51. }
  52. else
  53. {
  54. m_x = m_evenements.motion.x;
  55. m_y = m_evenements.motion.y;
  56. m_xRel = m_evenements.motion.xrel;
  57. m_yRel = m_evenements.motion.yrel;
  58. }
  59. break;
  60. // Cas de la fermeture de la fenêtre
  61. case SDL_WINDOWEVENT:
  62. if(m_evenements.window.event == SDL_WINDOWEVENT_CLOSE)
  63. m_terminer = true;
  64. break;
  65. default:
  66. break;
  67. }
  68. }
  69. // Pour éviter que la souris se barre en mode relative, on la "warp"
  70. if (m_relativeMouse)
  71. SDL_WarpMouseInWindow(m_window,m_windowHalfWidth,m_windowHalfHeight);
  72. }
  73. bool Input::terminer() const
  74. {
  75. return m_terminer;
  76. }
  77. void Input::afficherPointeur(bool reponse) const
  78. {
  79. if(reponse)
  80. SDL_ShowCursor(SDL_ENABLE);
  81. else
  82. SDL_ShowCursor(SDL_DISABLE);
  83. }
  84. void Input::capturerPointeur(bool reponse)
  85. {
  86. m_relativeMouse = reponse;
  87. }
  88. // Getters
  89. bool Input::getTouche(const SDL_Scancode touche) const
  90. {
  91. return m_touches[touche];
  92. }
  93. bool Input::getBoutonSouris(const Uint8 bouton) const
  94. {
  95. return m_boutonsSouris[bouton];
  96. }
  97. bool Input::mouvementSouris() const
  98. {
  99. if(m_xRel == 0 && m_yRel == 0)
  100. return false;
  101. else
  102. return true;
  103. }
  104. // Getters concernant la position du curseur
  105. int Input::getX() const
  106. {
  107. return m_x;
  108. }
  109. int Input::getY() const
  110. {
  111. return m_y;
  112. }
  113. int Input::getXRel() const
  114. {
  115. return m_xRel;
  116. }
  117. int Input::getYRel() const
  118. {
  119. return m_yRel;
  120. }
  121. void Input::setWindow(SDL_Window* activWindow)
  122. {
  123. // Attributio directe
  124. m_window = activWindow;
  125. // Détermination de l'endroit de capture du pointeur
  126. SDL_GetWindowSize(activWindow, &m_windowHalfWidth, &m_windowHalfHeight);
  127. m_windowHalfWidth /= 2;
  128. m_windowHalfHeight /=2;
  129. }
  130. void Input::setMoveKeys(SDL_Scancode avancer, SDL_Scancode reculer, SDL_Scancode droite, SDL_Scancode gauche)
  131. {
  132. m_avancer = avancer;
  133. m_reculer = reculer;
  134. m_droite = droite;
  135. m_gauche = gauche;
  136. }
  137. float Input::getMainXRel() const
  138. {
  139. return (float) m_xRel;
  140. }
  141. float Input::getMainYRel() const
  142. {
  143. return (float) m_yRel;
  144. }
  145. float Input::getMainXMove() const
  146. {
  147. // Avancée de la caméra
  148. if(getTouche(m_avancer))
  149. {
  150. return -1.0;
  151. }
  152. // Recul de la caméra
  153. if(getTouche(m_reculer))
  154. {
  155. return 1.0;
  156. }
  157. // Caméra immobile
  158. return 0.0;
  159. }
  160. float Input::getMainYMove() const
  161. {
  162. // Déplacement vers la gauche
  163. if(getTouche(m_gauche))
  164. {
  165. return -1.0;
  166. }
  167. // Déplacement vers la droite
  168. if(getTouche(m_droite))
  169. {
  170. return 1.0;
  171. }
  172. // Caméra immobile
  173. return 0.0;
  174. }