package gameEngine;
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 int width = 800;
private int height = 600;
String title = "HelloWorld";
private long glfwWindow;
private final List<IGameComponent> iGameComponents = new ArrayList();
private Window() {
}
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(this.glfwWindow);
glfwDestroyWindow(this.glfwWindow);
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);
glfwWindowHint(GLFW_MAXIMIZED, GLFW_FALSE);
this.glfwWindow = glfwCreateWindow(this.width, this.height, this.title, NULL, NULL);
if ( this.glfwWindow == NULL )
throw new RuntimeException("Failed to create the GLFW window");
glfwSetKeyCallback(this.glfwWindow, (window, key, scancode, action, mods) -> {
if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE )
glfwSetWindowShouldClose(window, true);
});
// 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(this.glfwWindow, pWidth, pHeight);
// Get the resolution of the primary monitor
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
// Center the window
glfwSetWindowPos(
this.glfwWindow,
(vidmode.width() - pWidth.get(0)) / 2,
(vidmode.height() - pHeight.get(0)) / 2
);
}
glfwMakeContextCurrent(this.glfwWindow);
glfwSwapInterval(1);
glfwShowWindow(this.glfwWindow);
//--------------------------------------------------------------
KeyInput.init(this.glfwWindow);
iGameComponents.add(new ColorController());
for (IGameComponent gameComponent : iGameComponents) {
gameComponent.init();
}
//--------------------------------------------------------------
}
private void loop() {
GL.createCapabilities();
while (!glfwWindowShouldClose(this.glfwWindow)) {
//---------------------------------------------------------------
// 毎フレームのキー状態を更新
KeyInput.updateKeyStates();
//GameComponentのupdate処理
for (IGameComponent gameComponents : iGameComponents) {
gameComponents.update();
}
//---------------------------------------------------------------
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // フレームバッファをクリア
glfwSwapBuffers(this.glfwWindow); // カラーバッファを交換
glfwPollEvents(); // ウィンドウイベントをポーリング
}
}
}