2

ジョイスティックにカーソルを制御する簡単な python スクリプトを作成しました。これがどのように機能するかを知るための私の方法は、ここに文書化されています。これで問題なく動作しますが、ジョイスティックを使用するスクリプトを開始するとすぐに、新しいジョイスティック イベントが発生するたびに、Python ルーチンが値を元に戻すため、マウスは役に立ちません。

したがって、キーボードのキーが押されている限り、ジョイスティック イベントを無視したいと考えています。メソッドに出くわしましたpygame.key.get_pressed()が、これは pygame ウィンドウがフォーカスされている場合にのみ機能するようです。このスクリプトをバックグラウンドで実行したい。非 pygame イベントを使用してキーボードをリッスンする必要がありますか、または pygame を介してバックグラウンドで認識されるジョイスティック イベントに類似したキーボード イベントを追跡する方法はありますか?

4

2 に答える 2

4

pygame は独自の「サンドボックス」を設定して、ウィンドウの外側からの入力を検出しにくくしていると思います。前の質問は、win32apiモジュールも使用していることを示しています。これを使用して、グローバルなキーの押下を検出できます。

グローバル スコープでキーの押下を検出する正しい方法は、 SetWindowsHookExを使用してキーボード フックを設定することです。残念ながら、win32api はそのメソッドを公開していないため、効率の悪いメソッドを使用する必要があります。

GetKeyStateメソッドを使用して、キーがダウンかアップかを判断できますキーの状態を継続的にチェックして、ユーザーが最近キーを押したり離したりしたかどうかを確認できます。

import win32api
import time

def keyWasUnPressed():
    print "enabling joystick..."
    #enable joystick here

def keyWasPressed():
    print "disabling joystick..."
    #disable joystick here

def isKeyPressed(key):
    #"if the high-order bit is 1, the key is down; otherwise, it is up."
    return (win32api.GetKeyState(key) & (1 << 7)) != 0


key = ord('A')

wasKeyPressedTheLastTimeWeChecked = False
while True:
    keyIsPressed = isKeyPressed(key)
    if keyIsPressed and not wasKeyPressedTheLastTimeWeChecked:
        keyWasPressed()
    if not keyIsPressed and wasKeyPressedTheLastTimeWeChecked:
        keyWasUnPressed()
    wasKeyPressedTheLastTimeWeChecked = keyIsPressed
    time.sleep(0.01)

警告: 「while True スリープしてからチェックする」ループと同様に、このメソッドは同等の「コールバックを設定して待機する」メソッドよりも多くの CPU サイクルを使用する可能性があります。これを改善するために期間の長さを延長できますsleepが、キーの検出には時間がかかります。たとえば、1 秒間スリープすると、キーを押してからジョイスティックが無効になるまでに最大 1 秒かかる場合があります。

于 2012-11-14T15:37:54.783 に答える
0

ウィンドウがフォーカスを得たり失ったりすると、ACTIVEEVENT. それと属性はgainstate獲得または喪失した状態を示します。おそらく最も簡単な解決策は、メインのイベント ループでこのイベントをキャッチし、それらを使用して、フォーカスがあるかどうかを追跡することです。フォーカスがない場合は、ジョイスティック イベントを無視できます。

于 2012-11-14T15:41:26.740 に答える