Использование модуля джойстика от PyGame - PullRequest
0 голосов
/ 22 сентября 2018

Точный код с комментариями можно найти здесь или здесь .

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)

С помощью онлайн-документации PyGame я смог произвестиэкран, отображающий значения для отдельных джойстиков. Как бы я перевел эти значения в событие, которое говорит, что эта кнопка нажата, теперь сделайте это?

Что-то похожее на это,

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()

1 Ответ

0 голосов
/ 24 сентября 2018

Большинство игр обрабатывают входные данные геймпада как часть «основного цикла», который запускается как минимум один раз за кадр.Если у вас есть код для чтения входов с геймпада, вы должны поместить его в основной цикл (возможно, ближе к верху), а затем сделать еще один шаг, который обрабатывает ввод и обновляет состояние игры.Вот где вы должны делать такие вещи, как смотреть на значения кнопок и решать, как преобразовать их в игровые действия.После обновления состояния игры вы можете перерисовать экран в соответствии с новым состоянием игры и дождаться следующего кадра.

Вы также можете обрабатывать входные данные геймпада как события и обрабатывать их синхронно, но это трудно понять правильнопотому что вход может прийти в любое время.Для большинства приложений лучше обрабатывать все входные данные геймпада одновременно.Если вы обрабатываете входные изменения синхронно, вы можете рассматривать обновления как независимые, когда они должны быть собраны вместе.Например, когда джойстик перемещается, изменения X и Y должны рассматриваться как часть одного и того же изменения ввода.Если вы не будете осторожны, то если будете относиться к ним независимо, это может привести к появлению ступенчатой ​​схемы при переводе на движение в игре.

...