Python pygame.key.set_为操纵杆重复

Python pygame.key.set_为操纵杆重复,python,pygame,joystick,Python,Pygame,Joystick,我正在使用pygame构建一个菜单,我想使用特定的gamepad使其可导航。理想情况下,我希望能够在D-pad上反复按住*键,或者像在键盘上一样,在重复输入同一字符之前,第一次按下按钮会有一个延迟(看起来) 我正在尝试模拟操纵杆的pygame.key.set\u repeat(…)功能。到目前为止,我的方法是 pygame.time.set_timer(pygame.USEREVENT, 10) DELAY_TIME = 0.250 #ms y_delay = True while not do

我正在使用pygame构建一个菜单,我想使用特定的gamepad使其可导航。理想情况下,我希望能够在D-pad上反复按住*键,或者像在键盘上一样,在重复输入同一字符之前,第一次按下按钮会有一个延迟(看起来)

我正在尝试模拟操纵杆的
pygame.key.set\u 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
pygame.time.set_计时器(pygame.USEREVENT,10)
延迟时间=0.250毫秒
y_延迟=真
虽然没有这样做:
对于pygame.event.get()中的事件:
y_轴=游戏板。获取_轴(1)
如果y_轴>0.5:#向下推
主菜单。向下移动()
重画()#睡觉前重画表面的一切
如果您延迟:
时间。睡眠(延迟时间)
y_delay=False#下次使用y轴时不要延迟
elif y_轴<-0.5:#向上推
#我知道,但我还在努力
主菜单。向上移动()
重画
如果您延迟:
时间。睡眠(延迟时间)
y_延迟=错误
其他:
y_delay=True#下次再延迟
我的问题是,如果有人点击向上或向下的速度比
DELAY\u TIME
快,那么在他们可以再次移动之前,他们被限制在
DELAY\u TIME
之内。此外,如果有人在
TIME.sleep
间隔内释放并按下向上/向下按钮,python根本看不到它被释放,也不允许延迟


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

Sleep
导致程序停止执行,因此这不是一个可行的选项。您也可以不使用
设置计时器来实现这一点de>和事件。我使用了两个标志和pygame。时间的
获取刻度

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
指示无运动时,设置空档标志,并重置按下的计时器,导致移动标志保持未设置。当空档标志未设置时,如果是新设置的,则设置移动标志。如果不是新设置的,则按下的计时器增加,并且仅当按下的计时器大于延迟时才设置移动