Separate GLFW Window init/loop logic into Window class

This commit is contained in:
2025-08-14 22:58:13 +01:00
parent 27978d02de
commit dcd822d165
2 changed files with 96 additions and 68 deletions

View File

@@ -1,74 +1,7 @@
package org.hirw.game; package org.hirw.game;
import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;
import java.nio.*;
import org.lwjgl.*;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.*;
public class App { public class App {
private long window;
public void run() {
System.out.println("Hello LWJGL " + Version.getVersion() + "!");
init();
loop();
glfwFreeCallbacks(window);
glfwDestroyWindow(window);
glfwTerminate();
glfwSetErrorCallback(null).free();
}
private void init() {
GLFWErrorCallback.createPrint(System.err).set();
if (!glfwInit()) throw new IllegalStateException("Unable to initialize GLFW");
glfwDefaultWindowHints();
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
window = glfwCreateWindow(300, 300, "Hello World!", NULL, NULL);
if (window == NULL) throw new RuntimeException("Failed to create the GLFW window");
glfwSetKeyCallback(
window,
(window, key, scancode, action, mods) -> {
if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE)
glfwSetWindowShouldClose(window, true);
});
try (MemoryStack stack = stackPush()) {
IntBuffer pWidth = stack.mallocInt(1);
IntBuffer pHeight = stack.mallocInt(1);
glfwGetWindowSize(window, pWidth, pHeight);
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(
window, (vidmode.width() - pWidth.get(0)) / 2, (vidmode.height() - pHeight.get(0)) / 2);
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glfwShowWindow(window);
}
private void loop() {
GL.createCapabilities();
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
while (!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
}
public static void main(String[] args) { public static void main(String[] args) {
new App().run(); Window.get().blastOff();
} }
} }

View File

@@ -0,0 +1,95 @@
package org.hirw.game;
import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;
import java.nio.*;
import org.lwjgl.Version;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.*;
public class Window {
private final int width, height;
private final String title;
private long glfwWindow;
private static Window window = null;
private Window() {
this.width = 1280;
this.height = 720;
this.title = "game";
}
public static Window get() {
if (Window.window == null) {
Window.window = new Window();
}
return Window.window;
}
public void blastOff() {
logVersion();
setup();
loop();
cleanUp();
}
private void logVersion() {
System.out.println("LWJGL Version: " + Version.getVersion());
}
private void setup() {
GLFWErrorCallback.createPrint(System.err).set();
if (!glfwInit()) throw new IllegalStateException("Unable to initialize GLFW");
glfwDefaultWindowHints();
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
glfwWindow = glfwCreateWindow(this.width, this.height, "Hello World!", NULL, NULL);
if (glfwWindow == NULL) throw new RuntimeException("Failed to create the GLFW window");
// glfwSetKeyCallback(
// glfwWindow,
// (glfwWindow, key, scancode, action, mods) -> {
// if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE)
// glfwSetWindowShouldClose(glfwWindow, true);
// });
//
// try (MemoryStack stack = stackPush()) {
// IntBuffer pWidth = stack.mallocInt(1);
// IntBuffer pHeight = stack.mallocInt(1);
// glfwGetWindowSize(glfwWindow, pWidth, pHeight);
// GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
// }
glfwMakeContextCurrent(glfwWindow);
glfwSwapInterval(1);
glfwShowWindow(glfwWindow);
GL.createCapabilities();
}
private void loop() {
// GL.createCapabilities(); // Does this maybe go in here?
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
while (!glfwWindowShouldClose(glfwWindow)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glfwSwapBuffers(glfwWindow);
glfwPollEvents();
}
}
private void cleanUp() {
glfwFreeCallbacks(glfwWindow);
glfwDestroyWindow(glfwWindow);
glfwTerminate();
glfwSetErrorCallback(null).free();
}
}