Well, this is my yesterday written snippet:
__author__ = 'Emanuele Bertoldi <zuck@fastwebnet.it>'
__copyright__ = 'Copyright (c) 2009 Emanuele Bertoldi'
import pygame
from direct.showbase import DirectObject
from direct.showbase.MessengerGlobal import messenger
class JoystickHandler(DirectObject.DirectObject):
def __init__(self):
pygame.init()
count = pygame.joystick.get_count()
self.__joysticks = []
for i in range(count):
js = pygame.joystick.Joystick(i)
js.init()
self.__joysticks.append(js)
taskMgr.add(self.__on_joystick_polling, 'Joystick Polling')
def destroy(self):
pygame.quit()
def get_joysticks(self):
return self.__joysticks
def get_count(self):
return len(self.__joysticks)
def __on_joystick_polling(self, task):
for ev in pygame.event.get():
if ev.type is pygame.JOYBUTTONDOWN:
name = 'joystick%d-button%d' % (ev.joy, ev.button)
messenger.send(name)
elif ev.type is pygame.JOYBUTTONUP:
name = 'joystick%d-button%d-up' % (ev.joy, ev.button)
messenger.send(name)
elif ev.type is pygame.JOYAXISMOTION:
name = 'joystick%d-axis%d' % (ev.joy, ev.axis)
messenger.send(name, [ev.value])
elif ev.type is pygame.JOYBALLMOTION:
name = 'joystick%d-ball%d' % (ev.joy, ev.hat)
messenger.send(name, [ev.rel])
elif ev.type is pygame.JOYHATMOTION:
name = 'joystick%d-hat%d' % (ev.joy, ev.hat)
messenger.send(name, [ev.value])
return task.cont
Now you can accept joystick input with the classical approach. For instance:
class Player(JoystickHandler):
def __init__(self):
JoystickHandler.__init__(self)
self.accept('joystick0-axis2', self.steer)
self.accept('joystick0-button1', self.brake, [True])
self.accept('joystick0-button1-up', self.brake, [False])
self.accept('joystick1-button2', self.do_something)
...
It works for me