0

矢印キーで画面上を移動できる小さな文字のOpenGLプログラムがあります。方向を変えると、キャラクターはそれに応じて向きを変えます。基本的には次のようになります。

 //Pressing the up arrow to go in the up direction 

 if(prevSwimDirection == RIGHT)
         swimAngle = 90;
 ...
 glutPostRedisplay(); 

泳ぐ方向は、コードの他の場所の表示機能で処理されます。

  if(changesMode == SWIM_AROUND)
     glRotatef((GLfloat)swimAngle, 0.0, 0.0, 1.0);

もちろん、これは瞬間的な突然の方向転換を引き起こします。私はこれらをこのように滑らかにしようとしましたが、運がありませんでした:

   if(prevSwimDirection == RIGHT)
     for(double i = swimAngle; i < 90; i += 0.00001){
       swimAngle = i;
       glutPostRedisplay();
     }

さまざまな値でiをインクリメントしようとしましたが、ループ全体でglutPostRedisplay()を呼び出しているにもかかわらず、再表示の前に計算が実行されているように見えることに最終的に気付きました。言い換えれば、それでも突然方向を変えますが、わずかな初期遅延があります。

これを適切に(または、より良い方法で、効率的に)機能させる方法はありますか?

4

1 に答える 1

1

glutPostRedisplay は即時の再描画を引き起こしませんが、イベントループが次に繰り返されるときに表示関数が呼び出されるというフラグを設定するだけです。

原則として、入力イベント ハンドラーからアニメーションを再生しないでください。代わりに、アニメーション パラメーターを設定する必要があります。この場合は、表示関数呼び出し間のアニメーション コードに適用される新しいターゲットの向きです。表示呼び出し間の時間を測定し、それに応じてアニメーションを進めます。ループを繰り返してアニメーションを再生しないでください。

于 2012-11-06T16:45:08.740 に答える