如何在此代码中使用键盘交互

Posted

技术标签:

【中文标题】如何在此代码中使用键盘交互【英文标题】:How I can use Keyboard interaction in this code 【发布时间】:2019-05-11 11:15:29 【问题描述】:

我想使用键盘键移动路径上的对象,但使用键盘功能后,对象没有移动。请帮我解决这个问题。应用键盘功能后,对象没有从它的位置移动。

我想为波形/路径添加 3 个不同的功能,所以我需要键盘交互,这样我就可以在不同的场景中使用不同的键。

void object()

    glPushMatrix();
    glTranslatef(x, y, 0);
    glBegin(GL_LINES);
    glColor3f(0, 0, 0);
    glVertex2f(-0.3, 0.1);
    glVertex2f(0.3, 0.1);        
    glEnd();
    glPopMatrix();
    glFlush();


void drawsine()
   glBegin(GL_LINE_STRIP);//Primitive
    glColor3f(255, 0, 0);//Set drawing color 
    int i = 0;
    float x = 0, y = 0;
    for (x = -5; x < 6; x = x + 0.1)
       y = (sin(3.142*x)) / 3.142*x;
        glVertex2f(x, y);
        sinex[i] = x;
        siney[i] = y;
        i++;
    glEnd();
    glFlush();


void doFrame(int v) 
    //x = sinex[i];
    //y = siney[i];
    if (x < 5.9)
    
        x += 0.1;
        y = (sin(3.142*x)) / 3.142*x;
    
    glutPostRedisplay();
    //glutTimerFunc(x,doFrame,0);


void scene1()

    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glPushMatrix();
    drawsine();
    glPopMatrix();


    //glScaled(0.3, 0.3, 1);
    object();


    //glutTimerFunc(30,doFrame,0);
    glutSwapBuffers();


void exit(void)

    exit(-1);


void myKeyboard(unsigned char key, int x, int y)

    switch (key) 
    case 'h':
    
        scene1();   
    break;

    case 'e':
    
        exit(); 
    break;
    


void display() 

    //glClear(GL_COLOR_BUFFER_BIT);




void init() 
    glClearColor(1, 1, 1, 1);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-5, 7, -5, 5, -1, 1);
    glMatrixMode(GL_MODELVIEW);



int main(int argc, char** argv) 
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowSize(700, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Roller Coaster Simulation");

    init();

    glutDisplayFunc(display);

    glutTimerFunc(200, doFrame, 0);
    glutKeyboardFunc(myKeyboard);
    glutMainLoop();
    return 0;

【问题讨论】:

你能提供一些代码吗?这将帮助我们了解问题出在哪里。 请提供Minimal, Complete, and Verifiable example。 我现在已经提供了代码。 【参考方案1】:

你必须在显示回调glutDisplayFunc中绘制场景。

添加场景状态(current_scene),并在按键时切换状态:

例如

int current_scene = 1;

void myKeyboard(unsigned char key, int x, int y)

   switch (key) 
       case 'h': current_scene = 1; break; 
       case 'i': current_scene = 2; break; 
       // [...]
   

在显示回调中根据状态绘制场景:

void display() 

    glClear(GL_COLOR_BUFFER_BIT);

    switch(current_scene) 
        case 1: scene1(); break;
        case 2: scene2(); break;
        // [...]
    

    glutSwapBuffers();
    glutPostRedisplay();

我建议仅在 disaply 中进行缓冲区交换 (glutSwapBuffers)。将其从其他功能中删除。 使用glutPostRedisplay 将当前窗口标记为需要连续重新显示。

【讨论】:

@HooriaKhalid Lighthouse3d.com 有一个 GLUT 教程可能值得一看。

以上是关于如何在此代码中使用键盘交互的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ssh 通过提供静态文本来执行与键盘交互的操作

如何与 Xamarin UITest 中的自定义键盘进行交互?

InputAccessoryView 使用键盘交互显示/隐藏上下移动表格视图

如何在 Web UI 中使用 Javascript 键盘事件

编译的程序如何与操作系统交互?

键盘存在时禁用 TableView 交互