打开和关闭GLFW窗口后获取控制台输入有问题

时间:2012-04-23 15:41:44

标签: c opengl console glfw

我正在使用GLFW开发一个应用程序,用户可以在控制台中输入一些信息,程序对信息进行一些处理,然后打开一个opengl窗口(使用GLFW)来显示结果。然后,用户可以关闭窗口,然后返回主菜单并输入更多信息。

目前我遇到的问题是,一旦关闭GLFW / OpenGL窗口,控制台就不再接受来自scanf()的任何输入。我相当肯定我正在关闭GLFW,所以我不确定问题是什么。

我正在使用的代码如下:

MAIN.C:

#include <stdio.h>
#include <stdlib.h>
#include "glfw.h"
#include "pantograph.h"
int main(int argc, char** argv)
{
    printf("program start");
    int a = 0;
    scanf("%i",&a); //this works
    printf("%c",a);
    p_open_window(1000, 500, 0, "hi there");
    int i = 0;
    for(i=0;i<1000;i++)
    {
        p_begin_render();
        glBegin(GL_POINTS);
            glVertex2i(i,i/2);
        glEnd();
        scanf("%i",&a);
        p_end_render();
    }
    p_close_window();
    scanf("%i",&a); //this does not work
    printf("%i",a);
    return 0;
}

pantograph.h:

int p_open_window(int width, int height, int fullscreen, const char* title)
{
    glfwInit();
    glfwDisable(GLFW_AUTO_POLL_EVENTS);
    if(fullscreen)
    {
        glfwOpenWindow(width,height,8,8,8,8,0,0,GLFW_FULLSCREEN);
    }else{
        glfwOpenWindowHint(GLFW_WINDOW_NO_RESIZE, GL_TRUE);
        glfwOpenWindow(width,height,8,8,8,8,0,0,GLFW_WINDOW);       
    }

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, height, 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glDisable(GL_DEPTH_TEST);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    return 1;
}
void p_begin_render()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor4f(1.0, 1.0, 1.0, 1.0);
    glLoadIdentity();
}
void p_end_render()
{
    glfwSwapBuffers();
}
void p_close_window()
{
    glfwCloseWindow();
    glfwTerminate();
}

2 个答案:

答案 0 :(得分:0)

我对你的程序流程感到有些困惑。你说'用户可以关闭窗口并返回主菜单'。但是程序如何退出(i&lt; 1000)循环?如果用户只是关闭窗口,它似乎仍然会执行for循环(特别是因为循环中的scanf)。

您是否使用过调试器来查看程序被捕获到哪一点?

答案 1 :(得分:0)

感谢#glfw的人们,我找到了一个有些讨厌的解决方案......

如果在关闭glfw窗口后直接“刷新”输入缓冲区,scanf将再次开始工作。我不完全确定原因,但它现在似乎有效,所以我很满意。

我正在使用的代码如下(关闭窗口后):

int ch;
while ((ch = getchar()) != '\n' && ch != EOF);

此后,scanf再次开始工作。