我在将 glfw 窗口创建拆分为两个函数(CreateWindow、CreateGameLoop)时遇到问题。我尝试了两种方法,但其中一种会导致窗口崩溃。 第一个示例的 main 中的 CreateGameLoop 为空。 第二个示例的 CreateWindow 中的 CreateGameLoop 为空。 有谁知道如何解决吗?
不工作:
#include <stdio.h>
#include <GLFW/glfw3.h>
#include <glad/glad.h>
void CreateGameLoop(GLFWwindow* window)
{
while(!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
}
void CreateWindow(GLFWwindow* window)
{
glfwInit();
window = glfwCreateWindow(800, 600, "Game Window", 0, 0);
if (!window)
{
printf("Failed to create GLFW window\n");
glfwTerminate();
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
printf("Failed to initialize GLAD\n");
}
}
int main()
{
GLFWwindow* window;
CreateWindow(window);
CreateGameLoop(window);
return 0;
}
工作中:
#include <stdio.h>
#include <GLFW/glfw3.h>
#include <glad/glad.h>
void CreateGameLoop(GLFWwindow* window)
{
while(!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
}
void CreateWindow(GLFWwindow* window)
{
glfwInit();
window = glfwCreateWindow(800, 600, "Game Window", 0, 0);
if (!window)
{
printf("Failed to create GLFW window\n");
glfwTerminate();
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
printf("Failed to initialize GLAD\n");
}
CreateGameLoop(window);
}
int main()
{
GLFWwindow* window;
CreateWindow(window);
return 0;
}
调用
CreateWindow
函数后,你的窗口为NULL,尝试运行这个主函数:
int main()
{
GLFWwindow* window;
CreateWindow(window);
if (window == NULL)
printf("Window is NULL!\n");
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
要解决此问题,只需对
CreateWindow
函数参数进行一些小修改即可:
来自:
void CreateWindow(GLFWwindow* window) {/*...*/}
至:
void CreateWindow(GLFWwindow** window) {/*...*/}
还将函数的内部引用从
window
更改为 *window
。这就是 CreateWindow
函数最后的样子:
void CreateWindow(GLFWwindow** window)
{
glfwInit();
*window = glfwCreateWindow(800, 600, "Game Window", 0, 0);
if (!window)
{
printf("Failed to create GLFW window\n");
glfwTerminate();
}
glfwMakeContextCurrent(*window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
printf("Failed to initialize GLAD\n");
}
}
如果您希望应用程序更具兼容性,请将这些行放在
glfwInit()
: 之后
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
要在屏幕上绘图并避免将来出现问题,请设置视口大小:
glViewport(0, 0, 800, 600);
说明:当您传递一个指针并希望在函数内创建它的值时,您需要将其作为“指针指针”传递。解决这个问题的另一种方法是让这个函数返回一个
GLFWwindow*
,而不是修改作为参数传递的一个。