2015-04-29 46 views
-1

中創建的窗口中,嘗試顯示在鍵盤上鍵入的字符,我使用下面的代碼。將鍵盤上輸入的文本打印到在opengl

void myKey(unsigned char key, int x, int y) 
{ 
    if (key == 13) // enter key 
{ 
    return; 
} 
    glRasterPos2f(xpos, 600); 
    glColor3f(0.0, 0.0, 1.0); // text color 
    glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, key); // print the color 

    glFlush(); 
    xpos += 15; 
    player1[i] = key; 
    i += 1; 
} 

它打印輸入到屏幕上的文本,但它不會退出,因爲它應該是當我按下輸入。我想讓代碼顯示player1的玩家名稱並將其存儲爲一個數組,然後當我按下回車鍵後退出,然後繼續接受第二個玩家的名字。

回答

0

只在顯示回調中做OpenGL的東西。

您需要將文本輸入分解成兩個部分:

  1. 鍵盤/數組中的glutKeyboardFunc()回調處理。完成修改名稱列表後發佈重新顯示事件。
  2. glutDisplayFunc()回調中進行字符串渲染,在此迭代名稱向量並顯示每個字符串。

像這樣:

#include <GL/freeglut.h> 
#include <sstream> 
#include <string> 
#include <vector> 

using namespace std; 

vector<string> names(1); 
void keyboard(unsigned char key, int x, int y) 
{ 
    if(key == 13) 
    { 
     // enter key 
     names.push_back(""); 
    } 
    else if(key == 8) 
    { 
     // backspace 
     names.back().pop_back(); 
    } 
    else 
    { 
     // regular text 
     names.back().push_back(key); 
    } 

    glutPostRedisplay(); 
} 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    glOrtho(0, w, 0, h, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    for(size_t i = 0; i < names.size(); ++i) 
    { 
     ostringstream oss; 
     oss << (i + 1) << ": " << names[i]; 

     void* font = GLUT_BITMAP_9_BY_15; 
     const int fontHeight = glutBitmapHeight(font); 
     glRasterPos2i(10, h - (fontHeight * (i + 1))); 
     glutBitmapString(font, (const unsigned char*)(oss.str().c_str())); 
    } 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    glutKeyboardFunc(keyboard); 
    glutMainLoop(); 
    return 0; 
}