2015-04-29 43 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; 
}