Mercurial > skaapsteker
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):