2012-04-01 7 views
1

解説glutキーバッファをチェックする方法はありますか?

私はOpenGLでパーティクルシステムを作っています。私はLinuxで働いています。私はそれをよりインタラクティブにしたいので、例えば、ユーザーがスペースバーを押すと、新しい花火が飛び出します。

私はキーボード入力をキャプチャするためにGLUTを使用しています。ユーザーがスペースバーを押すと、花火が鳴り出し、しばらくループするループに入り、再びスペースバーを押すと、キーの押下が登録される前に、そのループが実行されます。

だから私の質問はこれです:

は私がするための方法は、供給過剰がでキー入力を格納するバッファをチェックするために、ループの開始時に、ありますか?キーが押されたことを記憶する何らかのバッファがなければならないように思えます。上のループが実行終了すると、キー押下が登録されるためです。

SOLUTION:私は実際に、私がメインで

ような何かが(私の花火の位置を更新するための配列などをループする以外)今どこでも任意のループをしない

、これを追加します:

あなたの更新glutTimerFuncためのパラメータで関数(ので、このようなものでその後
int main(int argc, char** argv){ 

    //Usual glut initializations 
    glutTimerFunc(30, update, -1);//says in 30miliseconds call update 
    glutDisplayFunc(display); 
    glutMainLoop(); 

    return 0; 
} 

void update(int k){ 

    //UPDATE POSITION OF FIREWORKS 
    glutTimerFunc(30, update, -1);//it is important to add this 
    glutPostRedisplay();//calls display() on the next iteration of glut's main loop 
} 

そして、最終的にあなたの表示機能では、あなたが一つのフレームを描画するために行う必要があり、これまで何を(各花火を通じて、私の場合にはループをし、それを描く!)

・ホープ、このことができます:)

答えて

2

ますこれについては間違った方向に行きます。

キー押しハンドラはでなく、でループしてください。あなたのkeypressハンドラは単に変数を設定して戻ります。

メイン表示機能(glutPostRedisplayを呼び出すタイマー機能によって駆動される)がこの変数をチェックする必要があります。それが設定されている場合、それはあなたの花火を発射し、ある期間継続する必要があります。

その間、キー押下ハンドラは、スペースバーのそれ以上の押下を無視する必要があります。花火で表示機能が終了すると、それ以降のキー入力に応答することができます。

+0

興味深い。だから私がスペースバーを押すと、私のバッファに新しい花火を追加してから、私はそれらをループして描くべきです。しかし、私は同じ場所にいるのではないですか?表示されているループが実行されている間に、スペースバーを押すと、直ちに(または近くに)新しい花火が鳴らないでしょうか?表示がループの処理を終了するのを待たなければならないでしょうか? – user979344

+0

@ user979344:表示は*ループしてはいけません。ディスプレイは* 1つのフレーム*を描画して終了する必要があります。複数のフレームを描画する必要がある場合は、GLUTに再度ディスプレイループを呼び出させる必要があります。 –

+0

そして私はあなたが上記のようなタイマーでこれを行うのですか?そこには何も入っていないのですか?あなたはどういう意味ですか?そしてどこから私はディスプレイを呼び出しますか?どのようにしても、私の花火(約200フレーム、ループの200回の反復)を描くためにはループが必要になるでしょう。その間、どんなキーを押しても気にならないでしょう。 – user979344

関連する問題