操纵杆的pygame.key.set_repeat

时间:2013-03-23 22:10:15

标签: python pygame joystick

我正在使用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程序中进行映射。

1 个答案:

答案 0 :(得分:3)

Sleep导致程序暂停执行,因此它不是一个可行的选择。您也可以在不使用set_timer和事件的情况下执行此操作。我did it使用了几个标志和pygame.time的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表示没有动作时,设置中性标志,并重置按下的计时器,使移动标志保持不动。当未设置中性标志时,如果它是新设置的,则设置移动标志。如果没有重新设置,按下的定时器会增加,只有当按下的定时器大于延迟时才会设置移动。