【问题标题】:Implementing the arrow keys in solar systems openGL program在太阳能系统 openGL 程序中实现箭头键
【发布时间】:2012-04-20 04:51:23
【问题描述】:

作为我的太阳系计划的一部分,一切都很好地实现了,我试图扩展我的程序以包括用户可以在 orrey 周围飞行,或者换句话说,通过使用方向键。这就是我基本上所做的:

   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;


      }
    } 

其中latlon 是与当前眼点一起使用的全局角度(eyexeyeyeyez),以及 RUN_SPEED 进入 XZ 平面的距离。我不知道为什么这部分不起作用,即使我在这部分中没有任何错误,所有编译文件但箭头键不起作用。有什么帮助吗?

【问题讨论】:

    标签: c opengl glut


    【解决方案1】:

    使用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;
      }
    }
    

    请记住,此特殊处理程序不会替换您一直在使用的键盘处理程序,它只是对其进行补充。

    【讨论】:

    • 不幸的是 bor ...即使第一次使用转义键也无法正常工作,但是当我尝试使用 glutspecialfun() 的方法时,它无法正常工作,所以其他人......我还错过了什么,原因我主要包括 glutKeyboardFunc (键盘);很明显,我必须调用它。所以使用 glutspecialfun() 非关闭键工作,但使用 glutKeyboardFunc 只有转义键工作,而其他人没有。任何线索或help.plz?
    • glutSpecialFunc() 需要一个不同的回调函数。你没有注意到我是如何将函数命名为special 而不是keyboard 吗?请记住,您需要调用 both glutKeyboardFunc() AND glutSpecialFunc()
    • 对不起,有点混乱。所以基本上它应该是这样的:glutKeyboardFunc(); glutSpecialFunc(特殊);但是当我这样做时,我会收到错误,说函数“glutKeyboardFunc”的参数太少。
    • glutKeyboardFunc(keyboard); glutSpecialFunc(special);your keyboard 函数中删除所有 GLUT_KEY_*cases 并将它们移动到我的回答所建议的新 special 函数中。
    • 感谢您的帮助,这真的很有帮助 ^
    猜你喜欢
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2011-01-04
    • 2013-04-19
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多