Mercurial > skaapsteker
changeset 270:e47efa33903b
Fixed key sequence handling.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Fri, 08 Apr 2011 17:13:25 +0200 |
parents | c24588c7ba09 |
children | 56a529a69e97 |
files | skaapsteker/levelscene.py |
diffstat | 1 files changed, 40 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/skaapsteker/levelscene.py Fri Apr 08 15:56:37 2011 +0200 +++ b/skaapsteker/levelscene.py Fri Apr 08 17:13:25 2011 +0200 @@ -175,45 +175,65 @@ cr.center = self._player.collide_rect.move(0, -level.TILE_SIZE[0]).midbottom cr.clamp_ip(lr) + + def _detect_key_sequence(self, ev): + if ev.key not in self._fast_key_map: + self._key_sequence = [] + return False + + print ev + + if ev.type is KEYUP: + if (not self._key_sequence + or ev.key != self._key_sequence[-1] + or (time.time() - self._last_keydown_time) > constants.DOUBLE_TAP_TIME): + self._key_sequence = [] + return False + self._last_keyup_time = time.time() + return False + + if ev.type is KEYDOWN: + if self._last_keyup_time is None or (time.time() - self._last_keyup_time) > constants.DOUBLE_TAP_TIME: + self._key_sequence = [] + self._key_sequence.append(ev.key) + self._last_keydown_time = time.time() + for seq in self._key_tap_map: + if seq == tuple(self._key_sequence[-len(seq):]): + self._key_sequence = self._key_sequence[-len(seq):] + return True + return False + + def dispatch(self, ev): if ev.type is KEYDOWN: + if self._player_dead: if ev.key in self._restart_keys: self._restart() elif ev.key in self._quit_keys: self._quit(False) return + if self._dialogue: self._dialogue.dispatch(ev) return + + if self._detect_key_sequence(ev): + print "Detected double-tap:", self._key_sequence + action = self._key_tap_map.get(tuple(self._key_sequence)) + if action is not None: + action() if ev.key in self._fast_key_map: self._fast_keys_down.add(ev.key) action = self._slow_key_map.get(ev.key) if action is not None: action() - self._last_keydown_time = time.time() - if self._last_keyup_time and (time.time() - self._last_keyup_time) < constants.DOUBLE_TAP_TIME: - # Part of a possible sequence - self._last_keys_down.append(ev.key) - self._last_keys_down = self._last_keys_down[-4:] - else: - # Start a new sequence - self._last_keys_down = [ev.key] - if action is not None: - action() + elif ev.type is KEYUP: + self._detect_key_sequence(ev) + if ev.key in self._fast_key_map: self._fast_keys_down.discard(ev.key) - if self._last_keydown_time and self._last_keys_down and time.time() - self._last_keydown_time < constants.DOUBLE_TAP_TIME and ev.key == self._last_keys_down[-1]: - self._last_keyup_time = time.time() - # Still in possible sequence - action = self._key_tap_map.get(tuple(self._last_keys_down)) - if action is not None: - action() - else: - # No longer meet the conditions for a tap sequence - self._last_keys_down = [] - self._last_keyup_time = None elif engine.PlayerDied.matches(ev): self._player_dead = True