OpenGL/GLUT Создание окна после mainEventLoop()

Я разрабатываю игру в OpenGL/GLUT, и мне нужно открыть новое окно, чтобы показать счет, когда игра выиграна.

Для этого я позвоню glutCreateWindow() и зарегистрирую обратные вызовы после вызова mainEventLoop().

Есть ли в этом проблема? Как я должен сделать это правильно?


person coredump    schedule 11.11.2012    source источник


Ответы (2)


Есть ли в этом проблема?

да.

Почему бы вам просто не нарисовать результаты в том же окне, что и игра?

Почему вы используете GLUT в первую очередь? Это не очень хороший фреймворк для игр. Лучше использовать GLFW или SDL.

Как я должен сделать это правильно?

Добавив в свой движок небольшую систему графического интерфейса, которая позволяет вам накладывать на экран статистику (например, HUD) и экран счета.

person datenwolf    schedule 11.11.2012
comment
Спасибо. Я только начинаю изучать компьютерную графику, поэтому я использую перенасыщение, точнее, халявное перенасыщение. Итак, что я хочу знать, возможно ли сделать то, что я просил? - person coredump; 11.11.2012
comment
@coredump: вы можете создавать дополнительные окна из событий пользовательского ввода и обработчиков простоя. Но создание дополнительных окон только отвлекло бы пользователя. Для игры это явно не правильный подход. - person datenwolf; 11.11.2012

Вам понадобятся две функции обратного вызова дисплея, display( ) и display2( ) для каждого окна, а также window = glutCreateWindow("Window 1"); и window2 = glutCreateWindow("Window 2");.

Пример кода:

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

int window2 = 0, window = 0, width = 400, height = 400;

void display(void)
{
    glClearColor(0.0, 1.0, 1.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    printf("display1\n");
    glFlush();
}

void display2(void)
{
    glClearColor(1.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    printf("display2\n");
    glFlush();
}

void reshape (int w, int h)
{
    glViewport(0,0,(GLsizei)w,(GLsizei)h);
    glutPostRedisplay();
}

int main(int argc, char **argv)
{
    // Initialization stuff
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(width, height);

    // Create  window main
    window = glutCreateWindow("Window 1");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutInitWindowPosition(100,100);

    // Create second window
    window2 = glutCreateWindow("Window 2");
    glutDisplayFunc(display2);
    glutReshapeFunc(reshape);

    // Enter Glut Main Loop and wait for events
    glutMainLoop();
return 0;
}
person Software_Designer    schedule 11.11.2012