def get_360_controller(): ''' Assume pygame.init() is called before this ''' pygame.joystick.init() # Initialize a joystick object: grabs the first joystick PLATFORM = platform.uname()[0].upper() WINDOWS_PLATFORM = PLATFORM == 'WINDOWS' WINDOWS_XBOX_360 = False JOYSTICK_NAME = '' joysticks = xinput.XInputJoystick.enumerate_devices() device_numbers = list(map(attrgetter('device_number'), joysticks)) joystick = None if device_numbers: joystick = pygame.joystick.Joystick(device_numbers[0]) JOYSTICK_NAME = joystick.get_name().upper() print('Joystick: {} using "{}" device'.format(PLATFORM, JOYSTICK_NAME)) if 'XBOX 360' in JOYSTICK_NAME and WINDOWS_PLATFORM: WINDOWS_XBOX_360 = True joystick = xinput.XInputJoystick(device_numbers[0]) print('Using xinput.XInputJoystick') return joystick else: # put other logic here for handling platform + device type in the event loop print('Using pygame joystick') joystick.init() return False
def __init__(self): # Set initial values for guitar state self.controller = xinput.XInputJoystick(0) self.curState = self.controller.get_state() # Check a controller is plugged in if self.curState is None: sys.exit("Please plug in a guitar.") self.prevState = self.curState self.whammyDown = self.GetWhammy() > WHAMMY_EDGE self.prevWhammyDown = self.whammyDown self.thrown = self.GetOrientation() > THROW_EDGE self.prevThrown = self.thrown
def getJoystick(): WINDOWS_XBOX_360 = False JOYSTICK_NAME = '' joysticks = xinput.XInputJoystick.enumerate_devices() device_numbers = list(map(attrgetter('device_number'), joysticks)) joystick = None if device_numbers: joystick = pygame.joystick.Joystick(device_numbers[0]) JOYSTICK_NAME = joystick.get_name().upper() if 'XBOX 360' in JOYSTICK_NAME: WINDOWS_XBOX_360 = True joystick = xinput.XInputJoystick(device_numbers[0]) else: # put other logic here for handling platform + device type in the event loop joystick.init() return joystick, WINDOWS_XBOX_360
def init(): global XBOX_CONTROLLER, JOYSTICK_NAME, joystick, buttons_codes, axis_codes, d_pad_codes global pygame, screen, screen_rect, clock pygame.init() pygame.joystick.init() clock = pygame.time.Clock() # Initialize a joystick object: grabs the first joystick if PLATFORM == 'WINDOWS': joysticks = xinput.XInputJoystick.enumerate_devices() if DEBUG: print( "Joysticks returned by XInputJoystick : {}".format(joysticks)) device_numbers = list(map(attrgetter('device_number'), joysticks)) if DEBUG: print("Joysticks device numbers : {}".format(device_numbers)) if device_numbers: joystick = pygame.joystick.Joystick(device_numbers[0]) JOYSTICK_NAME = joystick.get_name().upper() if DEBUG: print('Joystick: {} using "{}" device'.format( PLATFORM, JOYSTICK_NAME)) if 'XBOX' in JOYSTICK_NAME: XBOX_CONTROLLER = True joystick = xinput.XInputJoystick(device_numbers[0]) buttons_codes = DualMappingObject( (0, 'A'), (1, 'B'), (2, 'X'), (3, 'Y'), (4, 'LB'), (5, 'RB'), (6, 'BACK'), (7, 'START'), (8, 'LS'), (9, 'RS'), (10, 'XB')) axis_codes = DualMappingObject(('LX', 1), ('LY', 0), ('RX', 4), ('RY', 3), ('LT', 2), ('RT', 5)) if DEBUG: print('Using xinput.XInputJoystick') else: # put other logic here for handling platform + device type in the event loop if DEBUG: print('Using pygame joystick') joystick.init() buttons_codes = DualMappingObject( (0, 'A'), (1, 'B'), (2, 'X'), (3, 'Y'), (4, 'LB'), (5, 'RB'), (6, 'BACK'), (7, 'START'), (8, 'LS'), (9, 'RS'), (10, 'XB')) axis_codes = DualMappingObject(('LX', 0), ('LY', 1), ('RX', 4), ('RY', 3), ('LT', 2), ('RT', 2)) d_pad_codes = DualMappingObject( (0, 'DOWN'), (0, 'UP'), (0, 'LEFT'), (0, 'RIGHT')) # setting this as a default just in case elif PLATFORM == 'DARWIN': joysticks = [] for i in range(0, pygame.joystick.get_count()): joysticks.append(pygame.joystick.Joystick(i)) joysticks[-1].init() if DEBUG: print("Detected joystick '", joysticks[-1].get_name(), "'") buttons_codes = DualMappingObject( (11, 'A'), (12, 'B'), (13, 'X'), (14, 'Y'), (8, 'LB'), (9, 'RB'), (5, 'BACK'), (4, 'START'), (6, 'LS'), (7, 'RS'), (10, 'XB')) axis_codes = DualMappingObject(('LX', 0), ('LY', 1), ('RX', 2), ('RY', 3), ('LT', 4), ('RT', 5)) d_pad_codes = DualMappingObject((1, 'DOWN'), (0, 'UP'), (2, 'LEFT'), (3, 'RIGHT'))
def controller_worker(controller_continuous_array, controller_buttons_array, continuous_ref_array, btns_ref_array, RUN): #///////////////////////////// # IMPORTS AND PROJECT VARIABLES #///////////////////////////// # imports from operator import attrgetter import platform import pygame import pygame.locals from threading import Thread # custom imports from mappingobject import DualMappingObject #import draw import analysis PLATFORM = platform.uname()[0].upper() if PLATFORM == 'WINDOWS': import xinput __version__ = '1.0.0' __vernum__ = tuple([int(s) for s in __version__.split('.')]) DEBUG = False max_fps = 60 trigger_error_win = -3.051850947599719e-05 controller_values = {'A':0, 'B':0, 'X':0, 'Y':0, 'LB':0, 'RB':0, 'LS':0, 'RS':0, 'BACK':0, 'START':0, 'XB':0, 'DPAD':[0,0], 'LX':0, 'LY':0, 'RX':0, 'RY':0, 'LT':0, 'RT':0} analysis_values = {'LXVel':0, 'LYVel':0, 'RXVel':0, 'RYVel':0, 'LTVel':0, 'RTVel':0, 'Density':0} # [end IMPORTS AND PROJECT VARIABLES] #///////////////////////////// # PYGAME AND CONTROLLER INIT #///////////////////////////// XBOX_CONTROLLER = False JOYSTICK_NAME = '' joystick = None clock = None #global XBOX_CONTROLLER, JOYSTICK_NAME, joystick, buttons_codes, axis_codes, d_pad_codes #global pygame, screen, screen_rect, clock pygame.init() pygame.joystick.init() clock = pygame.time.Clock() # Initialize a joystick object: grabs the first joystick if PLATFORM == 'WINDOWS': joysticks = xinput.XInputJoystick.enumerate_devices() if DEBUG: print("Joysticks returned by XInputJoystick : {}".format(joysticks)) device_numbers = list(map(attrgetter('device_number'), joysticks)) if DEBUG: print("Joysticks device numbers : {}".format(device_numbers)) if device_numbers: joystick = pygame.joystick.Joystick(device_numbers[0]) JOYSTICK_NAME = joystick.get_name().upper() if DEBUG: print('Joystick: {} using "{}" device'.format(PLATFORM, JOYSTICK_NAME)) if 'XBOX' in JOYSTICK_NAME: XBOX_CONTROLLER = True joystick = xinput.XInputJoystick(device_numbers[0]) buttons_codes = DualMappingObject((0,'A'), (1,'B'), (2,'X'), (3,'Y'), (4,'LB'), (5,'RB'), (6,'BACK'), (7,'START'), (8,'LS'), (9,'RS'), (10,'XB')) axis_codes = DualMappingObject(('LX',1), ('LY',0), ('RX',4), ('RY',3), ('LT',2), ('RT',5)) if DEBUG: print('Using xinput.XInputJoystick') else: # put other logic here for handling platform + device type in the event loop if DEBUG: print('Using pygame joystick') joystick.init() buttons_codes = DualMappingObject((0,'A'), (1,'B'), (2,'X'), (3,'Y'), (4,'LB'), (5,'RB'), (6,'BACK'), (7,'START'), (8,'LS'), (9,'RS'), (10,'XB')) axis_codes = DualMappingObject(('LX',0), ('LY',1), ('RX',4), ('RY',3), ('LT',2), ('RT',2)) d_pad_codes = DualMappingObject((0,'DOWN'), (0,'UP'), (0,'LEFT'), (0,'RIGHT')) # setting this as a default just in case elif PLATFORM == 'DARWIN': joysticks = [] for i in range(0, pygame.joystick.get_count()): joysticks.append(pygame.joystick.Joystick(i)) joysticks[-1].init() if DEBUG: print("Detected joystick '", joysticks[-1].get_name(), "'") buttons_codes = DualMappingObject((11, 'A'), (12, 'B'), (13, 'X'), (14, 'Y'), (8, 'LB'), (9, 'RB'), (5, 'BACK'), (4, 'START'), (6, 'LS'), (7, 'RS'), (10, 'XB')) axis_codes = DualMappingObject(('LX', 0), ('LY', 1), ('RX', 2), ('RY', 3), ('LT', 4), ('RT', 5)) d_pad_codes = DualMappingObject((1, 'DOWN'), (0, 'UP'), (2, 'LEFT'), (3, 'RIGHT')) # [end PYGAME AND CONTROLLER INIT] #///////////////////////////// # EVENT HANDLING FUNCTIONS #///////////////////////////// def update_d_pad_mac(event, event_type): if event_type == JOYBUTTONDOWN: if d_pad_codes[event.button] == 'DOWN': controller_values['DPAD'][1] = -1 elif d_pad_codes[event.button] == 'UP': controller_values['DPAD'][1] = 1 elif d_pad_codes[event.button] == 'LEFT': controller_values['DPAD'][0] = -1 elif d_pad_codes[event.button] == 'RIGHT': controller_values['DPAD'][0] = 1 elif event_type == JOYBUTTONUP: if d_pad_codes[event.button] == 'DOWN': controller_values['DPAD'][1] = 0 elif d_pad_codes[event.button] == 'UP': controller_values['DPAD'][1] = 0 elif d_pad_codes[event.button] == 'LEFT': controller_values['DPAD'][0] = 0 elif d_pad_codes[event.button] == 'RIGHT': controller_values['DPAD'][0] = 0 def update_triggers_windows(axis, value): if XBOX_CONTROLLER: if axis == axis_codes['RT']: controller_values['RT'] = value elif axis == axis_codes['LT']: controller_values['LT'] = value else: if value > 0: controller_values['LT'] = value elif value < 0: controller_values['RT'] = -value def update_axis_motion_windows(axis, value): global controller_values if axis == axis_codes['LY']: if XBOX_CONTROLLER: controller_values['LY'] = value else: controller_values['LY'] = -value elif axis == axis_codes['LX']: controller_values['LX'] = value elif axis == axis_codes['RY']: if XBOX_CONTROLLER: controller_values['RY'] = value else: controller_values['RY'] = -value elif axis == axis_codes['RX']: controller_values['RX'] = value else: update_triggers_windows(axis, value) def handle_axis_motion(axis, value): global controller_values if DEBUG: print('JOYAXISMOTION: axis {}, value {}'.format(event.axis, event.value)) if axis in axis_codes: if PLATFORM == 'WINDOWS': update_axis_motion_windows(axis, value) elif PLATFORM == 'DARWIN': controller_values[axis_codes[axis]] = -value if axis in [axis_codes['LY'], axis_codes['RY']] else value def handle_button_down(event): if DEBUG: print('JOYBUTTONDOWN: button {}'.format(event.button)) if event.button in buttons_codes: controller_values[buttons_codes[event.button]] = 1 elif PLATFORM == 'DARWIN' and event.button in d_pad_codes: update_d_pad_mac(event, JOYBUTTONDOWN) else: if DEBUG: print('Button not mapped') def handle_button_up(event): if DEBUG: print('JOYBUTTONUP: button {}'.format(event.button)) if event.button in buttons_codes: controller_values[buttons_codes[event.button]] = 0 elif PLATFORM == 'DARWIN' and event.button in d_pad_codes: update_d_pad_mac(event, JOYBUTTONUP) else: if DEBUG: print('Button not mapped') def handle_hat_motion(event): # pygame sends this; xinput sends a button instead--the handler converts the button to a hat event if DEBUG: print('JOYHATMOTION: joy {} hat {} value {}'.format(event.joy, event.hat, event.value)) controller_values['DPAD'] = event.value # [end EVENT HANDLING FUNCTIONS] #///////////////////////////// # ANALYSIS OBJECTS #///////////////////////////// # ls_velocity = analysis.StickVelocityTracker(max_fps) # rs_velocity = analysis.StickVelocityTracker(max_fps) # lt_velocity = analysis.TriggerVelocityTracker(max_fps) # rt_velocity = analysis.TriggerVelocityTracker(max_fps) # density = analysis.DensityTracker(['A', 'B', 'X', 'Y', 'LB', 'RB'], max_fps) # [end ANALYSIS OBJECTS] #///////////////////////////// # MAIN CONTROLLER UPDATE LOOP #///////////////////////////// while RUN: clock.tick(max_fps) if XBOX_CONTROLLER: joystick.dispatch_events() for event in pygame.event.get(): if DEBUG: print('event: {}'.format(pygame.event.event_name(event.type))) if event.type == JOYAXISMOTION: handle_axis_motion(event.axis, event.value) elif event.type == JOYBUTTONDOWN: handle_button_down(event) elif event.type == JOYBUTTONUP: handle_button_up(event) elif event.type == JOYHATMOTION: handle_hat_motion(event) # analysis objects update # ls_velocity.tick(controller_values['LX'], controller_values['LY']) # rs_velocity.tick(controller_values['RX'], controller_values['RY']) # lt_velocity.tick(controller_values['LT']) # rt_velocity.tick(controller_values['RT']) # density.tick(controller_values) # analysis_values['LXVel'] = ls_velocity['X']['LongTermVel'] # analysis_values['LYVel'] = ls_velocity['Y']['LongTermVel'] # analysis_values['RXVel'] = rs_velocity['X']['LongTermVel'] # analysis_values['RYVel'] = rs_velocity['Y']['LongTermVel'] # analysis_values['LTVel'] = lt_velocity['LongTermVel'] # analysis_values['RTVel'] = rt_velocity['LongTermVel'] # analysis_values['Density'] = density.get() if DEBUG: print("Controller values : {}".format(controller_values)) #update array with controller_continuous_array.get_lock(): for i, elem in enumerate(continuous_ref_array): controller_continuous_array[i].value = controller_values[elem] with controller_buttons_array.get_lock(): for i, elem in enumerate(btns_ref_array): controller_buttons_array[i].value = controller_values[elem]
pygame.mixer.pre_init(44100, 32, 2, 4096) pygame.init() pygame.mixer.init(44100, -16, 2, 2048) screen = pygame.display.set_mode((screen_x, screen_y), 0, 32) pygame.display.set_caption('Mario') menufont = pygame.font.Font("SuperMarioBros.ttf", 90) gamefont = pygame.font.Font("SuperMarioBros.ttf", 70) myfont = pygame.font.Font("SuperMarioBros.ttf", 30) pygame.joystick.init() joysticks = xinput.XInputJoystick.enumerate_devices() device_numbers = list(map(attrgetter('device_number'), joysticks)) joystick = [None, None] if device_numbers: joystick[0] = xinput.XInputJoystick(device_numbers[0]) if len(device_numbers) > 1: joystick[1] = xinput.XInputJoystick(device_numbers[1]) try: sheet = pygame.image.load('sprites.png') background = pygame.image.load('background.png').convert() back_menu = pygame.image.load('back_menu.png').convert() mario_wins = pygame.image.load('mario_wins.png').convert() luigi_wins = pygame.image.load('luigi_wins.png').convert() draw_round = pygame.image.load('draw_round.png').convert() jump_sound = pygame.mixer.Sound('Jump.wav') coin_sound = pygame.mixer.Sound('Coin.wav') bomb_sound = pygame.mixer.Sound('Bomb.wav') death_sound = pygame.mixer.Sound('Death.wav') mush_sound = pygame.mixer.Sound('Mush_up.wav')
# Initialize a joystick object: grabs the first joystick PLATFORM = platform.uname()[0].upper() WINDOWS_PLATFORM = PLATFORM == 'WINDOWS' WINDOWS_XBOX_360 = False JOYSTICK_NAME = '' joysticks = xinput.XInputJoystick.enumerate_devices() device_numbers = list(map(attrgetter('device_number'), joysticks)) joystick = None if device_numbers: joystick = pygame.joystick.Joystick(device_numbers[0]) JOYSTICK_NAME = joystick.get_name().upper() print('Joystick: {} using "{}" device'.format(PLATFORM, JOYSTICK_NAME)) if 'XBOX 360' in JOYSTICK_NAME and WINDOWS_PLATFORM: WINDOWS_XBOX_360 = True joystick = xinput.XInputJoystick(device_numbers[0]) print('Using xinput.XInputJoystick') else: # put other logic here for handling platform + device type in the event loop print('Using pygame joystick') joystick.init() screen = pygame.display.set_mode((640, 480)) screen_rect = screen.get_rect() clock = pygame.time.Clock() black = Color('black') white = Color('white') red = Color('red') # button display button_a = Struct(rect=Rect(560, 200, 20, 20), value=0)
def main(): print("Startup") controller = xinput.XInputJoystick(0) # Dynamic get rate #rate = xinput.determine_optimal_sample_rate() rate = 200 operands = [0] operators = [] outStr = "" i = 0 j = 0 ans = 0 opCounter = 0 sign = 1 print("Operation: +") state = controller.get_state() prevState = state up = GetOrientation(state) > THROW_EDGE prevUp = up whammyDown = GetWhammy(state) > WHAMMY_EDGE prevWhammyDown = whammyDown while True: # Wait on sample rate time.sleep(1.0 / rate) # Get state of controller state = controller.get_state() #print(xinput.struct_dict(state.gamepad)) # Check orientation if up is False and GetOrientation( state) > THROW_EDGE + THROW_HYSTERESIS: up = True elif up is True and GetOrientation( state) < THROW_EDGE - THROW_HYSTERESIS: up = False # Check whammy if whammyDown is False and GetWhammy( state) > WHAMMY_EDGE + WHAMMY_HYSTERESIS: whammyDown = True elif whammyDown is True and GetWhammy( state) < WHAMMY_EDGE - WHAMMY_HYSTERESIS: whammyDown = False # Check various controls # Check strum down if GetButtons(state) & BTN_BIT_STRUM_DOWN and not GetButtons( prevState) & BTN_BIT_STRUM_DOWN: #print("Strum down") #print('i = ' + str(i)) # Check for insert operand operand = GetButtons(state) & 0x1F # Overwrite ans ans = 0 #print("j: " + str(j)) if operands[i] == 0: if j >= 0: operands[i] = operand outStr = outStr[:-1] + "{0:d}".format(operand) if operand < 10: j += 1 else: j += 2 else: if operand < 10: operands[i] = operand / 10 j -= 1 else: operands[i] = operand / 100 j -= 2 outStr = outStr + str(operand) elif j >= 0: if operand < 10: operands[i] = operands[i] * 10 + operand * sign j += 1 else: operands[i] = operands[i] * 100 + operand * sign j += 2 outStr = outStr + str(operand) elif j < 0: if operand < 10: operands[i] = operands[i] + operand * (10**j) * sign j -= 1 else: operands[i] = operands[i] + operand * (10**(j - 1)) * sign j -= 2 outStr = outStr + str(operand) #print("Operands: " + str(operands)) print(outStr + "\t\t\tOperation: " + opTable[opCounter] + " ", end='\r') playStrum(state) # Check strum up if GetButtons(state) & BTN_BIT_STRUM_UP and not GetButtons( prevState) & BTN_BIT_STRUM_UP: #print("Strum up") if operands[0] == 0 and len(operands) == 1: #outStr = '0' outStr = str(ans) operands[0] = ans operator = opTable[opCounter] operators.append(operator) operands.append(0) outStr = outStr + ' ' + operator + ' 0' i += 1 j = 0 sign = 1 if outStr != "": print(outStr, end='\r') else: print("Please input at an operand.") #sys.stdout.flush # Check for whammy press if whammyDown and not prevWhammyDown: #print("Whammy down") opCounter += 1 if opCounter >= len(opTable): opCounter = 0 #print("opCounter: " + str(opCounter)) print(outStr + "\t\t\tOperation: " + opTable[opCounter] + " ", end='\r') # Check for thrown guitar if up and not prevUp: #winsound.PlaySound('slide_whistle_up.wav', winsound.SND_FILENAME) try: # Lists to hold what ops go where expOps = [] mulOps = [] addOps = [] result = 0 for i in range(len(operators)): if operators[i] == '^': expOps.append(i) if operators[i] == '*': mulOps.append(i) elif operators[i] == '+': addOps.append(i) # Perform ops in order of operations for i in range(len(expOps)): expOp = expOps[len(expOps) - i - 1] result = operands[expOp]**operands[expOp + 1] operands[expOp] = result operands.pop(expOp + 1) shortenList(expOps, expOp) shortenList(mulOps, expOp) shortenList(addOps, expOp) for mulOp in mulOps: result = operands[mulOp] * operands[mulOp + 1] operands[mulOp] = result operands.pop(mulOp + 1) shortenList(mulOps, mulOp) shortenList(addOps, mulOp) for addOp in addOps: result = operands[addOp] + operands[addOp + 1] operands[addOp] = result operands.pop(addOp + 1) shortenList(addOps, addOp) result = operands[0] ans = result outStr = outStr + " = " + str(result) + "\t\t\t " if not outStr == " = 0" + "\t\t\t ": print(outStr) print("\t\t\t\tOperation: " + opTable[opCounter], end="\r") #except: # print("Invalid equation, clearing.") finally: i = 0 j = 0 sign = 1 outStr = "" operands = [0] operators.clear() # Check for back button if GetButtons(state) & BTN_BIT_BACK and not GetButtons( prevState) & BTN_BIT_BACK: # Erase last character of operand or delete operator if operands[i] != 0 and j >= 0: operands[i] = int(operands[i] / 10) outStr = outStr[:-1] j -= 1 if operands[i] == 0: outStr = outStr + "0" elif operands[i] != 0 and j <= -1: operands[i] -= operands[i] % (10**(j + 2)) j += 1 outStr = outStr[:-1] elif outStr[-1:] == ".": outStr = outStr[:-1] j = len(str(operands[i])) - 1 elif operands[i] == 0 and len(operators) >= 1: operands.pop(i) operators.pop(len(operators) - 1) i -= 1 outStr = outStr[:-4] else: pass print(outStr + " ", end='\r') #print("Operands: " + str(operands)) #print("j: " + str(j)) #print("Operators:" + str(operators)) # Check for pad down button if GetButtons(state) & BTN_BIT_PAD_DOWN and not GetButtons( prevState) & BTN_BIT_PAD_DOWN: # Make negative if operands[i] != 0: operands[i] *= -1 #outStr = outStr[:-(j+1)] + '-' + outStr[-(j+1):] outStr = negateOperand(outStr) sign = sign * -1 #print(operands) print(outStr, end='\r') # Check for Start button if GetButtons(state) & BTN_BIT_START and not GetButtons( prevState) & BTN_BIT_START: # If no dot yet, add one if j >= 0: j = -1 outStr = outStr + "." print(outStr, end='\r') prevState = state prevUp = up prevWhammyDown = whammyDown