используя глобальное окно glfw в нескольких функциях - PullRequest
1 голос
/ 03 ноября 2019

У меня есть функция int main(); и функция int Game();, где в основной функции у меня есть окно, которое я использую в обеих функциях. Я определил окно в глобальной области видимости, и когда я пытаюсь запустить функцию Game(); перед циклом GLFW в основной функции, окно открывается на секунду, а затем закрывается. Затем я получаю

Ошибка: библиотека GLFW не инициализирована

, напечатанная с error_callback();

Вот мой код

#include <GLFW/glfw3.h>
#include <GL/freeglut.h>
#include <GL/GL.h>
#include <stdio.h>
#include <string>
#include <iostream>

using namespace std;

void drawText(const char *text, int length, int x, int y);
void framebuffer_size_callback(GLFWwindow* wndow, int width, int height);
void DrawCube(GLfloat centerPosX, GLfloat centerPosY, GLfloat centerPosZ, GLfloat edgeLength);
void button(GLfloat red, GLfloat green, GLfloat blue, int x, int y, int width, int height);
void error_callback(int error, const char* description);

int Game();

int width = 860, height = 490;
GLFWwindow* window;



int main(int argc, char **argv) {
    //GLTtext* text = gltCreateText();
    //gltSetText(text, "ElectroCraft");

    //GLFWwindow* window;
    int width = 860, height = 490;
    if (!glfwInit()) {
        printf("failed to init glfw");
        return -1;
    }
    glutInit(&argc, argv);
    window = glfwCreateWindow(width, height, "ElectroCraft", NULL, NULL);
    glfwMakeContextCurrent(window);
    if (!window) {
        printf("failed to start window");
        glfwTerminate();
        return -1;
    }
    Game();
    glEnable(GL_DEPTH_TEST);
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, 0, height, 0, 1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    string text;

    glfwSetErrorCallback(error_callback);

    while (!glfwWindowShouldClose(window)) {
        glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
        glClearColor(53.0f / 255.0f, 81.0f / 255.0f, 92.0f / 255.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glBegin(GL_LINES);
        glVertex2f(0, height-80);
        glVertex2f(width, height - 80);
        glEnd();
        button(192.0f / 255.0f, 192.0f / 255.0f, 192.0f / 255.0f, width / 2 - 70, height / 2, 260, 50);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwTerminate();
    return 1;
}

void error_callback(int error, const char* description) {
    fprintf(stderr, "Error: %s\n", description);
}

int Game() {
    //glfwMakeContextCurrent(window);
    glEnable(GL_DEPTH_TEST);
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, 0, height, 0, 1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    while (!glfwWindowShouldClose) {
        glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
        glClearColor(62.0f / 255.0f, 85.9f / 255.0f, 255.0 / 255.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwTerminate();
    return 1;
}

Это может быть из-за того, что я не инициировал библиотеку GLFW глобально, но я не мог этого сделать, так как получил ошибку, если оператор if был вне функции

1 Ответ

3 голосов
/ 03 ноября 2019

окно открывается на секунду, а затем закрывается

Конечно, потому что glfwWindowShouldClose не является вызовом функции в функции Game. glfwWindowShouldClose является указателем на функцию, поэтому !glfwWindowShouldClose оценивается как false и цикл никогда не запускается:

while (!glfwWindowShouldClose) {

while (!glfwWindowShouldClose(window)) {

Затем я получаю сообщение об ошибке: Библиотека GLFW не инициализирована

Это потому, что GLFW завершается на glfwTerminate() в функции Game. Удалите glfwTerminate() из функции Game.

Но учтите, что после закрытия окна вам нужно создать новое окно. Можно было бы скрыть glfwHideWindow и показать glfwShowWindow окно.

...