pgfw/pgfw/Input.py

162 lines
5.4 KiB
Python

from time import time
from pygame import event, joystick as joy, key as keyboard
from pygame.locals import *
from GameChild import *
class Input(GameChild):
def __init__(self, game):
GameChild.__init__(self, game)
self.last_mouse_down_left = None
self.joystick = Joystick()
self.unsuppress()
self.subscribe_to_events()
self.build_key_map()
def subscribe_to_events(self):
self.subscribe_to(KEYDOWN, self.translate_key_press)
self.subscribe_to(JOYBUTTONDOWN, self.translate_joy_button)
self.subscribe_to(JOYAXISMOTION, self.translate_axis_motion)
self.subscribe_to(MOUSEBUTTONDOWN, self.translate_mouse_input)
self.subscribe_to(MOUSEBUTTONUP, self.translate_mouse_input)
def suppress(self):
self.suppressed = True
def unsuppress(self):
self.suppressed = False
def build_key_map(self):
key_map = {}
for command, keys in self.get_configuration().items("keys"):
key_map[command] = []
if type(keys) == str:
keys = [keys]
for key in keys:
key_map[command].append(globals()[key])
self.key_map = key_map
def translate_key_press(self, evt):
self.print_debug("You pressed %s, suppressed => %s" %\
(evt.key, self.suppressed))
if not self.suppressed:
key = evt.key
for cmd, keys in self.key_map.iteritems():
if key in keys:
self.post_command(cmd)
def post_command(self, cmd, **kwargs):
config = self.get_configuration().get_section("event")
eid = self.get_custom_event_id()
self.print_debug("Posting %s command with id %s" % (cmd, eid))
name = config["command-event-name"]
event.post(event.Event(eid, name=name, command=cmd, **kwargs))
def translate_joy_button(self, evt):
if not self.suppressed:
button = evt.button
config = self.get_configuration().get_section("joy")
if button == config["advance"]:
self.post_command("advance")
if button == config["pause"]:
self.post_command("pause")
def translate_axis_motion(self, evt):
if not self.suppressed:
axis = evt.axis
value = evt.value
if axis == 1:
if value < 0:
self.post_command("up")
elif value > 0:
self.post_command("down")
else:
if value > 0:
self.post_command("right")
elif value < 0:
self.post_command("left")
def is_command_active(self, command):
if not self.suppressed:
joystick = self.joystick
if self.is_key_pressed(command):
return True
if command == "up":
return joystick.is_direction_pressed(Joystick.up)
elif command == "right":
return joystick.is_direction_pressed(Joystick.right)
elif command == "down":
return joystick.is_direction_pressed(Joystick.down)
elif command == "left":
return joystick.is_direction_pressed(Joystick.left)
def is_key_pressed(self, command):
poll = keyboard.get_pressed()
for key in self.key_map[command]:
if poll[key]:
return True
def translate_mouse_input(self, evt):
button = evt.button
pos = evt.pos
post = self.post_command
if evt.type == MOUSEBUTTONDOWN:
if button == 1:
last = self.last_mouse_down_left
if last:
limit = self.get_configuration("mouse",
"double-click-time-limit")
if time() - last < limit:
post("mouse-double-click-left", pos=pos)
last = time()
self.last_mouse_down_left = last
post("mouse-down-left", pos=pos)
elif button == 2:
post("mouse-down-middle", pos=pos)
elif button == 3:
post("mouse-down-right", pos=pos)
elif button == 4:
post("mouse-scroll-up", pos=pos)
elif button == 5:
post("mouse-scroll-down", pos=pos)
elif evt.type == MOUSEBUTTONUP:
if button == 1:
post("mouse-up-left", pos=pos)
elif button == 2:
post("mouse-up-middle", pos=pos)
elif button == 3:
post("mouse-up-right", pos=pos)
def get_axes(self):
axes = {}
for direction in "up", "right", "down", "left":
axes[direction] = self.is_command_active(direction)
return axes
class Joystick:
(up, right, down, left) = range(4)
def __init__(self):
js = None
if joy.get_count() > 0:
js = joy.Joystick(0)
js.init()
self.js = js
def is_direction_pressed(self, direction):
js = self.js
if not js or direction > 4:
return False
if direction == 0:
return js.get_axis(1) < 0
elif direction == 1:
return js.get_axis(0) > 0
elif direction == 2:
return js.get_axis(1) > 0
elif direction == 3:
return js.get_axis(0) < 0