Использование модуля джойстика от PyGame

1

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

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 Axis 3 is equal to 1:
        print("Joystick 2 is pointing to the right.")

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

textPrint.unindent()
  • 1
    Каков твой вопрос? Что ты хочешь делать? Что вы пробовали?
  • 0
    @skrx Спасибо за ваш ответ. Я обновил свой вопрос вашими предложениями.
Показать ещё 5 комментариев
Теги:
gamepad
pygame
joystick

1 ответ

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню