2012-07-15 48 views
0

我刚开始学习OpenGL/Glut,并且遇到了一些问题。我想打印一个字符串key: a,只要我点击键a,但似乎我不知道我在做什么。处理键盘输入的回调函数

我打电话从main()功能glutKeyboardFunc(),和我通过它keyinput(),测试keyESCa。另一件事是,当我尝试从scene1()内部打印某些东西时,它的功能非常棒!嗯,奇怪为什么?

void printstr(void* font, char* str, GLfloat x, GLfloat y, GLfloat z) 
{ 
    char* c = str; 

    // set the raster position 
    glRasterPos3f(x, y, z); 

    for(; *c != '\0'; c++) 
      glutBitmapCharacter(font, *c); 
} 

void keyinput(unsigned char key, int x, int y) 
{ 
    switch(key) 
    { 
    case 27: 
     killsound(); 
     exit(0); 
     break; 

    case 'a': 
     glLoadIdentity(); 
     glColor3f(0.0f, 1.0f, 0.0f); // Green 
     printstr(GLUT_BITMAP_8_BY_13, "Key: a", 0.0f, 0.9f, 0.0f); 
     break; 
    } 
} 

int main(int argc, char** argv) 
{ 
    // initialization and stuff 
    glutInit(&argc, argv); 
    . 
    . 
    . 
    glutDisplayFunc(scene1); 
    glutIdleFunc(scene1); 
    . 
    . 
    . 
    glutKeyboardFunc(keyinput); 
    . 
    . 
    . 

    glutMainLoop(); 
} 
+0

你可以把一个简单的'COUT <<关键<< ENDL;'语句中' keyinput(..)'和检查输出。这将帮助您调试。 – SuperSaiyan 2012-07-15 12:22:00

+0

@Thrustmaster我在控制台上得到'a',但没有在OpenGL窗口 – Jonas 2012-07-15 12:26:56

回答

1

这可能是因为GLUT在您的渲染代码之外调用keyinput()。我假设您的绘图函数(glutDisplayFunc或glutIdleFunc)通过调用glClear()开始并通过调用glutSwapBuffers()结束?如果是这样,那么在glClear()被调用之前,在keyinput()内部发生的任何绘制调用都将完成,因此绘图将不会被看到。

最重要的是,keyinput不会连续调用。当你的键被按下时它会被调用。所以你的文字只会显示一次,而不是所有的时间。

我建议你做一个全局变量,

int aIsPressed=0; 

在keyinput,集aIsPressed你要显示你的信息(如果你限制你的帧率的帧数,尝试60,如果不是,尝试1000)

然后,在你的绘图功能,这样做你的代码一起绘制一切:

if(aIsPressed>0) 
{ 
    glLoadIdentity(); 
    glColor3f(0.0f, 1.0f, 0.0f); // Green 
    printstr(GLUT_BITMAP_8_BY_13, "Key: a", 0.0f, 0.9f, 0.0f); 
    aIsPressed--; //this way aIsPressed will count down to zero, and the message will disappear again 
} 
+0

我评论了'glClear()',我现在可以看到正在打印的文本。这是一个热门的混乱,但。 – Jonas 2012-07-15 12:47:48

+0

也许我会用一系列的键或什么? – Jonas 2012-07-15 12:50:13

+0

是的,这将工作。处理这个问题的标准方法是拥有每个键的状态数组或者创建自己的内部事件系统。 (事件列表,包括按键消息,可以通过keyinput()添加到事件列表中,并通过其他函数扫描事件 – zacaj 2012-07-15 12:52:51