Python Forum
[PyGame] Using joystick module from PyGame - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Game Development (https://python-forum.io/forum-11.html)
+--- Thread: [PyGame] Using joystick module from PyGame (/thread-12990.html)



Using joystick module from PyGame - archieab - Sep-22-2018

Exact code with commenting can be found here, or here.

while done==False:
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        done=True

    if event.type == pygame.JOYBUTTONDOWN:
        print("Joystick button pressed.")
    if event.type == pygame.JOYBUTTONUP:
        print("Joystick button released.")

screen.fill(darkgrey)
textPrint.reset()

joystick_count = pygame.joystick.get_count()

textPrint.print(screen, "Number of joysticks: {}".format(joystick_count) )
textPrint.indent()

for i in range(joystick_count):
    joystick = pygame.joystick.Joystick(i)
    joystick.init()

    textPrint.print(screen, "Joystick {}".format(i) )
    textPrint.indent()

    name = joystick.get_name()
    textPrint.print(screen, "Joystick name: {}".format(name) )

    axes = joystick.get_numaxes()
    textPrint.print(screen, "Number of axes: {}".format(axes) )
    textPrint.indent()

    for i in range( axes ):
        axis = joystick.get_axis( i )
        textPrint.print(screen, "Axis {} value: {:>6.0f}".format(i, axis) )
    textPrint.unindent()

    buttons = joystick.get_numbuttons()
    textPrint.print(screen, "Number of buttons: {}".format(buttons) )
    textPrint.indent()

    for i in range( buttons ):
        button = joystick.get_button( i )
        textPrint.print(screen, "Button {:>2} value: {}".format(i,button) )
    textPrint.unindent()

    hats = joystick.get_numhats()
    textPrint.print(screen, "Number of hats: {}".format(hats) )
    textPrint.indent()

    for i in range( hats ):
        hat = joystick.get_hat( i )
        textPrint.print(screen, "Hat {} value: {}".format(i, str(hat)) )
    textPrint.unindent()

pygame.display.flip()
clock.tick(20)
With the help of the online PyGame documentation, I was able to produce a screen displaying values for individual Joysticks. Sadly, I'm unsure on how I could translate these values to an event that produces something like, "this button is pressed, now do this".


RE: Using joystick module from PyGame - Larz60+ - Sep-22-2018

not a pygame expert, but it appears that in the code:
    if event.type == pygame.JOYBUTTONDOWN:
        print("Joystick button pressed.")
    if event.type == pygame.JOYBUTTONUP:
        print("Joystick button released.")
instead of just printing, call a function, for example:
    if event.type == pygame.JOYBUTTONDOWN:
        process_button_down_stuff()
    if event.type == pygame.JOYBUTTONUP:
        process_button_up_stuff()



RE: Using joystick module from PyGame - archieab - Sep-22-2018

(Sep-22-2018, 08:16 PM)Larz60+ Wrote: not a pygame expert, but it appears that in the code:
    if event.type == pygame.JOYBUTTONDOWN:
        print("Joystick button pressed.")
    if event.type == pygame.JOYBUTTONUP:
        print("Joystick button released.")
instead of just printing, call a function, for example:
    if event.type == pygame.JOYBUTTONDOWN:
        process_button_down_stuff()
    if event.type == pygame.JOYBUTTONUP:
        process_button_up_stuff()

Hi Larz,
Thanks for the reply. What you have suggested would work, but isn’t specific to the pos and neg values. Is there a way, maybe here,
axes = joystick.get_numaxes()
        textPrint.print(screen, "Number of axes: {}".format(axes) )
        textPrint.indent()
Where I could say “If joystick no.1’s axis no.3 is 1, then print ‘hello!’”?

Cheers.


RE: Using joystick module from PyGame - archieab - Sep-22-2018

Something similar to this,
for i in range( axes ):
    axis = joystick.get_axis( i )
    textPrint.print(screen, "Axis {} value: {:>6.0f}".format(i, axis) )

    if Joystick 2's Axis 3 is equal to 1:
        print("Joystick 2 is pointing to the right.")

    if Joystick 2's Axis 3 is equal to -1:
        print("Joystick 2 is pointing to the left.")

textPrint.unindent()



RE: Using joystick module from PyGame - Larz60+ - Sep-23-2018

I'd have to have a setup that I could try to say definitively what would and wouldn't work. Some of the moderators here use pygame and will respond sooner or later. metulburr for one.


RE: Using joystick module from PyGame - Windspar - Sep-23-2018

Joystick event example.
import pygame
pygame.init()

def main():
    pygame.display.set_caption('JoyStick Example')
    surface = pygame.display.set_mode((800, 600))
    clock = pygame.time.Clock()
    running = True

    font = pygame.font.Font(None, 20)
    linesize = font.get_linesize()
    joysticks = [pygame.joystick.Joystick(i) for i in range(pygame.joystick.get_count())]
    for joy in joysticks:
        joy.init()

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.JOYAXISMOTION:
                print(event)
            elif event.type == pygame.JOYHATMOTION:
                print(event)
            elif event.type == pygame.JOYBUTTONDOWN:
                print(event)

        surface.fill((0,0,0))


        pygame.display.flip()
        clock.tick(20)

    pygame.quit()

main()
joystick states example.
import pygame
pygame.init()

def main():
    pygame.display.set_caption('JoyStick Example')
    surface = pygame.display.set_mode((800, 600))
    clock = pygame.time.Clock()
    running = True

    font = pygame.font.Font(None, 20)
    linesize = font.get_linesize()
    joysticks = [pygame.joystick.Joystick(i) for i in range(pygame.joystick.get_count())]
    print(len(joysticks))
    for joy in joysticks:
        joy.init()

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        surface.fill((0,0,0))

        # joystick buttons
        for j in range(len(joysticks)):
            for i in range(joysticks[j].get_numbuttons()):
                if joysticks[j].get_button(i):
                    print("Joystick {}, Button {} pressed".format(j, i))

        pygame.display.flip()
        clock.tick(20)

    pygame.quit()

main()



RE: Using joystick module from PyGame - archieab - Sep-25-2018

I'm unsure on how to mark this post as solved, but I managed to work out a solution.