Java 3DGame LWJGL GitBook chapter1〜LWJGLを学習する1〜

イントロダクション

ここのサイトで見つけたPDF(GitBook)でLWJGLの学習を行います。

ソースコードはこちら

Inroduction

I found PDF for learn LWJGL this site, so I will learn to.

And source code is here

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)