class PyGameJoystick(BaseJoystick): """A joystick for collecting responses""" def __init__(self, joybuttonlist=settings.JOYBUTTONLIST, timeout=settings.JOYTIMEOUT): """Initializes joystick object (joybuttonlist: list of buttons; timeout: timeout in ms) arguments None keyword arguments joybuttonlist -- list of joystick buttons that are allowed (e.g. [0,2,4]) or None to allow all buttons (default = JOYBUTTONLIST) timeout -- time in milliseconds after which None is returned on a call to a get_* method when no input is registered (default = JOYTIMEOUT) """ # try to import copy docstring (but ignore it if it fails, as we do # not need it for actual functioning of the code) try: copy_docstr(BaseJoystick, PyGameJoystick) except: # we're not even going to show a warning, since the copied # docstring is useful for code editors; these load the docs # in a non-verbose manner, so warning messages would be lost pass # initialize joystick pygame.init() pygame.joystick.init() self.js = Joystick(0) self.js.init() # set joystick characteristics self.set_joybuttonlist(joybuttonlist) self.set_timeout(timeout) def set_joybuttonlist(self, joybuttonlist=None): """Set a list of accepted joystick buttons arguments None keyword arguments joybuttonlist -- list of joystick buttons that are allowed (e.g. [0,2,4]) or None to allow all buttons (default = None) returns Nothing -- sets the jbuttonlist property """ if joybuttonlist == None or joybuttonlist == []: self.jbuttonlist = None else: self.jbuttonlist = [] for joybutton in joybuttonlist: self.jbuttonlist.append(joybutton) def set_timeout(self, timeout=None): """Set a timeout (in milliseconds) arguments None keyword arguments timeout -- time in milliseconds after which None is returned on a call to get_clicked method when no click is registered (default = None) returns Nothing -- sets timeout property """ self.timeout = timeout def get_joybutton(self, joybuttonlist="default", timeout="default"): """Waits for joystick buttonpress arguments None keyword arguments joybuttonlist -- list of buttons that are allowed (e.g. [0,2,4]), None to allow all buttons or "default" to use jbuttonlist property (default = "default") timeout -- time in milliseconds after which None is returned when no buttonpress is registered; None for no timeout or "default" to use the timeout property (default = "default") returns button, presstime -- button is an integer, indicating which button has been pressed or None when no button has been pressed presstime is the time (measured from expbegintime) a buttonpress or a timeout occured """ # set joybuttonlist and timeout if joybuttonlist == "default": joybuttonlist = self.jbuttonlist if timeout == "default": timeout = self.timeout # register start time starttime = clock.get_time() time = copy.copy(starttime) # wait for button press while timeout == None or time - starttime <= timeout: time = clock.get_time() for event in pygame.event.get(): if event.type == pygame.JOYBUTTONDOWN: time = clock.get_time() if joybuttonlist == None or event.button in joybuttonlist: pressed = event.button return pressed, time # in case of timeout return None, time def get_joyaxes(self, timeout="default"): """Waits for joystick axis movement arguments None keyword arguments timeout -- time in milliseconds after which None is returned when no buttonpress is registered; None for no timeout or "default" to use the timeout property (default = "default") returns axespos, time -- axespos is a [x,y,z] position list for the positions of the joystick axes (usually [x,y,z] for the main stick); x, y and z are floats time is the time (measured from expbegintime) an axismovement or a timeout occured """ # set timeout if timeout == "default": timeout = self.timeout # start time and pos pos = [] starttime = clock.get_time() time = copy.copy(starttime) # wait for axis movement while timeout == None or time - starttime <= timeout: time = clock.get_time() for event in pygame.event.get(): if event.type == pygame.JOYAXISMOTION: time = clock.get_time() for axis in range(self.js.get_numaxes()): pos.append(self.js.get_axis(axis)) return pos, time # in case of timeout return None, time def get_joyballs(self, timeout="default"): """Waits for joystick trackball movement arguments None keyword arguments timeout -- time in milliseconds after which None is returned when no buttonpress is registered; None for no timeout or "default" to use the timeout property (default = "default") returns ballpos, time -- ballpos is a [ball1,ball2,...,ballN] position list for the positions of the joystick balls; each ball position is a (x,y) tuple time is the time (measured from expbegintime) a ballmovement or a timeout occured """ # set timeout if timeout == "default": timeout = self.timeout # start time and pos ballpos = [] starttime = clock.get_time() time = copy.copy(starttime) # wait for axis movement while timeout == None or time - starttime <= timeout: time = clock.get_time() for event in pygame.event.get(): if event.type == pygame.JOYBALLMOTION: time = clock.get_time() for ball in range(self.js.get_numballs()): ballpos.append(self.js.get_ball(ball)) return ballpos, time # in case of timeout return None, time def get_joyhats(self, timeout="default"): """Waits for joystick hat movement arguments None keyword arguments timeout -- time in milliseconds after which None is returned when no buttonpress is registered; None for no timeout or "default" to use the timeout property (default = "default") returns hatpos, time -- hatpos is a [hat1,hat2,...,hatN] position list for the positions of the joystick hats; each hat position is a (x,y) tuple time is the time (measured from expbegintime) a hatmovement or a timeout occured """ # set timeout if timeout == "default": timeout = self.timeout # start time and pos hatpos = [] starttime = clock.get_time() time = copy.copy(starttime) # wait for axis movement while timeout == None or time - starttime <= timeout: time = clock.get_time() for event in pygame.event.get(): if event.type == pygame.JOYHATMOTION: time = clock.get_time() for hat in range(self.js.get_numhats()): hatpos.append(self.js.get_hat(hat)) return hatpos, time # in case of timeout return None, time def get_joyinput(self, joybuttonlist="default", timeout="default"): """Waits for any kind of joystick input arguments None keyword arguments joybuttonlist -- list of buttons that are allowed (e.g. [0,2,4]), None to allow all buttons or "default" to use jbuttonlist property (default = "default") timeout -- time in milliseconds after which None is returned when no buttonpress is registered; None for no timeout or "default" to use the timeout property (default = "default") returns event, input, time -- event is a string or None on a timeout, indicating what kind of input was given: 'joybuttonpress', input is an integer button number 'joyaxismotion', input is a [x,y,z] position list for the positions of the joystick axes (usually [x,y,z] for the main stick); x, y and z are floats 'joyballmotion', input is a [ball1,ball2,...,ballN] position list for the positions of the joystick balls; each ball position is a (x,y) tuple 'joyhatmotion', input is a [hat1,hat2,...,hatN] position list for the positions of the joystick hats; each hat position is a (x,y) tuple time is the time (measured from expbegintime) any input or a timeout occured """ # set joybuttonlist and timeout if joybuttonlist == "default": joybuttonlist = self.jbuttonlist if timeout == "default": timeout = self.timeout # start values pos = [] ballpos = [] hatpos = [] eventtype = None starttime = clock.get_time() time = copy.copy(starttime) # wait for input while timeout == None or time - starttime <= timeout: time = clock.get_time() for event in pygame.event.get(): if event.type == pygame.JOYBUTTONDOWN: time = clock.get_time() if joybuttonlist == None or event.button in joybuttonlist: eventtype = "joybuttonpress" pressed = event.button return eventtype, pressed, time if event.type == pygame.JOYAXISMOTION: time = clock.get_time() eventtype = "joyaxismotion" for axis in range(self.js.get_numaxes()): pos.append(self.js.get_axis(axis)) return eventtype, pos, time if event.type == pygame.JOYBALLMOTION: time = clock.get_time() eventtype = "joyballmotion" for ball in range(self.js.get_numballs()): ballpos.append(self.js.get_ball(ball)) return eventtype, ballpos, time if event.type == pygame.JOYHATMOTION: time = clock.get_time() eventtype = "joyhatmotion" for hat in range(self.js.get_numhats()): hatpos.append(self.js.get_hat(hat)) return eventtype, hatpos, time # in case of timeout return eventtype, None, time
def run_game(): # Initialize Pygame pygame.mixer.pre_init(frequency=44100) pygame.init() # Initialize settings, preload assets, and create a clock settings = Settings() sounds = Sounds(settings) images = Images() clock = pygame.time.Clock() # Set up the window pygame.display.set_icon(images.icon) screen = pygame.display.set_mode( (settings.screen_width, settings.screen_height)) pygame.display.set_caption("Bullet Heck!") # Try to create a joystick object try: gamepad = Joystick(settings.gamepad_id) gamepad.init() settings.gamepad_connected = True except pygame.error: gamepad = None settings.gamepad_connected = False # Initialize the stats, HUD, and splash screen stats = Stats(settings) hud = HUD(settings, screen, stats, images) splash = SplashScreen(settings, images, screen) # Create the ship and groups for everything else ship = Ship(settings, screen, stats, images) stars = Group() bullets = Group() enemies = Group() enemy_bullets = Group() explosions = Group() pickups = Group() if not settings.mute_music: pygame.mixer.music.play(loops=-1) # Pause the music by default pygame.mixer.music.pause() # Main loop while stats.done is False: gf.check_events(settings, screen, ship, gamepad, bullets, stats, sounds, enemies, images, enemy_bullets, splash, hud) gf.update_stars(settings, screen, stars, images) gf.manage_game_level(settings, stats) if stats.game_active: ship.update(settings, images) gf.spawn_enemies(settings, screen, enemies, images, id, stats) gf.update_bullets(settings, screen, ship, bullets, enemies, sounds, enemy_bullets, images, stats, hud, explosions, pickups, splash) gf.update_enemy_stuff(settings, screen, ship, enemies, sounds, stats, explosions, images, pickups, hud, bullets, enemy_bullets, splash) # Update the explosions even if the game is paused. gf.update_explosions(explosions) gf.update_screen(settings, screen, stars, ship, bullets, enemies, explosions, pickups, hud, stats, enemy_bullets, splash) clock.tick(settings.fps_limit) if settings.show_fps: stats.fps = clock.get_fps()
# Have a rocket centered on the screen that can move in all 4 directions. import pygame from pygame.joystick import Joystick import sys pygame.init() screen = pygame.display.set_mode((800, 800)) rocket = pygame.image.load('rocket.png') joystick = Joystick(0) joystick.init() clock = pygame.time.Clock() pygame.display.set_caption("Movable Rocket") rocketrect = rocket.get_rect() screen_rect = screen.get_rect() rocketrect.centerx = screen_rect.centerx rocketrect.centery = screen_rect.centery centerx = float(rocketrect.centerx) centery = float(rocketrect.centery) moving_right = False moving_left = False moving_up = False moving_down = False an_up, an_down, an_left, an_right = 0, 0, 0, 0 def update_digital(rocket): global centerx, centery, moving_right, moving_left, moving_up, moving_down if moving_right and rocketrect.right < screen_rect.right: centerx += 10 if moving_left and rocketrect.left > 0: centerx -= 10 if moving_up and rocketrect.top > 0:
def __createJoystick__(self, jid): aJoystick = Joystick(jid) aJoystick.init() self.joyList[jid] = aJoystick self.joyList["[{id}]{name}".format(id=jid, name=aJoystick.get_name())] = aJoystick
class PyGameJoystick(BaseJoystick): """A joystick for collecting responses""" def __init__(self, joybuttonlist=settings.JOYBUTTONLIST, timeout=settings.JOYTIMEOUT): """Initializes joystick object (joybuttonlist: list of buttons; timeout: timeout in ms) arguments None keyword arguments joybuttonlist -- list of joystick buttons that are allowed (e.g. [0,2,4]) or None to allow all buttons (default = JOYBUTTONLIST) timeout -- time in milliseconds after which None is returned on a call to a get_* method when no input is registered (default = JOYTIMEOUT) """ # try to import copy docstring (but ignore it if it fails, as we do # not need it for actual functioning of the code) try: copy_docstr(BaseJoystick, PyGameJoystick) except: # we're not even going to show a warning, since the copied # docstring is useful for code editors; these load the docs # in a non-verbose manner, so warning messages would be lost pass # initialize joystick pygame.init() pygame.joystick.init() self.js = Joystick(0) self.js.init() # set joystick characteristics self.set_joybuttonlist(joybuttonlist) self.set_timeout(timeout) def set_joybuttonlist(self, joybuttonlist=None): """Set a list of accepted joystick buttons arguments None keyword arguments joybuttonlist -- list of joystick buttons that are allowed (e.g. [0,2,4]) or None to allow all buttons (default = None) returns Nothing -- sets the jbuttonlist property """ if joybuttonlist == None or joybuttonlist == []: self.jbuttonlist = None else: self.jbuttonlist = [] for joybutton in joybuttonlist: self.jbuttonlist.append(joybutton) def set_timeout(self, timeout=None): """Set a timeout (in milliseconds) arguments None keyword arguments timeout -- time in milliseconds after which None is returned on a call to get_clicked method when no click is registered (default = None) returns Nothing -- sets timeout property """ self.timeout = timeout def get_joybutton(self, joybuttonlist='default', timeout='default'): """Waits for joystick buttonpress arguments None keyword arguments joybuttonlist -- list of buttons that are allowed (e.g. [0,2,4]), None to allow all buttons or 'default' to use jbuttonlist property (default = 'default') timeout -- time in milliseconds after which None is returned when no buttonpress is registered; None for no timeout or 'default' to use the timeout property (default = 'default') returns button, presstime -- button is an integer, indicating which button has been pressed or None when no button has been pressed presstime is the time (measured from expbegintime) a buttonpress or a timeout occured """ # set joybuttonlist and timeout if joybuttonlist == 'default': joybuttonlist = self.jbuttonlist if timeout == 'default': timeout = self.timeout # register start time starttime = clock.get_time() time = starttime # wait for button press while timeout == None or time - starttime <= timeout: time = clock.get_time() for event in pygame.event.get(): if event.type == pygame.JOYBUTTONDOWN: time = clock.get_time() if joybuttonlist == None or event.button in joybuttonlist: pressed = event.button return pressed, time # in case of timeout return None, time def get_joyaxes(self, timeout='default'): """Waits for joystick axis movement arguments None keyword arguments timeout -- time in milliseconds after which None is returned when no buttonpress is registered; None for no timeout or 'default' to use the timeout property (default = 'default') returns axespos, time -- axespos is a [x,y,z] position list for the positions of the joystick axes (usually [x,y,z] for the main stick); x, y and z are floats time is the time (measured from expbegintime) an axismovement or a timeout occured """ # set timeout if timeout == 'default': timeout = self.timeout # start time and pos pos = [] starttime = clock.get_time() time = starttime # wait for axis movement while timeout == None or time - starttime <= timeout: time = clock.get_time() for event in pygame.event.get(): if event.type == pygame.JOYAXISMOTION: time = clock.get_time() for axis in range(self.js.get_numaxes()): pos.append(self.js.get_axis(axis)) return pos, time # in case of timeout return None, time def get_joyballs(self, timeout='default'): """Waits for joystick trackball movement arguments None keyword arguments timeout -- time in milliseconds after which None is returned when no buttonpress is registered; None for no timeout or 'default' to use the timeout property (default = 'default') returns ballpos, time -- ballpos is a [ball1,ball2,...,ballN] position list for the positions of the joystick balls; each ball position is a (x,y) tuple time is the time (measured from expbegintime) a ballmovement or a timeout occured """ # set timeout if timeout == 'default': timeout = self.timeout # start time and pos ballpos = [] starttime = clock.get_time() time = starttime # wait for axis movement while timeout == None or time - starttime <= timeout: time = clock.get_time() for event in pygame.event.get(): if event.type == pygame.JOYBALLMOTION: time = clock.get_time() for ball in range(self.js.get_numballs()): ballpos.append(self.js.get_ball(ball)) return ballpos, time # in case of timeout return None, time def get_joyhats(self, timeout='default'): """Waits for joystick hat movement arguments None keyword arguments timeout -- time in milliseconds after which None is returned when no buttonpress is registered; None for no timeout or 'default' to use the timeout property (default = 'default') returns hatpos, time -- hatpos is a [hat1,hat2,...,hatN] position list for the positions of the joystick hats; each hat position is a (x,y) tuple time is the time (measured from expbegintime) a hatmovement or a timeout occured """ # set timeout if timeout == 'default': timeout = self.timeout # start time and pos hatpos = [] starttime = clock.get_time() time = starttime # wait for axis movement while timeout == None or time - starttime <= timeout: time = clock.get_time() for event in pygame.event.get(): if event.type == pygame.JOYHATMOTION: time = clock.get_time() for hat in range(self.js.get_numhats()): hatpos.append(self.js.get_hat(hat)) return hatpos, time # in case of timeout return None, time def get_joyinput(self, joybuttonlist='default', timeout='default'): """Waits for any kind of joystick input arguments None keyword arguments joybuttonlist -- list of buttons that are allowed (e.g. [0,2,4]), None to allow all buttons or 'default' to use jbuttonlist property (default = 'default') timeout -- time in milliseconds after which None is returned when no buttonpress is registered; None for no timeout or 'default' to use the timeout property (default = 'default') returns event, input, time -- event is a string or None on a timeout, indicating what kind of input was given: 'joybuttonpress', input is an integer button number 'joyaxismotion', input is a [x,y,z] position list for the positions of the joystick axes (usually [x,y,z] for the main stick); x, y and z are floats 'joyballmotion', input is a [ball1,ball2,...,ballN] position list for the positions of the joystick balls; each ball position is a (x,y) tuple 'joyhatmotion', input is a [hat1,hat2,...,hatN] position list for the positions of the joystick hats; each hat position is a (x,y) tuple time is the time (measured from expbegintime) any input or a timeout occured """ # set joybuttonlist and timeout if joybuttonlist == 'default': joybuttonlist = self.jbuttonlist if timeout == 'default': timeout = self.timeout # start values pos = [] ballpos = [] hatpos = [] eventtype = None starttime = clock.get_time() time = starttime # wait for input while timeout == None or time - starttime <= timeout: time = clock.get_time() for event in pygame.event.get(): if event.type == pygame.JOYBUTTONDOWN: time = clock.get_time() if joybuttonlist == None or event.button in joybuttonlist: eventtype = 'joybuttonpress' pressed = event.button return eventtype, pressed, time if event.type == pygame.JOYAXISMOTION: time = clock.get_time() eventtype = 'joyaxismotion' for axis in range(self.js.get_numaxes()): pos.append(self.js.get_axis(axis)) return eventtype, pos, time if event.type == pygame.JOYBALLMOTION: time = clock.get_time() eventtype = 'joyballmotion' for ball in range(self.js.get_numballs()): ballpos.append(self.js.get_ball(ball)) return eventtype, ballpos, time if event.type == pygame.JOYHATMOTION: time = clock.get_time() eventtype = 'joyhatmotion' for hat in range(self.js.get_numhats()): hatpos.append(self.js.get_hat(hat)) return eventtype, hatpos, time # in case of timeout return eventtype, None, time