input_manager.py 5.4 KB

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