2011-12-25 54 views
2

我編寫了下面的代碼,但是在運行時,當我按下按鍵時,程序不起作用。
我想編寫一個程序,當用戶按下right_keyalt_key時繪製一個三角形。但這根本不起作用。它總是顯示一個黑屏。如何編寫GLUT鍵盤功能?

#include <GL/glut.h> 
void init (void) 
{ 
    glClearColor(0.0,0.0,0.0,0.0); 
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(0.0,200.0,0.0,200.0); 
} 
float red=1,green=1,blue=1; 
void processSpecialKeys(int key, int x, int y) { 
    if(key=='0') 
     exit(0); 
    int mod; 
    if(key== GLUT_KEY_RIGHT) { 
     mod = glutGetModifiers(); 
     if (mod==GLUT_ACTIVE_ALT) { 
      red = 1.0; green = 0.0; blue = 0.0; 
      glColor3f(red,green,blue); 
      glBegin(GL_TRIANGLES); 
      glVertex2f(0,0); 
      glVertex2f(0,100); 
      glVertex2f(50,100); 
      glEnd(); 
     } 
    } 
} 
void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glFlush(); 
} 
int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowPosition(50,20); 
    glutInitWindowSize(400, 300); 
    glutCreateWindow("A simple example"); 
    init(); 
    glutDisplayFunc(display); 
    glutSpecialFunc(processSpecialKeys); 
    glutMainLoop(); 
} 
+0

OpenGL不做任何keayboard處理。你可能意思是GLUT,它與OpenGL沒有任何關係。 – 2011-12-25 15:39:56

回答

6

現在就行。我修改了您的代碼以啓用ALT或SHIFT或CTRL。該代碼打印出鍵的掃描碼。 要打印ALT,CTRL或SHIFT掃描碼,只需按ALT或SHIFT或CTRL並結合其他鍵。 其他GLUT不會註冊它。

#include <stdio.h> 
#include <GL/glut.h> 

float red=1,green=1,blue=1; 



void init (void) 
{ 
    glClearColor(0.0,0.0,0.0,0.0); 
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(0.0,200.0,0.0,200.0); 
} 


void process_SHIFT_ALT_CTRL(unsigned char key, int x, int y) 
{ 
    // Press ALT or SHIFT or CTRL in combination with other keys. 
    printf("key_code =%d \n",key); 

    int mod = glutGetModifiers(); 

    if (mod != 0) //ALT=4 SHIFT=1 CTRL=2 
    {  
      switch(mod) 
      { 
      case 1 : printf("SHIFT key %d\n",mod); break; 
      case 2 : printf("CTRL key %d\n",mod); break; 
      case 4 : printf("ALT key %d\n",mod); break; 
      mod=0; 
      } 
    } 
} 


void process_Normal_Keys(int key, int x, int y) 
{ 
    switch (key) 
    {  
     case 27 :  break; 
     case 100 : printf("GLUT_KEY_LEFT %d\n",key); break; 
     case 102: printf("GLUT_KEY_RIGHT %d\n",key); ; break; 
     case 101 : printf("GLUT_KEY_UP %d\n",key); ; break; 
     case 103 : printf("GLUT_KEY_DOWN %d\n",key); ; break; 
    } 

} 


void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glFlush(); 
} 


int main(int argc, char **argv) 
{ 

    printf("Press ALT or SHIFT or CTRL in combination with other keys. \n\n"); 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowPosition(800,20); 
    glutInitWindowSize(400, 300); 
    glutCreateWindow("A simple example"); 
    init(); 

    // famous GLUT callback functions 

    glutDisplayFunc(display); 


    glutSpecialFunc(process_Normal_Keys); 
    glutKeyboardFunc(process_SHIFT_ALT_CTRL); 


    glutMainLoop(); 

return 0; 
} 
+0

感謝代碼... – 2011-12-25 14:35:18

+0

'glutSpecialFunc(process_Normal_Keys);',真的嗎? – wmamrak 2015-01-09 17:27:13

3

這不會以這種方式工作,因爲對鍵盤迴調的調用將異步運行。

這意味着,除非擊鍵正好在glClear()glFlush()之間進行處理,否則您將看不到一個三角形,這種情況很少會發生,並且只會出現在一個單幀中。

您需要做的事情非常簡單: 在處理按鍵時,請保存該狀態,例如,根據鍵輸入將布爾變量設置爲true/false。

然後檢查display()中的內容,並繪製三角形(如果需要)。

僞代碼示例:

bool status = false; 

inputhandler(key) 
{ 
    if(key == KEY_A) 
     status = true 
    else if(KEY == KEY_S) 
     status = false; 
} 

displayhandler() 
{ 
    clear(); 
    if(status) 
     drawTriangle(); 
    flush(); 
} 

main() 
{ 
    //... init etc. 
    glutDisplayFunc(&displayhandler); 
    glutSpecialFunc(&inputhandler); 
} 

在進一步指出,如果你想進入的OpenGL編程,而不必擔心處理周圍其他的東西,我會建議使用預製庫處理窗口,輸入等等,例如SFMLSDL。它們的工作方式與glut相似,但通常它們更強大,並且仍然允許您直接運行OpenGL調用,同時提供簡化的事件處理。

+0

你能解釋更多嗎? – 2011-12-25 10:24:34

+0

我可以調用glutSpecialFunc(processSpecialKeys)func。在顯示功能? – 2011-12-25 10:25:27

+0

*顯示回調正在運行時,鍵盤迴調不會*運行*。如果確實如此,則需要同步對共享狀態的訪問。 – 2011-12-25 10:28:09

1

您無法在鍵盤迴調中生成圖形命令。當您感興趣的按鍵被按下時,設置一些全局狀態,並使用顯示代碼中的信息。

調試這樣的問題的方法是在您認爲不工作的代碼中使用printf語句。這裏在鍵盤處理程序中添加一個printf會很快告訴你代碼正在執行,但三角形沒有被繪製。這可能會導致您考慮圖形命令何時可能以及何時不可用。