input_manager.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import logging
  2. import time
  3. import pygame
  4. logger = logging.getLogger(__name__)
  5. class InputManager():
  6. click = 1
  7. swipe = 2
  8. long_click = 3
  9. key = 4
  10. long_click_min_time = 0.3
  11. up = 0
  12. down = 1
  13. left = 2
  14. right = 3
  15. enter = 4
  16. def __init__(self, size):
  17. self.down_pos = (0, 0)
  18. self.up_pos = (0, 0)
  19. self.screen_size = size
  20. self.max_move_margin = self.screen_size[1] / 6
  21. self.min_swipe_move = self.screen_size[1] / 3
  22. self.down_button = -1
  23. self.down_time = -1
  24. self.last_key = -1
  25. def event(self, event):
  26. if event.type == pygame.MOUSEBUTTONUP:
  27. if event.button == 4:
  28. touch_event = InputEvent(InputManager.swipe,
  29. self.down_pos,
  30. self.up_pos, True,
  31. InputManager.up)
  32. return touch_event
  33. elif event.button == 5:
  34. touch_event = InputEvent(InputManager.swipe,
  35. self.down_pos,
  36. self.up_pos, True,
  37. InputManager.down)
  38. return touch_event
  39. elif event.button == 1 and self.down_button == 1:
  40. touch_event = self.mouse_up(event)
  41. return touch_event
  42. elif event.button == 3 and self.down_button == 3:
  43. touch_event = InputEvent(InputManager.long_click,
  44. self.down_pos, self.up_pos,
  45. None, None)
  46. return touch_event
  47. else:
  48. return None
  49. elif event.type == pygame.MOUSEBUTTONDOWN:
  50. self.mouse_down(event)
  51. return None
  52. elif event.type == pygame.KEYDOWN:
  53. self.key_down(event)
  54. return None
  55. elif event.type == pygame.KEYUP:
  56. return self.key_up(event)
  57. def key_down(self, event):
  58. self.last_key = event.key
  59. self.down_time = time.time()
  60. def key_up(self, event):
  61. if self.last_key == event.key:
  62. if self.last_key == pygame.K_DOWN:
  63. direction = InputManager.down
  64. elif self.last_key == pygame.K_UP:
  65. direction = InputManager.up
  66. elif self.last_key == pygame.K_LEFT:
  67. direction = InputManager.left
  68. elif self.last_key == pygame.K_RIGHT:
  69. direction = InputManager.right
  70. elif self.last_key == pygame.K_RETURN:
  71. direction = InputManager.enter
  72. else:
  73. return None
  74. if direction is not None:
  75. return InputEvent(InputManager.key, None, None, None,
  76. direction)
  77. def mouse_down(self, event):
  78. self.down_pos = event.pos
  79. self.down_button = event.button
  80. self.down_time = time.time()
  81. def mouse_up(self, event):
  82. self.up_pos = event.pos
  83. if abs(self.down_pos[0] - self.up_pos[
  84. 0]) < self.max_move_margin:
  85. if abs(self.down_pos[1] - self.up_pos[
  86. 1]) < self.max_move_margin:
  87. if time.time() - InputManager.long_click_min_time > \
  88. self.down_time:
  89. return InputEvent(InputManager.long_click,
  90. self.down_pos,
  91. self.up_pos, None, None)
  92. else:
  93. return InputEvent(InputManager.click,
  94. self.down_pos,
  95. self.up_pos, None, None)
  96. elif abs(self.down_pos[1] - self.up_pos[
  97. 1]) > self.min_swipe_move:
  98. return InputEvent(InputManager.swipe, self.down_pos,
  99. self.up_pos, True, None)
  100. elif self.down_pos[1] - self.up_pos[1] < self.max_move_margin:
  101. if abs(self.down_pos[0] - self.up_pos[0]) > \
  102. self.min_swipe_move:
  103. return InputEvent(InputManager.swipe, self.down_pos,
  104. self.up_pos, False, None)
  105. class InputEvent():
  106. def __init__(self, event_type, down_pos, current_pos, vertical,
  107. direction):
  108. self.type = event_type
  109. self.down_pos = down_pos
  110. self.current_pos = current_pos
  111. if event_type is InputManager.swipe and direction is None:
  112. if vertical:
  113. if self.down_pos[1] < self.current_pos[1]:
  114. self.direction = InputManager.down
  115. else:
  116. self.direction = InputManager.up
  117. else:
  118. if self.down_pos[0] < self.current_pos[0]:
  119. self.direction = InputManager.right
  120. else:
  121. self.direction = InputManager.left
  122. else:
  123. self.direction = direction