changeset 265:7628467eecd9

Add double-key tap support
author Neil Muller <drnlmuller@gmail.com>
date Fri, 08 Apr 2011 15:06:24 +0200
parents afd9256ad682
children be516ca5e3b8
files skaapsteker/constants.py skaapsteker/levelscene.py
diffstat 2 files changed, 37 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/skaapsteker/constants.py	Fri Apr 08 14:54:31 2011 +0200
+++ b/skaapsteker/constants.py	Fri Apr 08 15:06:24 2011 +0200
@@ -11,6 +11,10 @@
 
 EPSILON = 1e-10
 
+# Time parameter for double key taps checked.
+# This is for both key down time and for gap between taps
+DOUBLE_TAP_TIME = 0.15
+
 # Layer defination
 class Layers(object):
     BACKGROUND = 0  # Absolute background
--- a/skaapsteker/levelscene.py	Fri Apr 08 14:54:31 2011 +0200
+++ b/skaapsteker/levelscene.py	Fri Apr 08 15:06:24 2011 +0200
@@ -4,11 +4,13 @@
                            K_SEMICOLON, K_UP, K_p, K_q, K_x, K_z, K_RETURN)
 
 import pygame
+import time
 
 from . import options
 from . import engine
 from . import level
 from . import physics
+from . import constants
 from .sprites import player
 from .widgets.text import Text
 from .widgets.bubble import DialogueWidget
@@ -41,7 +43,6 @@
 
         self._build_action_map()
 
-
     def setup_player(self):
         doorway = self._level.doorways[self.game_state.world.player.doorway]
         self._player = player.Player(self.game_state.world, self._soundsystem)
@@ -49,6 +50,10 @@
         self._player.set_image()
         self._player.set_pos(doorway._starting_tile_pos)
 
+        # Double tap stuff
+        self._last_keys_down = []
+        self._last_keydown_time = None
+        self._last_keyup_time = None
 
     def _build_action_map(self):
         action = lambda s: getattr(self._player, 'action_%s' % s)
@@ -76,6 +81,12 @@
             self._slow_key_map[K_z] = action('fire2')
             self._slow_key_map[K_q] = self._quit
 
+        self._key_tap_map = {
+                (K_LEFT, K_LEFT) : action('double_left'),
+                (K_RIGHT, K_RIGHT) : action('double_right'),
+                (K_DOWN, K_DOWN) : action('double_down'),
+                }
+
     def _quit(self, pause=True):
         import menuscene # avoid circular import
         if pause:
@@ -180,9 +191,30 @@
             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:
             if ev.key in self._fast_key_map:
                 self._fast_keys_down.discard(ev.key)
+            if time.time() - self._last_keydown_time < constants.DOUBLE_TAP_TIME and self._last_keys_down 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
         elif engine.OpenDialog.matches(ev):