Точный код с комментариями можно найти здесь или здесь.
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()
Большинство игр обрабатывают геймпадные входы как часть "основного цикла", который запускается не реже одного раза в кадр. Если у вас есть код для чтения геймпадных входов, тогда вы должны поместить его в основной цикл (вероятно, около вершины), а затем выполнить следующий шаг, который обрабатывает вход и обновляет состояние игры. То, где вы должны делать такие вещи, как смотреть на значения кнопок и решать, как их перевести в игровые действия. После обновления состояния игры вы можете перерисовать экран в соответствии с новым состоянием игры и дождаться следующего кадра.
Вы также можете обрабатывать входные данные геймпада как события и обрабатывать их синхронно, но это сложно сделать правильно, потому что вход может прийти в любое время. Для большинства приложений лучше всего обрабатывать все входные данные геймпада одновременно. Если вы обрабатываете изменения ввода синхронно, вы можете рассматривать обновления как независимые, когда их следует брать вместе. Например, при перемещении джойстика изменения X и Y следует рассматривать как часть одного и того же изменения ввода. Если вы не будете осторожны, обработка их самостоятельно может привести к созданию ступенчатого шаблона при переводе в движение внутри игры.