• Breaking News

    Pygame Joystick Bizarre Behavior

    I have this weird glitch: whenever I am pressing the D-pad on the 360 controller, the A-button also lights up. The A-button returns a 1 for positive and 0 for negative. It returns a 1 whenever I am pressing the 4 directions of the D-pad. Does anyone know how to solve this? By the way, I am using Linux Mint, Python 3.6.8, and Pygame 1.9.6 The source code for the class is below: # Xbox 360 Controller class class xpad: def __init__(self, pygameJoystick, deadzone): self.ID = pygameJoystick.get_id() pygameJoystick.init() self.deadzone = deadzone # Xbox 360 Controller Name self.name = pygameJoystick.get_name() # Thumbsticks self.left_thumb = ( self.dead( pygameJoystick.get_axis(0) ), self.dead( pygameJoystick.get_axis(1) ) ) self.right_thumb = ( self.dead( pygameJoystick.get_axis(3) ), self.dead( pygameJoystick.get_axis(4) ) ) # Triggers self.left_trig = pygameJoystick.get_axis(2) self.right_trig = pygameJoystick.get_axis(5) # Buttons self.A = pygameJoystick.get_button(0) self.B = pygameJoystick.get_button(1) self.X = pygameJoystick.get_button(2) self.Y = pygameJoystick.get_button(3) self.LB = pygameJoystick.get_button(4) self.RB = pygameJoystick.get_button(5) self.Back = pygameJoystick.get_button(6) self.Start = pygameJoystick.get_button(7) # The center button self.Guide = pygameJoystick.get_button(8) # When you click the thumbsticks self.left_stick = pygameJoystick.get_button(9) self.right_stick = pygameJoystick.get_button(10) # The directional pad on the 360 controller self.dpad = pygameJoystick.get_hat(0) # Limits a particular axis # by returning its value if it is # within the set deadzone. Returns a # zero otherwise. def dead(self, axis): if ( abs(axis) >= self.deadzone ): return axis return 0 # Returns a string that can be sent over the network # and be easily interpreted by an Arduino. def serialized(self): packet = ("<%i,%s,%s,%s,%s>")%( self.ID, hex( int(256*( (self.left_thumb[0]+1)/2 )) ), hex( int(256*( (self.left_thumb[1]+1)/2 )) ), hex( int(256*( (self.right_thumb[0]+1)/2 )) ), hex( int(256*( (self.right_thumb[1]+1)/2 )) ) ) return packet Here is how you can visualize the problem: import pygame import xinput # Define some colors. BLACK = pygame.Color('black') WHITE = pygame.Color('white') # This is a simple class that will help us print to the screen. # It has nothing to do with the joysticks, just outputting the # information. class TextPrint(object): def __init__(self): self.reset() self.font = pygame.font.Font(None, 20) def tprint(self, screen, textString): textBitmap = self.font.render(textString, True, BLACK) screen.blit(textBitmap, (self.x, self.y)) self.y += self.line_height def reset(self): self.x = 10 self.y = 10 self.line_height = 15 def indent(self): self.x += 10 def unindent(self): self.x -= 10 pygame.init() # Set the width and height of the screen (width, height). screen = pygame.display.set_mode((500, 700)) pygame.display.set_caption("ECU Robotics Xbox 360 Controller Layout") # Loop until the user clicks the close button. done = False # Used to manage how fast the screen updates. clock = pygame.time.Clock() # Initialize the joysticks. pygame.joystick.init() # Get ready to print. textPrint = TextPrint() # -------- Main Program Loop ----------- while not done: # # EVENT PROCESSING STEP # # Possible joystick actions: JOYAXISMOTION, JOYBALLMOTION, JOYBUTTONDOWN, # JOYBUTTONUP, JOYHATMOTION for event in pygame.event.get(): # User did something. if event.type == pygame.QUIT: # If user clicked close. done = True # Flag that we are done so we exit this loop. elif event.type == pygame.JOYBUTTONDOWN: print("Joystick button pressed.") elif event.type == pygame.JOYBUTTONUP: print("Joystick button released.") # # DRAWING STEP # # First, clear the screen to white. Don't put other drawing commands # above this, or they will be erased with this command. screen.fill(WHITE) textPrint.reset() # Initialize the connected Xbox controller xpad = xinput.xpad(pygame.joystick.Joystick(0), 0.25) # Print the controller's name textPrint.tprint( screen, xpad.name ) textPrint.tprint(screen, '') # Begin main body... textPrint.indent() # Thumbsticks... textPrint.tprint( screen, ("Left Thumbstick (x, y): %.3f, %.3f")%( xpad.left_thumb[0], xpad.left_thumb[1] ) ) textPrint.tprint( screen, ("Right Thumbstick (x, y): %.3f, %.3f")%( xpad.right_thumb[0], xpad.right_thumb[1] ) ) textPrint.tprint(screen, '') # Triggers... textPrint.tprint( screen, ("Left Trigger: %.3f")%( xpad.left_trig ) ) textPrint.tprint( screen, ("Right Trigger: %.3f")%( xpad.right_trig ) ) textPrint.tprint(screen, '') # Buttons... textPrint.tprint(screen, ("A Button: %i")%(xpad.A)) textPrint.tprint(screen, ("B Button: %i")%(xpad.B)) textPrint.tprint(screen, ("X Button: %i")%(xpad.X)) textPrint.tprint(screen, ("Y Button: %i")%(xpad.Y)) textPrint.tprint(screen, ("Left Bumper: %i")%(xpad.LB)) textPrint.tprint(screen, ("Right Bumper: %i")%(xpad.RB)) textPrint.tprint(screen, ("Start Button: %i")%(xpad.Start)) textPrint.tprint(screen, ("Back Button: %i")%(xpad.Back)) textPrint.tprint(screen, ("Guide Button: %i")%(xpad.Guide)) textPrint.tprint(screen, ("Left Stick Click: %i")%(xpad.left_stick)) textPrint.tprint(screen, ("Right Stick Click: %i")%(xpad.right_stick)) textPrint.tprint(screen, ("D-Pad: %i, %i")%(xpad.dpad[0], xpad.dpad[1])) # Serialized packet... textPrint.tprint(screen, '') textPrint.tprint(screen, 'Format: <ID, J1.x, J1.y, J2.x, J2.y>') textPrint.tprint(screen, ("%s")%(xpad.serialized())) # # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT # # Go ahead and update the screen with what we've drawn. pygame.display.flip() # Limit to 20 frames per second. clock.tick(60) # Close the window and quit. # If you forget this line, the program will 'hang' # on exit if running from IDLE. pygame.quit()

    from GameDev.net https://ift.tt/2MXkvhB
    I have this weird glitch: whenever I am pressing the D-pad on the 360 controller, the A-button also lights up. The A-button returns a 1 for positive and 0 for negative. It returns a 1 whenever I am pressing the 4 directions of the D-pad. Does anyone know how to solve this? By the way, I am using Linux Mint, Python 3.6.8, and Pygame 1.9.6 The source code for the class is below: # Xbox 360 Controller class class xpad: def __init__(self, pygameJoystick, deadzone): self.ID = pygameJoystick.get_id() pygameJoystick.init() self.deadzone = deadzone # Xbox 360 Controller Name self.name = pygameJoystick.get_name() # Thumbsticks self.left_thumb = ( self.dead( pygameJoystick.get_axis(0) ), self.dead( pygameJoystick.get_axis(1) ) ) self.right_thumb = ( self.dead( pygameJoystick.get_axis(3) ), self.dead( pygameJoystick.get_axis(4) ) ) # Triggers self.left_trig = pygameJoystick.get_axis(2) self.right_trig = pygameJoystick.get_axis(5) # Buttons self.A = pygameJoystick.get_button(0) self.B = pygameJoystick.get_button(1) self.X = pygameJoystick.get_button(2) self.Y = pygameJoystick.get_button(3) self.LB = pygameJoystick.get_button(4) self.RB = pygameJoystick.get_button(5) self.Back = pygameJoystick.get_button(6) self.Start = pygameJoystick.get_button(7) # The center button self.Guide = pygameJoystick.get_button(8) # When you click the thumbsticks self.left_stick = pygameJoystick.get_button(9) self.right_stick = pygameJoystick.get_button(10) # The directional pad on the 360 controller self.dpad = pygameJoystick.get_hat(0) # Limits a particular axis # by returning its value if it is # within the set deadzone. Returns a # zero otherwise. def dead(self, axis): if ( abs(axis) >= self.deadzone ): return axis return 0 # Returns a string that can be sent over the network # and be easily interpreted by an Arduino. def serialized(self): packet = ("<%i,%s,%s,%s,%s>")%( self.ID, hex( int(256*( (self.left_thumb[0]+1)/2 )) ), hex( int(256*( (self.left_thumb[1]+1)/2 )) ), hex( int(256*( (self.right_thumb[0]+1)/2 )) ), hex( int(256*( (self.right_thumb[1]+1)/2 )) ) ) return packet Here is how you can visualize the problem: import pygame import xinput # Define some colors. BLACK = pygame.Color('black') WHITE = pygame.Color('white') # This is a simple class that will help us print to the screen. # It has nothing to do with the joysticks, just outputting the # information. class TextPrint(object): def __init__(self): self.reset() self.font = pygame.font.Font(None, 20) def tprint(self, screen, textString): textBitmap = self.font.render(textString, True, BLACK) screen.blit(textBitmap, (self.x, self.y)) self.y += self.line_height def reset(self): self.x = 10 self.y = 10 self.line_height = 15 def indent(self): self.x += 10 def unindent(self): self.x -= 10 pygame.init() # Set the width and height of the screen (width, height). screen = pygame.display.set_mode((500, 700)) pygame.display.set_caption("ECU Robotics Xbox 360 Controller Layout") # Loop until the user clicks the close button. done = False # Used to manage how fast the screen updates. clock = pygame.time.Clock() # Initialize the joysticks. pygame.joystick.init() # Get ready to print. textPrint = TextPrint() # -------- Main Program Loop ----------- while not done: # # EVENT PROCESSING STEP # # Possible joystick actions: JOYAXISMOTION, JOYBALLMOTION, JOYBUTTONDOWN, # JOYBUTTONUP, JOYHATMOTION for event in pygame.event.get(): # User did something. if event.type == pygame.QUIT: # If user clicked close. done = True # Flag that we are done so we exit this loop. elif event.type == pygame.JOYBUTTONDOWN: print("Joystick button pressed.") elif event.type == pygame.JOYBUTTONUP: print("Joystick button released.") # # DRAWING STEP # # First, clear the screen to white. Don't put other drawing commands # above this, or they will be erased with this command. screen.fill(WHITE) textPrint.reset() # Initialize the connected Xbox controller xpad = xinput.xpad(pygame.joystick.Joystick(0), 0.25) # Print the controller's name textPrint.tprint( screen, xpad.name ) textPrint.tprint(screen, '') # Begin main body... textPrint.indent() # Thumbsticks... textPrint.tprint( screen, ("Left Thumbstick (x, y): %.3f, %.3f")%( xpad.left_thumb[0], xpad.left_thumb[1] ) ) textPrint.tprint( screen, ("Right Thumbstick (x, y): %.3f, %.3f")%( xpad.right_thumb[0], xpad.right_thumb[1] ) ) textPrint.tprint(screen, '') # Triggers... textPrint.tprint( screen, ("Left Trigger: %.3f")%( xpad.left_trig ) ) textPrint.tprint( screen, ("Right Trigger: %.3f")%( xpad.right_trig ) ) textPrint.tprint(screen, '') # Buttons... textPrint.tprint(screen, ("A Button: %i")%(xpad.A)) textPrint.tprint(screen, ("B Button: %i")%(xpad.B)) textPrint.tprint(screen, ("X Button: %i")%(xpad.X)) textPrint.tprint(screen, ("Y Button: %i")%(xpad.Y)) textPrint.tprint(screen, ("Left Bumper: %i")%(xpad.LB)) textPrint.tprint(screen, ("Right Bumper: %i")%(xpad.RB)) textPrint.tprint(screen, ("Start Button: %i")%(xpad.Start)) textPrint.tprint(screen, ("Back Button: %i")%(xpad.Back)) textPrint.tprint(screen, ("Guide Button: %i")%(xpad.Guide)) textPrint.tprint(screen, ("Left Stick Click: %i")%(xpad.left_stick)) textPrint.tprint(screen, ("Right Stick Click: %i")%(xpad.right_stick)) textPrint.tprint(screen, ("D-Pad: %i, %i")%(xpad.dpad[0], xpad.dpad[1])) # Serialized packet... textPrint.tprint(screen, '') textPrint.tprint(screen, 'Format: <ID, J1.x, J1.y, J2.x, J2.y>') textPrint.tprint(screen, ("%s")%(xpad.serialized())) # # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT # # Go ahead and update the screen with what we've drawn. pygame.display.flip() # Limit to 20 frames per second. clock.tick(60) # Close the window and quit. # If you forget this line, the program will 'hang' # on exit if running from IDLE. pygame.quit() https://ift.tt/eA8V8J September 04, 2019 at 08:00PM

    ليست هناك تعليقات