162 lines
5.4 KiB
Python
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
|