2

私の太陽系プログラムの一部として、すべてがうまく実装されているので、プログラムを拡張して、ユーザーがオーリーの周りを飛行できるようにしたり、矢印キーを使用して宇宙を飛行する宇宙船から眺めたりできるようにしました。これは私が基本的にやったことです:

   void keyboard(unsigned char key, int x, int y)
    {
      switch (key)
      {
        case 27:  /* Escape key */
                 exit(0);
                 break;
        case (GLUT_KEY_LEFT): lon += TURN_ANGLE;
                              if(lon == 360)
                                lon = 0;
                  break;
        case (GLUT_KEY_RIGHT):
                              lon -= TURN_ANGLE;
                  if(lon == -360)
                               lon = 0;
                  break;
        case (GLUT_KEY_PAGE_UP): 
                              if(lat  + TURN_ANGLE <= 90)
                               lat += TURN_ANGLE;
                              break;
        case (GLUT_KEY_UP):   eyex += sin(DEG_TO_RAD * (lon)) * RUN_SPEED;
                              eyez += cos(DEG_TO_RAD * (lon)) * RUN_SPEED;
                              break;
        case (GLUT_KEY_DOWN): eyex -= sin(DEG_TO_RAD * (lon)) * RUN_SPEED;
                              eyez -= cos(DEG_TO_RAD * (lon)) * RUN_SPEED;
                              break;
        default: break;


      }
    } 

ここでlat、 およびlonは、現在の視点 ( eyexeyeyeyez) と一緒に使用されるグローバル角度、および RUN_SPEEDXZ 平面でのステップの距離です。この部分でエラーが発生しなかったのに、なぜこの部分が機能しないのかわかりませんファイルをコンパイルしますが、矢印キーは機能しません。助けはありますか?

4

1 に答える 1

2

を使用glutKeyboardFunc()すると、単純なASCII文字のみをキャプチャできます。残りのキーに応答するには、別のイベントハンドラーを設定する必要がありますglutSpecialFunc()

特別なハンドラーの署名が少し変わることに注意してください:

void special(int key, int x, int y)
{
  switch (key)
  {
    case GLUT_KEY_LEFT: lon += TURN_ANGLE;
                          if(lon == 360)
                            lon = 0;
              break;
    /* ... */
    default: break;
  }
}

この特別なハンドラーは、これまで使用していたキーボードハンドラーに置き換わるものではなく、補完するだけであることを忘れないでください。

于 2012-04-19T20:49:56.060 に答える