i also used pygame to support joypad input.
this class adds support for all buttons and sticks, which you can then accept to do something.
there is the dict “self.mapping”, where i define some mappings, the first one is default. you could modify its values to set the right buttons/sticks to the right value.
from pandac.PandaModules import *
import pygame as pg
from string import strip as strip
class joypad:
def __init__(self):
pg.init()
self.padsConnected = False
self.controllerType = []
self.setupGamepads()
self.runPads()
def setupGamepads(self):
#Get the number of controllers so we know how many to init
count = pg.joystick.get_count()
if count == 0:
self.padsConnected = False
# print "no pads connected"
return
else: self.padsConnected = True
#Initialize the controllers
if count > 0:
self.c1=pg.joystick.Joystick(0)
self.c1.init()
self.controllerType.append(strip(self.c1.get_name()))
if count > 1:
self.c2=pg.joystick.Joystick(1)
self.c2.init()
self.controllerType.append(strip(self.c2.get_name()))
if count > 2:
self.c3=pg.joystick.Joystick(2)
self.c3.init()
self.controllerType.append(strip(self.c3.get_name()))
if count > 3:
self.c4=pg.joystick.Joystick(3)
self.c4.init()
self.controllerType.append(strip(self.c4.get_name()))
#print "%i joypads inited" % count
self.mapping = { "default" : {"NORTH-BUTTON":0, "EAST-BUTTON":1, "SOUTH-BUTTON":2, "WEST-BUTTON":3,
"L1-BUTTON" : 4, "R1-BUTTON" : 5, "L2-BUTTON" : 6, "R2-BUTTON" : 7,
"SELECT-BUTTON":8, "START-BUTTON":9,
"L-STICK-BUTTON":10, "R-STICK-BUTTON":11,
"L-STICK-X" : 0, "L-STICK-Y" : 1, "R-STICK-X" : 2, "R-STICK-Y" : 3,
"HAT-WEST":(-1,0), "HAT-EAST":(1,0), "HAT-NORTH":(0,1), "HAT-SOUTH":(0,-1),
"HAT-SOUTH-WEST":(-1,-1), "HAT-NORTH-WEST":(-1,1), "HAT-NORTH-EAST":(1,1), "HAT-SOUTH-EAST":(1,-1),
"HATS-UP":(0,0)
},
#my speedlink
"USB Joystick" : {"NORTH-BUTTON":0, "EAST-BUTTON":1, "SOUTH-BUTTON":2, "WEST-BUTTON":3,
"L1-BUTTON" : 4, "R1-BUTTON" : 5, "L2-BUTTON" : 6, "R2-BUTTON" : 7,
"SELECT-BUTTON":8, "START-BUTTON":9,
"L-STICK-BUTTON":10, "R-STICK-BUTTON":11,
"L-STICK-X" : 0, "L-STICK-Y" : 1, "R-STICK-X" : 2, "R-STICK-Y" : 3,
"HAT-WEST":(-1,0), "HAT-EAST":(1,0), "HAT-NORTH":(0,1), "HAT-SOUTH":(0,-1),
"HAT-SOUTH-WEST":(-1,-1), "HAT-NORTH-WEST":(-1,1), "HAT-NORTH-EAST":(1,1), "HAT-SOUTH-EAST":(1,-1),
"HATS-UP":(0,0)
},
#my impact
"USB Game Controllers" : {"NORTH-BUTTON":1, "EAST-BUTTON":3, "SOUTH-BUTTON":2, "WEST-BUTTON":0,
"L1-BUTTON" : 4, "R1-BUTTON" : 6, "L2-BUTTON" : 5, "R2-BUTTON" : 7,
"SELECT-BUTTON":8, "START-BUTTON":9,
"L-STICK-BUTTON":10, "R-STICK-BUTTON":11,
"L-STICK-X" : 0, "L-STICK-Y" : 1, "R-STICK-X" : 3, "R-STICK-Y" : 2,
"HAT-WEST":(-1,0), "HAT-EAST":(1,0), "HAT-NORTH":(0,1), "HAT-SOUTH":(0,-1),
"HAT-SOUTH-WEST":(-1,-1), "HAT-NORTH-WEST":(-1,1), "HAT-NORTH-EAST":(1,1), "HAT-SOUTH-EAST":(1,-1),
"HATS-UP":(0,0)
},
"USB Joystick" : {"NORTH-BUTTON":0, "EAST-BUTTON":1, "SOUTH-BUTTON":2, "WEST-BUTTON":3,
"L1-BUTTON" : 4, "R1-BUTTON" : 5, "L2-BUTTON" : 6, "R2-BUTTON" : 7,
"SELECT-BUTTON":8, "START-BUTTON":9,
"L-STICK-BUTTON":10, "R-STICK-BUTTON":11,
"L-STICK-X" : 0, "L-STICK-Y" : 1, "R-STICK-X" : 2, "R-STICK-Y" : 3,
"HAT-WEST":(-1,0), "HAT-EAST":(1,0), "HAT-NORTH":(0,1), "HAT-SOUTH":(0,-1),
"HAT-SOUTH-WEST":(-1,-1), "HAT-NORTH-WEST":(-1,1), "HAT-NORTH-EAST":(1,1), "HAT-SOUTH-EAST":(1,-1),
"HATS-UP":(0,0)
}
}
def runPads(self):
if self.padsConnected:
taskMgr.add(self.gamepadPollingTask, "gamepadPollingTask")
def gamepadPollingTask(self, task):
for e in pg.event.get():
# print e
#Get which controller this is and add it to the eventName
if e.dict["joy"] == 0:
c_number = "C1_"
c_type = 0
elif e.dict["joy"] == 1:
c_number = "C2_"
c_type = 1
elif e.dict["joy"] == 2:
c_number = "C3_"
c_type = 2
elif e.dict["joy"] == 3:
c_number = "C4_"
c_type = 3
if self.mapping.has_key(self.controllerType[c_type]):
type = self.controllerType[c_type]
else:
type = "default"
#Handle the BUTTON DOWN events
if e.type == pg.JOYBUTTONDOWN:
if (e.dict["button"] == self.mapping[type]["NORTH-BUTTON"]):
eventName = c_number + "NORTH-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["EAST-BUTTON"]):
eventName = c_number + "EAST-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["SOUTH-BUTTON"]):
eventName = c_number + "SOUTH-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["WEST-BUTTON"]):
eventName = c_number + "WEST-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["L1-BUTTON"]):
eventName = c_number + "L1-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["R1-BUTTON"]):
eventName = c_number + "R1-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["L2-BUTTON"]):
eventName = c_number + "L2-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["R2-BUTTON"]):
eventName = c_number + "R2-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["SELECT-BUTTON"]):
eventName = c_number + "SELECT-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["START-BUTTON"]):
eventName = c_number + "START-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["L-STICK-BUTTON"]):
eventName = c_number + "L-STICK-BUTTON_DOWN"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["R-STICK-BUTTON"]):
eventName = c_number + "R-STICK-BUTTON_DOWN"
messenger.send(eventName, [])
#
#Handle the BUTTONUP events
elif e.type == pg.JOYBUTTONUP:
if (e.dict["button"] == self.mapping[type]["NORTH-BUTTON"]):
eventName = c_number + "NORTH-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["EAST-BUTTON"]):
eventName = c_number + "EAST-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["SOUTH-BUTTON"]):
eventName = c_number + "SOUTH-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["WEST-BUTTON"]):
eventName = c_number + "WEST-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["L1-BUTTON"]):
eventName = c_number + "L1-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["R1-BUTTON"]):
eventName = c_number + "R1-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["L2-BUTTON"]):
eventName = c_number + "L2-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["R2-BUTTON"]):
eventName = c_number + "R2-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["SELECT-BUTTON"]):
eventName = c_number + "SELECT-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["START-BUTTON"]):
eventName = c_number + "START-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["L-STICK-BUTTON"]):
eventName = c_number + "L-STICK-BUTTON_UP"
messenger.send(eventName, [])
elif (e.dict["button"] == self.mapping[type]["R-STICK-BUTTON"]):
eventName = c_number + "R-STICK-BUTTON_UP"
messenger.send(eventName, [])
#Handle the directional pad
elif e.type == pg.JOYHATMOTION:
if (e.dict["value"] == self.mapping[type]["HAT-NORTH"]):
eventName = c_number + "HAT-NORTH_DOWN"
messenger.send(eventName, [])
elif (e.dict["value"] == self.mapping[type]["HAT-EAST"]):
eventName = c_number + "HAT-EAST_DOWN"
messenger.send(eventName, [])
elif (e.dict["value"] == self.mapping[type]["HAT-SOUTH"]):
eventName = c_number + "HAT-SOUTH_DOWN"
messenger.send(eventName, [])
elif (e.dict["value"] == self.mapping[type]["HAT-WEST"]):
eventName = c_number + "HAT-WEST_DOWN"
messenger.send(eventName, [])
elif (e.dict["value"] == self.mapping[type]["HAT-SOUTH-WEST"]):
eventName = c_number + "HAT-SOUTH-WEST_DOWN"
messenger.send(eventName, [])
elif (e.dict["value"] == self.mapping[type]["HAT-NORTH-WEST"]):
eventName = c_number + "HAT-NORTH-WEST_DOWN"
messenger.send(eventName, [])
elif (e.dict["value"] == self.mapping[type]["HAT-NORTH-EAST"]):
eventName = c_number + "HAT-NORTH-EAST_DOWN"
messenger.send(eventName, [])
elif (e.dict["value"] == self.mapping[type]["HAT-SOUTH-EAST"]):
eventName = c_number + "HAT-SOUTH-EAST_DOWN"
messenger.send(eventName, [])
elif (e.dict["value"] == self.mapping[type]["HATS-UP"]):
eventName = c_number + "HATS-UP"
messenger.send(eventName, [])
#Handle the analog sticks
elif e.type == pg.JOYAXISMOTION:
#Handle the left analog stick X axis
if (e.dict["axis"] == self.mapping[type]["L-STICK-X"]):
if (e.dict["value"] != 0):
eventName = c_number + "L-STICK-X"
messenger.send(eventName, [e.dict["value"]])
#Handle the left analog stick Y axis
elif (e.dict["axis"] == self.mapping[type]["L-STICK-Y"]):
if (e.dict["value"] != 0):
eventName = c_number + "L-STICK-Y"
messenger.send(eventName, [e.dict["value"]])
#
#Handle the right analog stick X axis
elif (e.dict["axis"] == self.mapping[type]["R-STICK-X"]):
if (e.dict["value"] != 0):
eventName = c_number + "R-STICK-X"
messenger.send(eventName, [e.dict["value"]])
#Handle the right analog stick Y axis
elif (e.dict["axis"] == self.mapping[type]["R-STICK-Y"]):
if (e.dict["value"] != 0):
eventName = c_number + "R-STICK-Y"
messenger.send(eventName, [e.dict["value"]])
return task.cont
then import the class into your code and initialze it:
self.controllers = joypad()
and to accept events, for example for controller1:
self.accept('C1_NORTH-BUTTON_UP', self.doSomething)
to read the stick-values constantly, start a task and just read the stick-axis-value:
x = self.controllers.c1.get_axis(0)