From ecee8bc8e2820357fca56975300bf73f492b01e6 Mon Sep 17 00:00:00 2001 From: rcoh Date: Mon, 29 Aug 2011 15:48:37 -0400 Subject: support for holding down keys --- ddrinput.py | 123 +++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 46 deletions(-) diff --git a/ddrinput.py b/ddrinput.py index fa31640..4d77ccc 100644 --- a/ddrinput.py +++ b/ddrinput.py @@ -1,9 +1,12 @@ import pygame +import time JOY_EVENT = 7 +JOY_EVENT_2 = 10 KEY_EVENT = 2 +KEY_RELEASE = 3 X = 0 Y = 1 -(LEFT, RIGHT, UP, DOWN, DROP, DIE) = range(6) +(LEFT, RIGHT, UP, DOWN, DROP, DIE, RELEASE) = range(7) KEY_LEFT = 276 KEY_UP = 273 KEY_DOWN = 274 @@ -36,7 +39,7 @@ class DdrInput(object): #This is just so that we can get key presses in the demo. remove when we plug it into a ui screen = pygame.display.set_mode((640, 480)) self.debug_mode = debug_mode - self.last_inputs = {} + self.active_inputs = {} def init_joysticks(self): pygame.joystick.init() @@ -55,9 +58,41 @@ class DdrInput(object): event = pygame.event.poll() player_move = None if event.type == JOY_EVENT: + player_index, player_move = handle_joy_event(event) + if self.debug_mode: + print (player_index, player_move) + + if self.debug_mode: + if event.type == KEY_EVENT or event.type == KEY_RELEASE: + (player_index, player_move) = self.handle_key_event(event) + + + if player_move != None: + if player_move == RELEASE: + self.active_inputs[player_index] = None + return None + else: + print 'setting active input' + self.active_inputs[player_index] = (.5, time.time(), player_move) + return (player_index, player_move) + else: + for player_index in self.active_inputs: + if self.active_inputs[player_index] != None: + (fallback_start, start_time, move) = self.active_inputs[player_index] + print time.time() - start_time + if time.time() - start_time > fallback_start: + fallback_start /= 2 + fallback_start = max(.1, fallback_start) + start_time = time.time() + self.active_inputs[player_index] = (fallback_start, start_time, move) + return (player_index, move) + return None + + def handle_joy_event(self, event): player_index = event.joy #there may be a tricky quick way to code this, but this is more readable #value == 0 -> released + player_move = None if event.axis == X: if event.value < 0: player_move = LEFT @@ -68,47 +103,43 @@ class DdrInput(object): player_move = DOWN elif event.value < 0: player_move = UP - if self.debug_mode and player_move != None: - print (player_index, player_move) - if player_move != None: - self.last_inputs[player_index][player_move] = 1 - return (player_index, player_move) - else: - return None - if self.debug_mode: - if event.type == KEY_EVENT: - if event.key == KEY_LEFT: - player_index = 1 - player_move = LEFT - elif event.key == KEY_RIGHT: - player_index = 1 - player_move = RIGHT - elif event.key == KEY_DOWN: - player_index = 1 - player_move = DOWN - elif event.key == KEY_UP: - player_index = 1 - player_move = UP - elif event.key == KEY_A: - player_index = 0 - player_move = LEFT - elif event.key == KEY_D: - player_index = 0 - player_move = RIGHT - elif event.key == KEY_S: - player_index = 0 - player_move = DOWN - elif event.key == KEY_W: - player_index = 0 - player_move = UP - elif event.key == KEY_ESC: - player_index = 2 - player_move = DIE - elif event.key == KEY_SPACE: - player_index = 1 - player_move = DROP - - if player_move != None: - return (player_index, player_move) - else: - return None + if event.value == 0: + player_move = RELEASE + + return player_index, player_move + + def handle_key_event(self, event): + if event.key == KEY_LEFT: + player_index = 1 + player_move = LEFT + elif event.key == KEY_RIGHT: + player_index = 1 + player_move = RIGHT + elif event.key == KEY_DOWN: + player_index = 1 + player_move = DOWN + elif event.key == KEY_UP: + player_index = 1 + player_move = UP + elif event.key == KEY_A: + player_index = 0 + player_move = LEFT + elif event.key == KEY_D: + player_index = 0 + player_move = RIGHT + elif event.key == KEY_S: + player_index = 0 + player_move = DOWN + elif event.key == KEY_W: + player_index = 0 + player_move = UP + elif event.key == KEY_ESC: + player_index = 2 + player_move = DIE + elif event.key == KEY_SPACE: + player_index = 1 + player_move = DROP + + if event.type == KEY_RELEASE: + player_move = RELEASE + return (player_index, player_move) -- cgit v1.2.3