2016-10-21 8 views
0

私はコンソールを使ってWindows上でC++でゲームを作っています。これにはターンベースの戦闘が含まれています。私はSleep()関数を使ってバトル中のメッセージを遅らせ、キーがヒットしたときに進む。私の問題は、ゲームがスリープ機能によって「一時停止」されている間も、ユーザーのキーが押されたことをまだカウントしてから使用することです。_kbhit()と_getch()を入力として使用して、ユーザーの入力ストリームをクリアするにはどうすればよいですか?

たとえば、ユーザーがゲームをスリープ状態にしている間に「a」キーを4回押すと、押した後すぐにそのキーを4回押し続けます。

ユーザのキーを押してプログラムに登録する機能を一時的に「無効」にするにはどうすればよいですか?

+0

ここで答えたように、入力ストリームをフラッシュすることができます:http://stackoverflow.com/questions/257091/how-do-i-flush-the-cin-buffer –

+0

再開するとキューが空になります一時停止し、kbhitがtrueの間にgetchを呼び出し続けます。それはあなたがあなたが非公開にするべきであることをどのように検出するのかという質問をします:) –

答えて

0

_kbhit()およびgetch()はバッファリングされた機能である。眠っている間に入力されたものはすべてバッファに送られ、関数が起きて新しいkbヒットを読み出すとすぐに順次処理されます。

バッファリングされていない代替方法として、GetKeyboardState()は特定の瞬間にキーボードの状態を取得すると考えることができます。それはバッファリングされていないので、あなたのゲームにもっと適応しています。

0

私の知る限り、あなたはそれをオフにすることはできませんが、代わりにすべてのキーストローク

例えばを無視ループを持っていることで、あなたはキーストロークを無視することができます当然の

time_t delay = 10; // timeout delay 
time_t start = time(NULL); // normally returns seconds 

do 
{ 
    if (_kbhit()) getch(); 
} 
while (time(NULL) - start < delay); 

あなたにも、あなたの待ちループに他のことを行うだけでなく、キーが押され、その後、whileループを中断したかどうか確認することができます。

関連する問題