SFML 2でキー入力を取得しようとしていますが、SFML 1.6では次を使用しています
while (App.GetEvent(Event))
{
if (App.GetInput().IsKeyDown(sf::Key::Down)) { dir='d'; }
}
しかし、SFML 2 でこれを行う方法がわかりません。
SFML 2でキー入力を取得しようとしていますが、SFML 1.6では次を使用しています
while (App.GetEvent(Event))
{
if (App.GetInput().IsKeyDown(sf::Key::Down)) { dir='d'; }
}
しかし、SFML 2 でこれを行う方法がわかりません。
リアルタイムのキーボード入力について心配する必要がない場合は、提供した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
イベント処理ループでスペースバーを処理すると、ユーザーがキーを押し続けていても、同じキーのイベント間に遅延があるため、機関銃は半自動のように誤って発砲します。リアルタイムのキーボード入力で確認してスペースバーを操作すると、期待どおりに機関銃が繰り返し発射されます。