-1

キーを押す間に時間がかかりすぎる場合に、入力をタイムアウトする最良の方法を見つけようとしています。update の呼び出しごとにデルタでインクリメントされる cheatTime フロートを作成する必要がありますか? もう遅い、疲れた、頭が固い。どんな助けでも大歓迎です。m_pDIDirectInput ラッパー オブジェクトです。そのクラス内にはClearInput()、バッファ内の入力をクリアする関数があります。

if( m_pDI->KeyDown( DIK_TAB ) && m_pDI->KeyDown( DIK_1 ) )
    {
        if( m_pDI->KeyDown( DIK_H ) )
        {
            m_bGameCheats[ 0 ] = true;
            if( !m_pXA->SFXIsSoundPlaying( m_nCheatSoundID ) )
                m_pXA->SFXPlaySound( m_nCheatSoundID, false );
        }
        else if( m_pDI->KeyDown( DIK_C ) )
        {
            m_bGameCheats[ 1 ] = true;
            if( !m_pXA->SFXIsSoundPlaying( m_nCheatSoundID ) )
                m_pXA->SFXPlaySound( m_nCheatSoundID, false );
        }
        else if( m_pDI->KeyDown( DIK_S ) )
        {
            m_bGameCheats[ 2 ] = true;
            if( !m_pXA->SFXIsSoundPlaying( m_nCheatSoundID ) )
                m_pXA->SFXPlaySound( m_nCheatSoundID, false );
        }
    }
4

1 に答える 1

0

質問が正しかったか教えてください。2 つのシナリオ:

1: 2 の間の時間が長すぎない限り、A が押された後に B が押されたときにのみ何かをしたい。

その場合、A を押すたびに時刻を保存します。B が押されたら、A が最後に押された時刻を確認します。

2: A が押された後に B が押された場合は 1 つのことを行い、A が押された後に B が押されなかった場合は別のことを行います。

A が押された後、タイムアウトを待ってから B が押されていないことがわかるだけなので、A が押されるとすぐにタイムアウトを開始し、A が再び押されるたびにタイムアウトを再開する必要があります。実装は、時間枠ベースの実行ループがある場合は定期的なチェックに基づいて、アプリケーション/スレッドがあまり機能しない場合はビジー ポーリング ループに基づいて、イベント ベースである可能性があります。

ポーリングは次のようになります。

void AIsPressed()
{
    mLastTimeAWasPressed = clock();
}

bool HasTooMuchTimePassedSinceAWasPressed()
{
    return (clock() - mLastTimeAWasPressed) > (mTimeout * CLOCKS_PER_SEC)
}
于 2012-12-13T22:09:41.497 に答える