2013-03-23 130 views
1

我正在用pygame建立一個菜單,並且我想讓它使用特定的遊戲手柄進行導航。理想情況下,我希望能夠反覆按壓和按住D-pad上的按鈕,或者在鍵盤上按住第一個按鈕,然後重複輸入相同的字符(看似),然後再按下。 「M試圖仿效的pygame.key.set_repeat(...)功能操縱桿。我的做法至今一直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程序中進行映射。

回答

3

Sleep導致程序停止執行,所以它不是一個可行的選項。您也可以在不使用set_timer和事件的情況下執行此操作。 I 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表示無運動,所述中性標誌被設置,並且被按下的定時器被複位,導致移動標誌來保持未設置。未設置中立標誌時,如果新設置,則移動標誌置位。如果沒有重新設置,按下的計時器會增加,並且只有在按下的計時器大於延遲時纔會設置移動。