Отредактированный код джойстика не получает входные данные - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь использовать контроллер PS4 с Raspberry Pi для генерации входных данных. Я успешно подключил контроллер, и когда я пытаюсь запустить следующий код, найденный на веб-сайте pygame, все работает нормально.

import pygame


BLACK    = (   0,   0,   0)
WHITE    = ( 255, 255, 255)


class TextPrint:
    def __init__(self):
        self.reset()
        self.font = pygame.font.Font(None, 20)

    def print(self, screen, textString):
        textBitmap = self.font.render(textString, True, BLACK)
        screen.blit(textBitmap, [self.x, self.y])
        self.y += self.line_height

    def reset(self):
        self.x = 10
        self.y = 10
        self.line_height = 15

    def indent(self):
        self.x += 10

    def unindent(self):
        self.x -= 10


pygame.init() 
size = [500, 700]
screen = pygame.display.set_mode(size)
pygame.display.set_caption("My Game")


done = False

clock = pygame.time.Clock()


pygame.joystick.init()


textPrint = TextPrint()


while done==False:

    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
            done=True # Flag that we are done so we exit this loop

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



    screen.fill(WHITE)
    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.3f}".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()

        textPrint.unindent()



    pygame.display.flip()


    clock.tick(20)

pygame.quit ()

Так что да, когда я запускаю приведенный выше код, все работает нормально, однако я вообще не хотел создавать игру, и меня интересует только получение входных данных с d-панели или шляп. чтобы сделать это, я написал свой собственный код, основанный на коде выше

 import pygame
    pygame.joystick.init()
    while True:
        joystick = pygame.joystick.Joystick(0)
        joystick.init()
        hat = joystick.get_hat(0)
        print(str(hat))

Когда я запускаю приведенный выше код, он запускается, и нет никаких синтаксических ошибок, однако он непрерывно печатает (0,0) независимо от того, какие кнопки d-панели я нажал. Контроллер все еще подключен, что говорит мне о том, что по какой-то причине мой новый код не получает входные данные.

Спасибо, что нашли время прочитать этот длинный пост, любая помощь будет принята с благодарностью.

С уважением

1 Ответ

0 голосов
/ 01 ноября 2018

Вы должны регулярно вызывать одну из pygame.event функций (например, pygame.event.pump или for event in pygame.event.get():), в противном случае такие функции, как Joystick.get_hat и pygame.mouse.get_pressed не будут работать, а Pygame через некоторое время окно перестает отвечать на запросы.

Вам также не нужно создавать и инициализировать новый объект джойстика в каждом кадре. Сделайте это один раз перед циклом while. Вот минимальный, полный пример:

import pygame as pg


pg.init()
screen = pg.display.set_mode((100, 100))
clock = pg.time.Clock()

# Create a list of available joysticks and initialize them.
joysticks = [pg.joystick.Joystick(x) for x in range(pg.joystick.get_count())]
for joystick in joysticks:
    joystick.init()

running = True
while running:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            running = False
        elif event.type == pg.JOYBUTTONDOWN:
            if event.button == 6:  # Back button.
                running = False

    for joystick in joysticks:  # Iterate over the available joysticks.
        if joystick.get_id() == 0:  # The first joystick.
            numhats = joystick.get_numhats()
            for hat in range(numhats):  # Check all hats of the joystick.
                print(joystick.get_hat(hat))

    screen.fill((30, 30, 50))
    pg.display.flip()
    clock.tick(60)

pg.quit()
...