イントロダクション
ここのサイトで見つけたPDF(GitBook)でLWJGLの学習を行います。
Inroduction
I found PDF for learn LWJGL this site, so I will learn to.
https://ahbejarano.gitbook.io/lwjglgamedev/chapter1
<Chapter1>
早速写経して実行して見ました。(コピペもあり。。。)
I immediately copy this code(写経). and Run this program.
そして、早速エラー出力。今日も元気だ!(And Error out put immediately. I am fine today as well!)
出力したエラーログは以下の部分に着目(Check it out this error logs)
「Please run the JVM with -XstartOnFirstThread.」
VM引数をつけてなかった。。。need VM parameter.
そんなわけで、VM引数をつけて再度実行!(so execute again with VM argument)
右クリック(Right click) -> Run Configuration -> (実行クラス選択後)Arguments
RunConfiguration(起動設定)
「Arguments」を開く、プログラム引数とVM引数があるので注意
実行(Execute)
動いた!
でもこれは以前もやっているので感動はあまりしないかな?(We have created this app before)
これが今回の写経したソースです。(This is code I wrote(写経))
ここのコードを写経しました。(Copy from this site)
import org.lwjgl.glfw.*; import org.lwjgl.opengl.*; import org.lwjgl.Version; import static org.lwjgl.glfw.Callbacks.*; import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.system.MemoryUtil.*; /** * LWJGLのGitBook Chapter1の写経を行う。 * @author takunoji */ public class Chapter1 { /** ウィンドウ */ private long window; /** * メインメソッド(JVMから起動されるメソッド) * @param args プログラム引数 ex: java プログラム引数1 プログラム引数2 プログラム引数3... */ public static void main(String[] args) { new Chapter1().run(); } /** * インスタンスメソッド(newした後に使用するメソッド)<br/> * このメソッドがメイン処理になります。 */ public void run() { System.out.println("Hello LWJGL " + Version.getVersion() + "!"); try { init(); loop(); // 登録したコールバックなどを解放する glfwFreeCallbacks(window); glfwDestroyWindow(window); } finally { // Terminate GLFW and release the GLFWerrorfun glfwTerminate(); glfwSetErrorCallback(null).free(); } } private void init() { // Setup an error callback. The default implementation // will print the error message in System.err. GLFWErrorCallback.createPrint(System.err).set(); // Initialize GLFW. Most GLFW functions will not work before doing this. if (!glfwInit()) { throw new IllegalStateException("Unable to initialize GLFW"); } // Configure our window glfwDefaultWindowHints(); // optional, the current window hints are already the default glfwWindowHint(GLFW_VISIBLE, GL_FALSE); // the window will stay hidden after creation glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); // the window will be resizable int WIDTH = 300; int HEIGHT = 300; // Create the window window = glfwCreateWindow(WIDTH, HEIGHT, "Hello World!", NULL, NULL); if (window == NULL) { throw new RuntimeException("Failed to create the GLFW window"); } // Setup a key callback. It will be called every time a key is pressed, repeated or released. glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> { if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) { glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop } }); // Get the resolution of the primary monitor GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); // Center our window glfwSetWindowPos( window, (vidmode.width() - WIDTH) / 2, (vidmode.height() - HEIGHT) / 2 ); // Make the OpenGL context current glfwMakeContextCurrent(window); // Enable v-sync glfwSwapInterval(1); // Make the window visible glfwShowWindow(window); } private void loop() { // This line is critical for LWJGL's interoperation with GLFW's // OpenGL context, or any context that is managed externally. // LWJGL detects the context that is current in the current thread, // creates the ContextCapabilities instance and makes the OpenGL // bindings available for use. GL.createCapabilities(); // Set the clear color glClearColor(1.0f, 0.0f, 0.0f, 0.0f); // Run the rendering loop until the user has attempted to close // the window or has pressed the ESCAPE key. while (!glfwWindowShouldClose(window)) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer glfwSwapBuffers(window); // swap the color buffers // Poll for window events. The key callback above will only be // invoked during this call. glfwPollEvents(); } } }
次回はChapter2をやります。(Next we will try Chapter2)