LWJGL Java Game Dev

Cara membuat project LWJGL 3 Untuk Game Development

May 15, 2019

Light Weight Java Game Library ( LWJGL ) adalah sebuah java library yang memungkinkan kita untuk membuat cross platform game atau membuat game di windows, linux dan macos dalam satu codebase.

Dalam pembuatan game yang menjadi tantangan adalah bagaimana kita bisa mengolah grafik dengan cukup baik. Untuk itu salah satunya kita bisa menggunakan OpenGL sebagai salah satu alat untuk berinteraksi dengan hardware yang juga di gunakan di semua sistem seperti windows, linux dan macos.

OpenGL sendiri di tulis dengan bahasa pemrogramman c++ sehingga sangat efisien untuk mengolah memory. Akan tetapi untuk mengolah grafik itu ada banyak software yang bisa kita gunkan, seperti Vulkan, EGL, OpenGL ES dan yang lainya.

LWJGL ini sendiri adalah wrapper dari berbagai software grafik yang ada. Sehingga memudahkan kita untuk memulai game development untuk cross platform.

Generate LWJGL Dependencies

Pada kesempatakan kali ini saya menggunakan editor InteliJ IDEA. Silahkan download dulu kalau kamu belum punya editor ini.

Selanjutnya buka dependency generator di sini.

https://www.lwjgl.org/customize

Kemudian pada pilihan mode centang Maven dan pada preset centang Minimal OpenGl untuk yang lainya akan tercentang secara otomatis.

lwjgl

Lalu click button Copy to clipboard untuk mencopy dependency nya.

Buat maven project

Buka editor InteliJ IDE lalu buat project baru.

buat project

Jika sudah selesai buka file pom.xml paste dependency yang sudah kita generate tadi.

    <properties>
        <lwjgl.version>3.2.2</lwjgl.version>
        <lwjgl.natives>natives-macos</lwjgl.natives>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.lwjgl</groupId>
            <artifactId>lwjgl</artifactId>
            <version>${lwjgl.version}</version>
        </dependency>
        ...saya potong untuk menyingkat contoh

Buat Window

Nah belajar OpenGL ini agak sedikit butuh waktu jadi kita belajar secara bertahap. Kali ini kita akan mencoba bikin window sederhana dengan LWJGL ini.

Silahkan buat class Game.java dan isikan seperti ini.

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.*;

public class Game {

    // The window handle
    private long window;

    public void run() {
        System.out.println("Hello LWJGL " + Version.getVersion() + "!");

        try {
            init();
            loop();

            // Release window and window callbacks
            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 = 500;
        int HEIGHT = 500;

        // Create the window
        window = glfwCreateWindow(WIDTH, HEIGHT, "Game", 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(0.3f, 0.5f, 0.4f, 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();
        }
    }

    public static void main(String[] args) {
        new Game().run();
    }

}

Run project

Nah untuk run project ini silahkan clik kanan lalu pilih run. Atau tekan Ctrl+shift+R . Jika kamu belum mengaktifkan lambada support akan ada error saat compile.

Untuk itu pada file pom.xml tambahkan support java 8.

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

Jika sudah coba run kembali. Jika kamu menggunakan mac mungkin kamu akan mengalami error seperti ini.

2019-05-15 17:11:22.477 java[7330:148483] *** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /BuildRoot/Library/Caches/com.apple.xbs/Sources/Foundation/Foundation-1570.16/Foundation/Misc.subproj/NSUndoManager.m:361
2019-05-15 17:11:22.478 java[7330:148483] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff392b0e45 __exceptionPreprocess + 256
    1   libobjc.A.dylib                     0x00007fff63ee83c6 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff392cbe4a +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x00007fff3b57be11 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 194
    4   Foundation                          0x00007fff3b4aee7c +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 473
    5   AppKit                              0x00007fff3686bf89 -[NSApplication run] + 916
    6   libglfw.dylib                       0x00000001287c89d5 libglfw.dylib + 68053
    7   libglfw.dylib                       0x00000001287c2366 libglfw.dylib + 41830
    8   ???                                 0x0000000112a92910 0x0 + 4608043280
)
libc++abi.dylib: terminating with uncaught exception of type NSException

Untuk itu coba tambahkan configurasi berikut ini.

Run Configuration

Tambahkan VM Option -XstartOnFirstThread :

Config

Jika sudah berhasil maka akan muncul tampilan seperti berikut ini.

Game

Nah cukup mudah bukan. Sekarang buat kamu yang ingin mendownload contoh dari project ini silahkan download sini.

https://github.com/ar-android/java-game-lwjgl/tree/235633cf87459b19a609095bc5fce0bb19fc6e37

Kita akan lanjutkan di tutorial berikutnya untuk bikin game loop. Jangan lupa subscribe email untuk mendapatkan pemberitahuan jika sama menambahkan tutorial yang baru ya.

Subscribe to My Newsletter

Thank you for your interest in my blog. Sign up to my newsletter to stay current on the latest news and information me and to be the first to see new blog posts.