Pygame не возвращает движение оси джойстика без отображения - PullRequest
2 голосов
/ 25 мая 2020

Я видел, как другие решения этой проблемы говорят, что вам нужно либо вызвать pygame.event.pump (), либо инициализировать джойстик вне while l oop. Однако даже с этими решениями я получаю 0 для значений осей джойстика.

Если я раскомментирую только pygame.display.set_mode((1, 1)), то код работает должным образом, и значения выводятся на консоль.

Есть ли способ получить значения осей без создания дополнительного окна?

Кроме того, я использую python 3.6 на Windows 10.

import pygame

FRAMES_PER_SECOND = 20

pygame.init()
pygame.joystick.init()

# pygame.display.set_mode((1,1))

# Used to manage how fast the screen updates.
clock = pygame.time.Clock()

xboxController = pygame.joystick.Joystick(0)
xboxController.init()


# Loop until the user presses menu button
done = False

print('Found controller\nStarting loop...')
while not done:
    pygame.event.pump()
    for event in pygame.event.get():
        if event.type == pygame.JOYBUTTONDOWN and event.button == 7:
            print(f'Exiting controller loop')
            done = True

    for i in range(xboxController.get_numaxes()):
        print(f'Axis {i}: {xboxController.get_axis(i)}')

    # pygame.display.flip()

    clock.tick(FRAMES_PER_SECOND)

Вывод:

pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Found controller
Starting loop...
Axis 0: 0.0
Axis 1: 0.0
Axis 2: 0.0
Axis 3: 0.0
Axis 4: 0.0
.
.
.

Ответы [ 2 ]

4 голосов
/ 25 мая 2020

Я бы, вероятно, отказался от Pygame, если вам не нужны все основные GL функции, поскольку библиотека предназначена для разработки игр 2D / 3D. Хотя можно было бы использовать его для этих целей, проблемы в дальнейшем более или менее неизбежны. Возможно, более простой подход - это go с библиотекой python input , которая может работать с геймпадами (джойстиками).

from inputs import get_gamepad

while True:
    events = get_gamepad()
    for event in events:
        if event.ev_type == 'Absolute':
            if event.code == 'ABS_X':
                print(f'Left joystick x: {event.state}')
            elif event.code == 'ABS_Y':
                print(f'Left joystick y: {event.state}')
            elif event.code == 'ABS_RX':
                print(f'Right joystick x: {event.state}')
            elif event.code == 'ABS_RY':
                print(f'Right joystick y: {event.state}')
2 голосов
/ 25 мая 2020

Хорошо, я нашел ответ через 5 минут после того, как разместил это. Проблема заключалась в том, что я использовал pygame 1.9.6 вместо 2.0.0.dev8. После обновления я получаю вывод консоли без окна дисплея.

...