2012-07-15 49 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