Changeset 270:e47efa33903b


Ignore:
Timestamp:
04/08/11 15:13:25 (12 years ago)
Author:
Jeremy Thurgood <firxen@…>
Branch:
default
Phase:
public
Message:

Fixed key sequence handling.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • skaapsteker/levelscene.py

    r268 r270  
    176176        cr.clamp_ip(lr)
    177177
     178
     179    def _detect_key_sequence(self, ev):
     180        if ev.key not in self._fast_key_map:
     181            self._key_sequence = []
     182            return False
     183
     184        print ev
     185
     186        if ev.type is KEYUP:
     187            if (not self._key_sequence
     188                or ev.key != self._key_sequence[-1]
     189                or (time.time() - self._last_keydown_time) > constants.DOUBLE_TAP_TIME):
     190                self._key_sequence = []
     191                return False
     192            self._last_keyup_time = time.time()
     193            return False
     194
     195        if ev.type is KEYDOWN:
     196            if self._last_keyup_time is None or (time.time() - self._last_keyup_time) > constants.DOUBLE_TAP_TIME:
     197                self._key_sequence = []
     198            self._key_sequence.append(ev.key)
     199            self._last_keydown_time = time.time()
     200            for seq in self._key_tap_map:
     201                if seq == tuple(self._key_sequence[-len(seq):]):
     202                    self._key_sequence = self._key_sequence[-len(seq):]
     203                    return True
     204            return False
     205
     206
    178207    def dispatch(self, ev):
    179208        if ev.type is KEYDOWN:
     209
    180210            if self._player_dead:
    181211                if ev.key in self._restart_keys:
     
    184214                    self._quit(False)
    185215                return
     216
    186217            if self._dialogue:
    187218                self._dialogue.dispatch(ev)
    188219                return
     220
     221            if self._detect_key_sequence(ev):
     222                print "Detected double-tap:", self._key_sequence
     223                action = self._key_tap_map.get(tuple(self._key_sequence))
     224                if action is not None:
     225                    action()
    189226            if ev.key in self._fast_key_map:
    190227                self._fast_keys_down.add(ev.key)
     
    192229            if action is not None:
    193230                action()
    194             self._last_keydown_time = time.time()
    195             if self._last_keyup_time and (time.time() - self._last_keyup_time) < constants.DOUBLE_TAP_TIME:
    196                 # Part of a possible sequence
    197                 self._last_keys_down.append(ev.key)
    198                 self._last_keys_down = self._last_keys_down[-4:]
    199             else:
    200                 # Start a new sequence
    201                 self._last_keys_down = [ev.key]
    202                 if action is not None:
    203                     action()
     231
    204232        elif ev.type is KEYUP:
     233            self._detect_key_sequence(ev)
     234
    205235            if ev.key in self._fast_key_map:
    206236                self._fast_keys_down.discard(ev.key)
    207             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]:
    208                 self._last_keyup_time = time.time()
    209                 # Still in possible sequence
    210                 action = self._key_tap_map.get(tuple(self._last_keys_down))
    211                 if action is not None:
    212                     action()
    213             else:
    214                 # No longer meet the conditions for a tap sequence
    215                 self._last_keys_down = []
    216                 self._last_keyup_time = None
    217237
    218238        elif engine.PlayerDied.matches(ev):
Note: See TracChangeset for help on using the changeset viewer.