package gameEngine; import gameEngine.gameComponent.ColorController; import gameEngine.gameComponent.GameComponent; import gameEngine.input.*; import gameEngine.scene.*; import org.lwjgl.*; import org.lwjgl.glfw.*; import org.lwjgl.opengl.*; import org.lwjgl.system.*; import java.nio.*; import java.util.ArrayList; import java.util.List; 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.*; public class Window { private static Window window; private static Scene currentScene; private int width; private int height; private String title; private long glfwWindow; public float r,g,b,a; private final List<GameComponent> gameComponents = new ArrayList<>(); private Window() { this.width = 1200; this.height = 900; this.title = "HelloWorld"; r = 1; g = 1; b = 1; a = 0; } public static void changeScene(int newScene){ switch (newScene){ case 0: currentScene = new EditorScene(); break; case 1: currentScene = new GameScene(); break; default: assert false : "Unknown Scene [" + newScene + "]"; break; } } public static Window get() { if (window == null) { window = new Window(); } return window; } public void run() { System.out.println("Hello LWJGL " + Version.getVersion() + "!"); init(); loop(); glfwFreeCallbacks(glfwWindow); glfwDestroyWindow(glfwWindow); glfwTerminate(); glfwSetErrorCallback(null).free(); } private void init() { GLFWErrorCallback.createPrint(System.err).set(); if ( !glfwInit() ) { throw new IllegalStateException("Unable to initialize GLFW"); } //Configure GLFW glfwDefaultWindowHints(); glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); glfwWindowHint(GLFW_MAXIMIZED, GLFW_FALSE); glfwWindow = glfwCreateWindow(this.width, this.height, this.title, NULL, NULL); if ( glfwWindow == NULL ) { throw new RuntimeException("Failed to create the GLFW window"); } glfwSetCursorPosCallback(glfwWindow, MouseInput::mousePosCallback); glfwSetMouseButtonCallback(glfwWindow, MouseInput::mouseButtonCallback); glfwSetScrollCallback(glfwWindow, MouseInput::mouseScrollCallBack); glfwSetKeyCallback(glfwWindow, KeyInput::keyCallback); // Get the thread stack and push a new frame try ( MemoryStack stack = stackPush() ) { IntBuffer pWidth = stack.mallocInt(1); // int* IntBuffer pHeight = stack.mallocInt(1); // int* // Get the window size passed to glfwCreateWindow glfwGetWindowSize(glfwWindow, pWidth, pHeight); // Get the resolution of the primary monitor GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); // Center the window glfwSetWindowPos( glfwWindow, (vidmode.width() - pWidth.get(0)) / 2, (vidmode.height() - pHeight.get(0)) / 2 ); } glfwMakeContextCurrent(glfwWindow); glfwSwapInterval(1); glfwShowWindow(glfwWindow); gameComponents.add(new ColorController()); for (GameComponent gameComponent : gameComponents) { gameComponent.init(); } GL.createCapabilities(); Window.changeScene(0); } private void loop() { double beginTime = Time.getTime(); double endTime; double dt = -1.0f; while (!glfwWindowShouldClose(glfwWindow)) { glfwPollEvents(); // ウィンドウイベントをポーリング glClearColor(r, g, b, a); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // フレームバッファをクリア for (GameComponent gameComponents : gameComponents) { gameComponents.update(); } if(dt >= 0){ currentScene.update((float)dt); } glfwSwapBuffers(glfwWindow); // カラーバッファを交換 endTime = Time.getTime(); dt = endTime - beginTime; beginTime = endTime; } } }