1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
import re
from warnings import warn
from .constants import keys
DEPRECATED_KEY_RE = re.compile(r'[A-Z]')
PREFIX_RE = re.compile(r'^K_(?!\d$)')
class Keyboard:
"""The current state of the keyboard.
Each attribute represents a key. For example, ::
keyboard.a
is True if the 'A' key is depressed, and False otherwise.
"""
# The current key state. This may as well be a class attribute - there's
# only one keyboard.
_pressed = set()
def __getattr__(self, kname):
if DEPRECATED_KEY_RE.match(kname):
warn(
"Uppercase keyboard attributes (eg. keyboard.%s) are "
"deprecated." % kname,
DeprecationWarning,
2
)
kname = PREFIX_RE.sub('', kname)
try:
key = keys[kname.upper()]
except AttributeError:
raise AttributeError('The key "%s" does not exist' % key)
return key.value in self._pressed
def _press(self, key):
"""Called by Game to mark the key as pressed."""
self._pressed.add(key)
def _release(self, key):
"""Called by Game to mark the key as released."""
self._pressed.discard(key)
def __getitem__(self, k):
if isinstance(k, keys):
return k.value in self._pressed
else:
warn(
"String lookup in keyboard (eg. keyboard[%r]) is "
"deprecated." % k,
DeprecationWarning,
2
)
return getattr(self, k)
keyboard = Keyboard()
|