6

SFML 2でキー入力を取得しようとしていますが、SFML 1.6では次を使用しています

   while (App.GetEvent(Event))
       {
          if (App.GetInput().IsKeyDown(sf::Key::Down)) { dir='d'; }
    }

しかし、SFML 2 でこれを行う方法がわかりません。

4

1 に答える 1

19

リアルタイムのキーボード入力について心配する必要がない場合は、提供したSFML1.6コードと非常によく似たアプローチを使用できます。アプリケーションのイベント処理ループでは、次のようなことができます。

sf::Event event;
while (mWindow.pollEvent(event))
{
    if (event.type == sf::Event::KeyPressed)
    {
        if (event.key.code == sf::Keyboard::Escape)
        {
            // Do something when Escape is pressed...
        }
        if (event.key.code == sf::Keyboard::W)
        {
            // Do something when W is pressed...
        }

        // And so on.
    }
}

このタイプの入力処理は、キーイベントが生成されないため、ユーザーがキーを押したときにアプリケーションがフォーカスを持っていることを保証する必要がある場合に便利です。また、問題のキーが頻繁に押されない場合にも最適です。この例は、SFML 2.0チュートリアルの「KeyPressedおよびKeyReleasedイベント」というタイトルのセクションで確認できます:http ://sfml-dev.org/tutorials/2.0/window-events.php

一方、実際にはリアルタイムのキーボード入力にアクセスする必要があるかもしれません。これを行うには、SFML2.0のKeyboardクラスを次のように使用します。

if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
{
    // 'W' is currently pressed, do something...
}

リアルタイム入力を使用すると、その特定の時点での入力デバイスの状態にアクセスできます。これは、イベント処理ループですべてのキーチェックをまとめる必要がないため便利です。このアプローチの欠点は、SFMLがキーボードの状態を読み取るだけなので、アプリケーションにフォーカスがない、最小化されているなどの場合でも、イベント処理コードを実行できることです。すべてのリアルタイム入力に関するチュートリアルを見つけることができます。ここ:http ://sfml-dev.org/tutorials/2.0/window-inputs.php

イベント処理とリアルタイムアプローチの選択には注意してください。ゲームの例として、ユーザーがスペースバーを押したときにキャラクターが機関銃を発射する状況を考えてみます。sf::Event::KeyPressedイベント処理ループでスペースバーを処理すると、ユーザーがキーを押し続けていても、同じキーのイベント間に遅延があるため、機関銃は半自動のように誤って発砲します。リアルタイムのキーボード入力で確認してスペースバーを操作すると、期待どおりに機関銃が繰り返し発射されます。

于 2012-08-09T03:29:26.730 に答える