1

pygame を使用してメニューを作成していますが、特定のゲームパッドを使用してナビゲートできるようにしたいと考えています。理想的には、D-pad で *down" を繰り返し押したり、同じ文字を繰り返し入力する前に最初のボタンを押したときに遅延があるキーボードのようなものを取得したいと考えています (一見)。

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_timerand イベントを使用せずにこれを行うこともできます。いくつかのフラグと 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ないことを示すと、ニュートラル フラグが設定され、押されたタイマーがリセットされ、移動フラグが設定されないままになります。中立フラグがセットされていない場合、新たにセットされた場合は移動フラグがセットされます。新しく設定されていない場合は、押されたタイマーが増加し、押されたタイマーが遅延よりも大きい場合にのみ移動が設定されます。

于 2013-03-24T09:10:54.103 に答える