0

今日、私は自分のアプリケーションですべての異なるキーの入力を設定しました。これは、キャレットやアンパサンドなどの仮想キーを除いて正常に機能します。通常、シフトを取得する必要があるキー。SDL を使用すると、これらの仮想キーは機能しません。彼らはイベントを登録しません。

if (event.type == SDL_KEYDOWN) {
        switch (event.key.keysym.sym) {
            case SDLK_CARET:
                Keys[KeyCodes::Caret] = KeyState::Down;
                break;
            case SDLK_UP:
                Keys[KeyCodes::Up] = KeyState::Down;
                break;
            default:
                break;
        }

私のシステムが Up のような物理キーで動作することは間違いありません。プログラムは次のようにキーステートを照会します。

if (Keys[KeyCode] == KeyState::Down) {
    lua_pushboolean(L, true);
} else {
    lua_pushboolean(L, false);
}

KeyCode が引数として渡されます。

では、SDL の KeyDown イベント タイプを使用すると、仮想キー、または取得するためにシフトが必要なキーが機能しないのはなぜでしょうか? それらに到達するためにさらにコードが必要ですか? それとも私は愚かですか?

4

2 に答える 2

1

SDL は実際の重要なイベントのみを報告します。

幸いなことに、 Unicode 変換を有効にして、'^' や '@' などの記号を取得できます。

最初にこれを初期化コードに入れます:

SDL_EnableUNICODE(1);

これで、イベントは のメンバーにSDL_KEYDOWN付随する文字を持ちます。これは、キーの押下を文字に変換するときに、シフト、Caps Lock などを考慮に入れます。のようなキーがあります。unicodeSDL_keysymSDLK_UPunicode == 0

keysym.unicodeこれにより、特に と一緒に使用する場合、テキスト入力にusing が理想的になりますSDL_EnableKeyRepeat

例を次に示します。私のキーボードでは、ホールドshift-6して生成し^ます。プログラムは 、 、 でイベントSDL_KEYDOWNを受け取ります。keysym.sym == SDLK_6keysym.unicode == '^'

1 つの注意点は、リリース イベントではなく、キープレスイベントのみが変換されることです。しかし、これは大きな問題ではありません。ゲーム コントロールにテキスト文字を使用するべきではなく、実際のキーのみを使用するべきだからです。また、キーの繰り返しを使用してテキスト入力を行っている場合、キーが押されたときだけが重要になり、離されません。

正確なニーズに合わせてkeysym.sym、 とを組み合わせて使用​​する必要がある場合があります。keysym.unicode

于 2012-10-10T16:38:56.273 に答える
0

少しイライラして申し訳ありませんが、たとえば誰かがキャレットキーを押したときに通知するコードをようやく取得しました。他の人がこの有益な情報を見つけてくれることを願っています。

case SDLK_6:
    if (event.key.keysym.mod == KMOD_LSHIFT || event.key.keysym.mod == KMOD_RSHIFT) {
        Keys[KeyCodes::Caret] = KeyState::Down;
    } else {
        Keys[KeyCodes::n6] = KeyState::Down;
    }
    break;

基本的に、Shift クリック特殊キーを持つ通常のキーをチェックするときは、キー修飾子をチェックします。Unicode の値は理解できましたが、今のところはこの考えの方が単純に思えます。

もう一度、すべての助けに感謝します!

于 2012-10-10T21:24:15.617 に答える