3

私が開発しているゲームでは、押されたときに「コールバック」関数を登録するなど、キープレス (または keyup )NUMLOCK 検出したいと考えています。

特定の瞬間にその状態を読み取るように求めているわけではありません。すでにそれを行うことができますし、その値を変更することにも興味がありません。これは、キーが押されたときにそれを認識しているため、10 分の 1 秒ごとにその状態をポーリングする必要がありません。

ゲームは を使用してcursesおり、現在はブロッキングgetch(). Curses はNUMLOCKキー押下を検出しません。私はそれを期待していませんでした (LED 関連のキーボードはキーを「生成」しません)。メインの curses ループをブロックgetch()せず、関数を呼び出してkeyboard_leds()現在の状態を読み取ります。

例: curses を初期化した後に新しいスレッドを開始し、その画面を引数として渡すと、そのスレッドはキー押下のイベントのstdscrコールバック関数 (たとえば ) を登録します。したがって、その関数は必要なときにのみ呼び出され、その後更新されます。special_keypress()NUMLOCKkeyboard_leds()stdscr

これが可能かどうかはわかりません。また、おそらくアーキテクチャに依存するもの (カーネル/X11 など) に移行する必要があることもわかっているため、クロスプラットフォーム ソリューションが不可能な場合は、 Linuxのみのもので大丈夫です。

4

1 に答える 1

2

OK、それはナッツを割るためにスチーム ハンマーを使用するようなものです (特に、CLI ローグライク ゲームを作成している場合) が、Pyglet は OS X で少なくとも NUMLOCK キーを押すことができCAPSLOCKますSCROLLLOCK。しかし、私のシステムのホットキーは可能な限りあらゆる方法で上書きされているので、それは私だけかもしれません.

それがうまく機能するかどうか試してテストしてから、Pyglet がこれらの鍵をどのように検出するかを調べることができます。

import pyglet

from pyglet.window import key


window = pyglet.window.Window()


@window.event
def on_key_press(symbol, modifiers):
    if symbol == key.NUMLOCK:
        print 'NumLock was pressed, yay!'
    elif symbol == key.CAPSLOCK:
        print 'CapsLock was pressed, yay!'
    elif symbol == key.SCROLLLOCK:
        print 'ScrollLock was pressed, yay!'


@window.event
def on_draw():
    window.clear()


if __name__ == '__main__':
    pyglet.app.run()
于 2015-02-04T15:35:33.050 に答える