2017-03-06 11 views
0

私はroguelikeゲーム用のコードを書いています。コードのこの部分はgetch()を使用して、次のどこへ移動するかを示す文字をユーザー入力に使用します。 getch()はユーザーからの入力を受け取るまでプログラムを一時停止しますが、行に到達するとコードは一時停止しません。ここでは、コード全体のプログラムが正しくコンパイルgetch()でプログラムが一時停止しない

uint32_t pc_next_pos(dungeon *d) 
    { 
    char comm; 
    comm = getch(); 
    command_move(d, comm); 
    } 

で、それはその代わりに、私は私のキャラクターを移動させるためにプログラムを一時停止するだけで、それはプログラムがゲームダイ内のすべてのモンスターを一度終了するまで行き続けています。そのコードは、このメソッドでは役割を果たさないため、含まれていません。

このメソッドでは、getch()がプログラムを一時停止できない、またはgetch()が何をしているのか誤解していますか?

+1

getch()のインスタンスが2つあります。あなたはどのインスタンスを参照していますか? –

+0

私の謝罪、私はコードを調整しました。 2番目のgetch()は通信のためのものでした – Zebs

+0

答えとコメントをここで確認してください:http://stackoverflow.com/questions/12060572/getch-does-not-pause-the-loop – scorpGoku

答えて

1

getch()が入力オプションに応じて、ブロッキングまたは非ブロッキング(あるいはタイムアウトでブロッキング)することができます。ブロックしたい。あなたはノンブロッキングになっています。問題はこの関数ではなく、cursesの初期化コード(図示せず)のどこかにあります。おそらく、またはinitscr()の直後に前述のtimeout()などと呼ばれています。そうでない場合は、nodelay(stdscr, FALSE)のようなものを追加する必要がありますが、これはデフォルトの動作にする必要があります。

また、halfdelay()cbreak()(通常はnodelay()timeout()と同じマニュアルページにあります)で読んでください。

+0

私は馬鹿だと感じる。問題は、何らかの理由でinitscr()を実際にコメントしたためです。あなたの答えのおかげで、私は戻って見て、それが問題であることを見た。今それはすべて正常に動作します。ありがとうございました! – Zebs

0

あなたはtimeoutを呼び出すgetch機能の動作を変更することができますタイムアウト

wtimeoutルーチンは与えられたウィンドウの読み込みをブロックまたは非ブロックセット:男3タイムアウトを

遅延が負の場合、ブロッキング読み出しが使用されます(つまり、無期限に入力待ち)。。遅延がゼロの場合、非ブロッキング読み出しが使用される(すなわち、入力が待機していない場合、読み出しはERRを返す)。 delayが正の場合、delayミリ秒間ブロックを読み取り、入力がまだない場合はERRを返します。したがって、これらのルーチンは、nodelayと同じ機能を提供し、遅延ミリ秒(遅延が正の場合)のみをブロックできる追加の機能を提供します。

uint32_t pc_next_pos(dungeon *d) 
    { 
    char comm; 
    /* set getch blocking */ 
    timeout(-1); 
    comm = getch(); 
    command_move(d, comm); 
    return .... 
    } 
+0

それはまたコンパイルされます。 OPの)しかし、質問に答えることはありません。 –

関連する問題