我正在使用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程序中进行映射。
答案 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
表示没有动作时,设置中性标志,并重置按下的计时器,使移动标志保持不动。当未设置中性标志时,如果它是新设置的,则设置移动标志。如果没有重新设置,按下的定时器会增加,只有当按下的定时器大于延迟时才会设置移动。