我可以使用没有“视频系统”的pygame,仅用于游戏手柄输入吗?

问题描述 投票:0回答:1

我正在尝试构建一个树莓派控制的机器人。特别是,我想使用游戏手柄来导航机器人。我在台式电脑上编写了以下代码来捕获游戏手柄输入:

import pygame

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

done = False
while not done:
    event = pygame.event.poll()
    if event.type == 1538:
        print(event.dict['value'])
    if event.type == 1540:
        done = True

如果按下导航十字上的按钮,此代码将打印值(例如 (1, 0) ),如果按下另一个按钮,则此代码将终止。

当我在树莓派上运行此代码时,出现以下错误:

pygame.error: video system not initialized

我想问题是,我在命令行上运行代码,而 pygame 需要一个用于视频输出的窗口。但我不想有输出,我只想使用 pygame 读取输入。有没有办法配置 pygame 来做到这一点?

更新

似乎 pygame 无法实现我的目标(参见 rabbid76 的回答)。在寻找替代方案的过程中,我发现了模块inputs。下面的代码正是我想做的:

from inputs import get_gamepad

def isDirectionEvent(event):
    if event.ev_type != 'Absolute':
        return False
    if event.code[0:7] != 'ABS_HAT':
        return False

    return True


def isTerminateEvent(event):
    if event.ev_type != 'Absolute':
        return False
    if event.code != 'MSC_SCAN':
        return False

    return True


def getInput(event):
    if event.code[8:9] == 'X' and event.state == 1:
        return 'right'
    if event.code[8:9] == 'X' and event.state == -1:
        return 'left'
    if event.code[8:9] == 'Y' and event.state == 1:
        return 'backward'
    if event.code[8:9] == 'Y' and event.state == -1:
        return 'forward'

    return 'stop'


done = False
while not done:
    events = get_gamepad()
    for event in events:
        if isDirectionEvent(event):
            print(getInput(event))
        if isTerminateEvent(event):
            done = True
pygame raspberry-pi gamepad
1个回答
0
投票

不,你不能。参见

pygame.event

Pygame 通过事件队列处理所有事件消息传递。本模块中的例程可帮助您管理该事件队列。输入队列严重依赖

pygame.display
模块来控制显示窗口和屏幕模块。如果显示屏尚未初始化并且未设置视频模式,事件队列可能无法正常工作。

因此您需要一个窗口和视频系统来处理事件。

© www.soinside.com 2019 - 2024. All rights reserved.