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