1

我正在使用 pygame 构建一个菜单,我想使用特定的游戏手柄使其可导航。理想情况下,我希望能够在 D-pad 上反复按下并按住“*”,或者在键盘上获得类似的东西,其中第一个按钮按下有延迟,然后再重复输入相同的字符(似乎)。

我正在尝试模拟pygame.key.set_repeat(...)操纵杆的功能。到目前为止,我的方法是

pygame.time.set_timer(pygame.USEREVENT, 10)
DELAY_TIME = 0.250 #ms
y_delay = True
while not done:
    for event in pygame.event.get():
        y_axis = gamepad.get_axis(1)
        if y_axis > 0.5: # pushing down
            main_menu.move_down()
            redraw() #redraw everything on the surface before sleeping
            if y_delay:
                time.sleep(DELAY_TIME)
                y_delay = False #don't delay the next time the y axis is used


        elif y_axis < -0.5: #pushing up
            # repetitive I know, but I'm still working on it
            main_menu.move_up()
            redraw()
            if y_delay: 
                time.sleep(DELAY_TIME)
                y_delay = False 

        else:
            y_delay = True # delay the next time

我的问题是,如果有人向上或向下点击的速度超过了他们再次移动之前DELAY_TIME的限制。DELAY_TIME此外,如果有人在间隔内释放并按下向上/向下按钮time.sleep,python 永远不会看到它被释放并且不允许延迟。

也许有一种方法可以使用事件或以某种方式将操纵杆映射到键?qjoypad 不适合我,joy2keys 是垃圾。我需要在 python 程序中进行映射。

4

1 回答 1

3

Sleep导致程序停止执行,因此它不是一个可行的选择。您也可以在不使用set_timer和事件的情况下执行此操作。我使用几个标志和 pygame.time's 来做到这get_ticks一点。

import pygame
from pygame.locals import *

def main():
    pygame.init()
    pygame.display.set_mode((480, 360))
    gamepad = pygame.joystick.Joystick(0)
    gamepad.init()

    delay = 1000
    neutral = True
    pressed = 0
    last_update = pygame.time.get_ticks()

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                return

        move = False
        if gamepad.get_axis(1) == 0:
            neutral = True
            pressed = 0
        else:
            if neutral:
                move = True
                neutral = False
            else:
                pressed += pygame.time.get_ticks() - last_update
        if pressed > delay:
            move = True
            pressed -= delay
        if move:
            print "move"
        last_update = pygame.time.get_ticks()

if __name__ == "__main__":
    main()
    pygame.quit()

get_axis指示没有运动时,中性标志被设置,并且按下的计时器被重置,导致移动标志保持未设置。当中立标志未设置时,如果它是新设置的,则设置移动标志。如果不是新设置的,则按下计时器增加,并且仅当按下计时器大于延迟时才设置移动。

于 2013-03-24T09:10:54.103 回答