2

SFMLOpenGLを使用して、矢印キーで画面上を移動できる回転する正方形を描画する簡単なプログラムを作成しました。

テストしたすべてのLinuxおよびMacコンピューターで正常に動作しますが、Windowsで正方形を移動しようとすると(矢印キーを押したまま)、少し移動してから移動と回転が停止します。プログラムがGetEventメソッドでスタックしていると確信しています-繰り返しを開始するのに十分な時間キーを押したままにすると、すべてをポップオフする前に、イベントスタックに新しいイベントが追加され続けますそれ(そして、Windowsのキーリピートレートを最小値まで下げると、問題は解決します-しかし、これを解決策としてはあまり好きではありません)。

Alt、Ctrl、Delete、Page Up、Page Down、Home、Endなどを押し続けると、この動作も発生することがわかりました(プログラムでこれらのキーを特に検出していなくても)が、すべての文字キー、スペース、Enterキー、BackSpaceキー、およびキーパッドの矢印キーは正常に機能します(つまり、長押ししてもプログラムが一時停止することはありません)。

正確なコードはありませんが(ラップトップの電源を切ったばかりです)、次のようになります。

while(running) {
    while(app.GetEvent(event))
        if(event.Type==sf::Event::Closed) running=false;
    if(input.IsKeyDown(sf::Key::Right)); // move right
    // etc etc
    // update rotation
    // draw everything
}

正確な問題が何であるか、そしてどのようにそれを修正できるかについてのアイデアはありますか?

4

1 に答える 1

3

これが古い質問であることは承知していますが、ここで同様の問題を経験している可能性のある他の人を助けるために、回答したいと思います。

SFML 1.6 には、ユーザーから入力を得る方法が 2 つあります。1 つはイベントベースで、 経由で送信された各イベントを処理しますsf::Window::GetEvent()sf::Inputもう1つは、ウィンドウのクラスを直接チェックするクエリベースです。

ここではクエリ ベースの方法を使用しましたが、意図した使用方法とは異なるイベント ループ内に配置しています。こんな感じで使う予定でした。これは便利な機能です。なぜなら、SFML は本質的にキーのブール テーブルを自動的に保持するため、キーの状態を自分で管理する必要がないからです。繰り返し入力を使用するための私見は、ブール値をチェックするだけでイベントキューをスパムすることはないため、これはよりエレガントです。

while(app.GetEvent(event))
    if(event.Type == sf::Event::Closed) running=false;
    if(event.Type == sf::Event::KeyPressed && event.Key.Code == sf::Key::Right)
    {
      // move right
    }
}

sf::Input を直接クエリしたい場合は、上記と同じコードを使用しますが、イベント ループの外に置きます。

while(app.GetEvent(event)
{
}

if (myWindow.GetInput().IsKeyDown(sf::Key::Right))
{
}

デフォルトでは、自動キーリピートは sf::Windows に対して有効になっているはずですが、 を使用して確認できますsf::Window::EnableKeyRepeat(true)。これはKeyPressed、キーが押されている間、イベントを繰り返し送信することを意味します。

メイン イベント ループの外側でクエリ ベースの方法を使用してみて、それが機能するかどうかを確認してください。

于 2011-09-04T08:17:40.887 に答える