4

SFML でキーが押された (保持されていない) かどうかを受け取る方法、またはそのような効果を模倣する方法はありますか?

ここでイベントをポーリングします。

while (window.pollEvent(event));

そして、ループの後半で、スコープ外ですが、同じイベントで、次のように読みました。

if (event.type == sf::Event::KeyPressed)
{
    if (event.key.code == sf::Keyboard::Up)
    {
        decision--;
        if (decision < 0)
        decision = CHARACTER_MAX - 1;
    }
}

上矢印を押し続けると連続してdecision減少します。sを使用しsf::eventて、押したときではなく、最初に押したときに読み取ることができますか?

また、それが不可能な場合、または sfml に慣れていない場合、グローバル化された変数をほとんどまたはまったく使用せずにそのようなものを模倣する最良の方法は何でしょうか? (などis_already_held)、たとえばhttps://gamedev.stackexchange.com/questions/30826/action-button-only-true-once-per-press

これが唯一の方法 (より広いスコープで変数を宣言する) かもしれないことは理解していますが、スコープを継続的に終了し、できるだけ頻繁にグローバル変数から離れようとするため、そうしないことをお勧めします。

4

3 に答える 3

8

キーの繰り返しを無効にするには、次のようにしsf::Window::setKeyRepeatEnabledます。

window.setKeyRepeatEnabled(false);

ウィンドウを作成した後、一度呼び出します (それで十分です)。

ドキュメントはこちらです。


何らかの理由でこの関数を使用したくない場合は、ブール値のテーブルを使用して各キーの状態を格納できます。テーブルを最新の状態に保ち、「決定」コードを統合する方法を示す疑似コードを次に示します。

// Init the table of state. true means down, false means up.
std::array<bool, sf::Keyboard::KeyCount> keyState;
keyState.fill(true);

// :
// :

// In the event loop:
if (event.type == sf::Event::KeyPressed)
{
    // If the key is UP and was not previously pressed:
    if (event.key.code == sf::Keyboard::Up && !keyState[event.key.code])
    {
        decision--;
        if (decision < 0)
            decision = CHARACTER_MAX - 1;
    }

    // Here comes the rest of your code and at the end of the if-body:

    // Update state of current key:
    keyState[event.key.code] = true;
}
else if (event.type == sf::Event::KeyReleased)
{
    // Update state of current key:
    keyState[event.key.code] = false;
}

3 つ目の方法は、 Thorなどのサードパーティ ライブラリを使用することです。まだ開発中なので、作者からの変更を期待できます。そして、ここにActionに関するチュートリアルがあります。まさにあなたが必要としているものです。

于 2013-07-27T08:51:55.420 に答える