Pygame + Joystick

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 :wink: