InputComponent.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // InputComponent.cs
  4. //
  5. // Microsoft XNA Community Game Platform
  6. // Copyright (C) Microsoft Corporation. All rights reserved.
  7. //-----------------------------------------------------------------------------
  8. #endregion
  9. #region Using Statements
  10. using System;
  11. using System.Collections.Generic;
  12. using Microsoft.Xna.Framework;
  13. using Microsoft.Xna.Framework.Input;
  14. #endregion
  15. namespace RobotGameData.Input
  16. {
  17. #region Input Key enum
  18. /// <summary>
  19. /// Buttons of an Xbox 360 Controller
  20. /// </summary>
  21. public enum ControlPad
  22. {
  23. None = 0,
  24. Start,
  25. Back,
  26. A,
  27. B,
  28. X,
  29. Y,
  30. LeftShoulder,
  31. LeftStick,
  32. LeftTrigger,
  33. LeftThumbStickUp,
  34. LeftThumbStickDown,
  35. LeftThumbStickLeft,
  36. LeftThumbStickRight,
  37. RightShoulder,
  38. RightStick,
  39. RightTrigger,
  40. RightThumbStickUp,
  41. RightThumbStickDown,
  42. RightThumbStickLeft,
  43. RightThumbStickRight,
  44. LeftPad,
  45. RightPad,
  46. UpPad,
  47. DownPad,
  48. Count
  49. }
  50. /// <summary>
  51. /// Triggers of the Xbox360 Controller
  52. /// </summary>
  53. public enum Trigger
  54. {
  55. Left = 0,
  56. Right = 1,
  57. Count
  58. }
  59. #endregion
  60. /// <summary>
  61. /// It receives inputs from users, depending on their devices.
  62. /// It supports a keyboard and an Xbox 360 Controller devices and
  63. /// recognizes the input device’s key press state, key release state,
  64. /// and key stroke state.
  65. /// </summary>
  66. public class InputComponent
  67. {
  68. #region Fields
  69. private PlayerIndex playerIndex;
  70. private KeyboardState keyboardState;
  71. private KeyboardState oldKeyboardState;
  72. private KeyboardState emptyKeyboardState;
  73. private GamePadState gamePadState;
  74. private GamePadState oldGamePadState;
  75. private GamePadState emptyGamePadState;
  76. private float[] triggers = new float[(int) Trigger.Count];
  77. private float[] oldTriggers = new float[(int)Trigger.Count];
  78. private Vector2[] thumbStick = new Vector2[(int)Trigger.Count];
  79. private Vector2[] oldThumbStick = new Vector2[(int)Trigger.Count];
  80. private float[] vibrationAmount = new float[(int)Trigger.Count];
  81. private TimeSpan vibrationDurationAccTime = TimeSpan.Zero;
  82. private TimeSpan vibrationDuration = TimeSpan.Zero;
  83. #endregion
  84. #region Properties
  85. public PlayerIndex PlayerIndex
  86. {
  87. get { return playerIndex; }
  88. }
  89. public float[] Triggers
  90. {
  91. get { return triggers; }
  92. }
  93. public Vector2[] ThumbStick
  94. {
  95. get { return thumbStick; }
  96. }
  97. public float[] VibrationAmount
  98. {
  99. get { return vibrationAmount; }
  100. }
  101. public bool IsConnectedControlPad
  102. {
  103. get { return gamePadState.IsConnected; }
  104. }
  105. #endregion
  106. /// <summary>
  107. /// Constructor.
  108. /// </summary>
  109. /// <param name="idx">player index</param>
  110. public InputComponent(PlayerIndex idx)
  111. {
  112. playerIndex = idx;
  113. }
  114. /// <summary>
  115. /// Initialize members
  116. /// </summary>
  117. public void Initialize()
  118. {
  119. // Save the empty state
  120. emptyKeyboardState = Keyboard.GetState();
  121. emptyGamePadState = GamePad.GetState(playerIndex);
  122. }
  123. /// <summary>
  124. /// Process vibration of an Xbox 360 Controller
  125. /// </summary>
  126. /// <param name="gameTime"></param>
  127. public void Update(GameTime gameTime)
  128. {
  129. // GamePad vibrate
  130. if (vibrationDurationAccTime < vibrationDuration)
  131. {
  132. vibrationDurationAccTime += gameTime.ElapsedGameTime;
  133. GamePad.SetVibration(PlayerIndex,
  134. VibrationAmount[(int)Trigger.Left],
  135. VibrationAmount[(int)Trigger.Right]);
  136. }
  137. else if (vibrationDurationAccTime >= vibrationDuration)
  138. {
  139. // Reset
  140. vibrationDurationAccTime = TimeSpan.Zero;
  141. vibrationDuration = TimeSpan.Zero;
  142. GamePad.SetVibration(PlayerIndex, 0.0f, 0.0f);
  143. }
  144. }
  145. /// <summary>
  146. /// It gets executed before the input processing.
  147. /// It stores the current input state.
  148. /// </summary>
  149. public void PreUpdate()
  150. {
  151. // Check keyboard state
  152. keyboardState = Keyboard.GetState();
  153. // Check GamePad state
  154. gamePadState = GamePad.GetState(playerIndex);
  155. // Check GamePad Tiggers amount
  156. Triggers[(int)Trigger.Left] = gamePadState.Triggers.Left;
  157. Triggers[(int)Trigger.Right] = gamePadState.Triggers.Right;
  158. // Check GamePad ThumbStick amount
  159. thumbStick[(int)Trigger.Left] = gamePadState.ThumbSticks.Left;
  160. thumbStick[(int)Trigger.Right] = gamePadState.ThumbSticks.Right;
  161. }
  162. /// <summary>
  163. /// It gets executed after the input processing.
  164. /// It stores the current input state to compare at the next frame.
  165. /// </summary>
  166. public void PostUpdate()
  167. {
  168. // Store key state to old state.
  169. oldKeyboardState = keyboardState;
  170. oldGamePadState = gamePadState;
  171. oldTriggers[(int)Trigger.Left] = Triggers[(int)Trigger.Left];
  172. oldTriggers[(int)Trigger.Right] = Triggers[(int)Trigger.Right];
  173. oldThumbStick[(int)Trigger.Left] = thumbStick[(int)Trigger.Left];
  174. oldThumbStick[(int)Trigger.Right] = thumbStick[(int)Trigger.Right];
  175. }
  176. /// <summary>
  177. /// Reset the input state.
  178. /// </summary>
  179. public void Reset()
  180. {
  181. // all key state reset
  182. keyboardState = oldKeyboardState = emptyKeyboardState;
  183. gamePadState = oldGamePadState = emptyGamePadState;
  184. vibrationDurationAccTime = TimeSpan.Zero;
  185. vibrationDuration = TimeSpan.Zero;
  186. // Stop the vibration
  187. GamePad.SetVibration(PlayerIndex, 0.0f, 0.0f);
  188. }
  189. /// <summary>
  190. /// checks whether the specified button of a keyboard is pressed.
  191. /// </summary>
  192. /// <param name="key">input key</param>
  193. public bool IsPressKey(Keys key)
  194. {
  195. return keyboardState.IsKeyDown(key);
  196. }
  197. /// <summary>
  198. /// checks whether the specified button of a keyboard is released.
  199. /// </summary>
  200. /// <param name="key">input key</param>
  201. public bool IsReleaseKey(Keys key)
  202. {
  203. return keyboardState.IsKeyUp(key);
  204. }
  205. /// <summary>
  206. /// checks whether the specified button of a keyboard is pressed once
  207. /// for this frame.
  208. /// </summary>
  209. /// <param name="key">input key</param>
  210. public bool IsStrokeKey(Keys key)
  211. {
  212. // check stroke keyboard keys
  213. return (!oldKeyboardState.IsKeyDown(key) && IsPressKey(key));
  214. }
  215. /// <summary>
  216. /// checks whether the specified button of an Xbox 360 controller is pressed.
  217. /// </summary>
  218. /// <param name="pad">Button of the Xbox 360 controller</param>
  219. public bool IsPressControlPad(ControlPad pad)
  220. {
  221. return IsControlPadState(gamePadState, pad, ButtonState.Pressed);
  222. }
  223. /// <summary>
  224. /// checks whether the specified button of an Xbox 360 controller is released.
  225. /// </summary>
  226. /// <param name="pad">Button of the Xbox 360 controller</param>
  227. public bool IsReleaseControlPad(ControlPad pad)
  228. {
  229. return IsControlPadState(gamePadState, pad, ButtonState.Released);
  230. }
  231. /// <summary>
  232. /// checks whether the specified button of an Xbox 360 controller
  233. /// is pressed once for this frame.
  234. /// </summary>
  235. /// <param name="pad">Button of the Xbox 360 controller</param>
  236. public bool IsStrokeControlPad(ControlPad pad)
  237. {
  238. switch (pad)
  239. {
  240. case ControlPad.LeftThumbStickUp:
  241. return IsStrokeThumbStickUp(Trigger.Left);
  242. case ControlPad.LeftThumbStickDown:
  243. return IsStrokeThumbStickDown(Trigger.Left);
  244. case ControlPad.LeftThumbStickLeft:
  245. return IsStrokeThumbStickLeft(Trigger.Left);
  246. case ControlPad.LeftThumbStickRight:
  247. return IsStrokeThumbStickRight(Trigger.Left);
  248. case ControlPad.RightThumbStickUp:
  249. return IsStrokeThumbStickUp(Trigger.Right);
  250. case ControlPad.RightThumbStickDown:
  251. return IsStrokeThumbStickDown(Trigger.Right);
  252. case ControlPad.RightThumbStickLeft:
  253. return IsStrokeThumbStickLeft(Trigger.Right);
  254. case ControlPad.RightThumbStickRight:
  255. return IsStrokeThumbStickRight(Trigger.Right);
  256. case ControlPad.LeftTrigger:
  257. return IsStrokeTriggers(Trigger.Left);
  258. case ControlPad.RightTrigger:
  259. return IsStrokeTriggers(Trigger.Right);
  260. };
  261. // check stroke GamePad buttons
  262. return (!IsControlPadState(oldGamePadState, pad, ButtonState.Pressed) &&
  263. IsPressControlPad(pad));
  264. }
  265. /// <summary>
  266. /// checks whether the specified trigger of an Xbox 360 controller
  267. /// is pressed once for this frame.
  268. /// </summary>
  269. /// <param name="index">Thumb stick of the Xbox 360 controller</param>
  270. public bool IsStrokeControlPadTriggers(Trigger index)
  271. {
  272. return (Triggers[(int)index] > 0.0f && oldTriggers[(int)index] <= 0.0f);
  273. }
  274. public bool IsStrokeThumbStickUp(Trigger index)
  275. {
  276. return (ThumbStick[(int)index].Y > 0.0f &&
  277. oldThumbStick[(int)index].Y <= 0.0f);
  278. }
  279. public bool IsStrokeThumbStickDown(Trigger index)
  280. {
  281. return (ThumbStick[(int)index].Y < 0.0f &&
  282. oldThumbStick[(int)index].Y >= 0.0f);
  283. }
  284. public bool IsStrokeThumbStickLeft(Trigger index)
  285. {
  286. return (ThumbStick[(int)index].X < 0.0f &&
  287. oldThumbStick[(int)index].X >= 0.0f);
  288. }
  289. public bool IsStrokeThumbStickRight(Trigger index)
  290. {
  291. return (ThumbStick[(int)index].X > 0.0f &&
  292. oldThumbStick[(int)index].X <= 0.0f);
  293. }
  294. public bool IsStrokeTriggers(Trigger index)
  295. {
  296. return (Triggers[(int)index] > 0.0f &&
  297. oldTriggers[(int)index] <= 0.0f);
  298. }
  299. /// <summary>
  300. /// Set the vibration of an Xbox 360 controller
  301. /// </summary>
  302. /// <param name="duration">Vibration duration time</param>
  303. /// <param name="leftAmount">Left vibration amount</param>
  304. /// <param name="rightAmount">Right vibration amount</param>
  305. public void SetGamePadVibration(float duration, float leftAmount,
  306. float rightAmount)
  307. {
  308. leftAmount = MathHelper.Clamp(leftAmount, 0.0f, 1.0f);
  309. rightAmount = MathHelper.Clamp(rightAmount, 0.0f, 1.0f);
  310. vibrationDuration = TimeSpan.FromSeconds(duration);
  311. vibrationAmount[(int)Trigger.Left] = leftAmount;
  312. vibrationAmount[(int)Trigger.Right] = rightAmount;
  313. }
  314. /// <summary>
  315. /// returns the number of which the trigger of an Xbox 360 controller
  316. /// has been pressed.
  317. /// </summary>
  318. /// <returns>Pressing amount</returns>
  319. public float GetGamePadTriggers( Trigger index)
  320. {
  321. return Triggers[(int)index];
  322. }
  323. /// <summary>
  324. /// returns the value of the angle which the thumb stick of an
  325. /// Xbox 360 controller has been pressed.
  326. /// </summary>
  327. /// <param name="index"></param>
  328. /// <returns></returns>
  329. public Vector2 GetThumbStickAmount(Trigger index)
  330. {
  331. return ThumbStick[(int)index];
  332. }
  333. /// <summary>
  334. /// compares the input state of the Xbox 360 controller.
  335. /// </summary>
  336. /// <param name="GamePadState">target input state</param>
  337. /// <param name="pad">Button of the Xbox 360 Controller</param>
  338. /// <param name="state">target button state</param>
  339. /// <returns></returns>
  340. private bool IsControlPadState(GamePadState targetGamePadState, ControlPad pad,
  341. ButtonState state)
  342. {
  343. switch (pad)
  344. {
  345. case ControlPad.Start:
  346. return (targetGamePadState.Buttons.Start == state);
  347. case ControlPad.Back:
  348. return (targetGamePadState.Buttons.Back == state);
  349. case ControlPad.A:
  350. return (targetGamePadState.Buttons.A == state);
  351. case ControlPad.B:
  352. return (targetGamePadState.Buttons.B == state);
  353. case ControlPad.X:
  354. return (targetGamePadState.Buttons.X == state);
  355. case ControlPad.Y:
  356. return (targetGamePadState.Buttons.Y == state);
  357. case ControlPad.LeftShoulder:
  358. return (targetGamePadState.Buttons.LeftShoulder == state);
  359. case ControlPad.LeftStick:
  360. return (targetGamePadState.Buttons.LeftStick == state);
  361. case ControlPad.RightShoulder:
  362. return (targetGamePadState.Buttons.RightShoulder == state);
  363. case ControlPad.RightStick:
  364. return (targetGamePadState.Buttons.RightStick == state);
  365. case ControlPad.LeftPad:
  366. return (targetGamePadState.DPad.Left == state);
  367. case ControlPad.RightPad:
  368. return (targetGamePadState.DPad.Right == state);
  369. case ControlPad.UpPad:
  370. return (targetGamePadState.DPad.Up == state);
  371. case ControlPad.DownPad:
  372. return (targetGamePadState.DPad.Down == state);
  373. case ControlPad.LeftTrigger:
  374. {
  375. if (state == ButtonState.Pressed)
  376. return (GetGamePadTriggers(Trigger.Left) > 0.0f);
  377. else if (state == ButtonState.Released)
  378. return (GetGamePadTriggers(Trigger.Left) == 0.0f);
  379. return false;
  380. }
  381. case ControlPad.RightTrigger:
  382. {
  383. if (state == ButtonState.Pressed)
  384. return (GetGamePadTriggers(Trigger.Right) > 0.0f);
  385. else if (state == ButtonState.Released)
  386. return (GetGamePadTriggers(Trigger.Right) == 0.0f);
  387. return false;
  388. }
  389. case ControlPad.LeftThumbStickUp:
  390. {
  391. if (state == ButtonState.Pressed)
  392. return (GetThumbStickAmount(Trigger.Left).Y > 0.0f);
  393. else if (state == ButtonState.Released)
  394. return (GetThumbStickAmount(Trigger.Left).Y == 0.0f);
  395. return false;
  396. }
  397. case ControlPad.LeftThumbStickDown:
  398. {
  399. if (state == ButtonState.Pressed)
  400. return (GetThumbStickAmount(Trigger.Left).Y < 0.0f);
  401. else if (state == ButtonState.Released)
  402. return (GetThumbStickAmount(Trigger.Left).Y == 0.0f);
  403. return false;
  404. }
  405. case ControlPad.LeftThumbStickLeft:
  406. {
  407. if (state == ButtonState.Pressed)
  408. return (GetThumbStickAmount(Trigger.Left).X < 0.0f);
  409. else if (state == ButtonState.Released)
  410. return (GetThumbStickAmount(Trigger.Left).X == 0.0f);
  411. return false;
  412. }
  413. case ControlPad.LeftThumbStickRight:
  414. {
  415. if (state == ButtonState.Pressed)
  416. return (GetThumbStickAmount(Trigger.Left).X > 0.0f);
  417. else if (state == ButtonState.Released)
  418. return (GetThumbStickAmount(Trigger.Left).X == 0.0f);
  419. return false;
  420. }
  421. case ControlPad.RightThumbStickUp:
  422. {
  423. if (state == ButtonState.Pressed)
  424. return (GetThumbStickAmount(Trigger.Right).Y > 0.0f);
  425. else if (state == ButtonState.Released)
  426. return (GetThumbStickAmount(Trigger.Right).Y == 0.0f);
  427. return false;
  428. }
  429. case ControlPad.RightThumbStickDown:
  430. {
  431. if (state == ButtonState.Pressed)
  432. return (GetThumbStickAmount(Trigger.Right).Y < 0.0f);
  433. else if (state == ButtonState.Released)
  434. return (GetThumbStickAmount(Trigger.Right).Y == 0.0f);
  435. return false;
  436. }
  437. case ControlPad.RightThumbStickLeft:
  438. {
  439. if (state == ButtonState.Pressed)
  440. return (GetThumbStickAmount(Trigger.Right).X < 0.0f);
  441. else if (state == ButtonState.Released)
  442. return (GetThumbStickAmount(Trigger.Right).Y == 0.0f);
  443. return false;
  444. }
  445. case ControlPad.RightThumbStickRight:
  446. {
  447. if (state == ButtonState.Pressed)
  448. return (GetThumbStickAmount(Trigger.Right).X > 0.0f);
  449. else if (state == ButtonState.Released)
  450. return (GetThumbStickAmount(Trigger.Right).Y == 0.0f);
  451. return false;
  452. }
  453. default: return false;
  454. }
  455. }
  456. }
  457. }