Java 3DGame LWJGL GitBook chapter2-1〜LWJGLを学習する2-1〜

イントロダクション

LWJGL GitBookChapterを写経しながら理解していきます。Git(ソース)はこちら。。。

前回、Chapter1をやったので今回はChapter2をやります。

Introduction

LWJGL We will understand GitBook 's chapter while shooting. Git (source) is here. . . Last time I did Chapter 1, so I will do Chapter 2 this time.

https://ahbejarano.gitbook.io/lwjglgamedev/chapter2

Chapter2

今回から、コピーするクラスの量が増えるのですが、ちゃんと理解したい人はいままで通りに写経することをオススメします。

From this time, amount of classess to be copied increases. but those who understand properly recommend to sharpen them as they are.

ミッション1(Mission1)

単純に写経した場合、作成したパッケージなどの違いによりビルドエラーが出ます。このエラーを解消するのがミッション1になります。

If you copied those code, then you find build error in your code. so Mission1 is fix those errors.

ミッション2(Mission2)

ビルドエラーが解消できたら起動すると思います。(多分。。。)実行してみると以下のような画面が表示されます。「なんだ黒くなっただけか・・・」とげんなりするかもしれません。(自分はしました)なのでコードの内容を見ていきます。

We think that it will start up when the build error is resolved(Probably...). When you try it, the following screen displayed. it may be "just turned black..."(I did it). so we will look at contents of code.

**********************


**********************

コードを読む(Reading the Code)

上のように書くと「プログラマ」と言う感じがしますね(笑)。  日本では「プログラマ」と言うとちょっと低く見られがちですが、結局最後はプログラマ頼みなのになんで「低く見られなくてはならないのか?」が未だにわかりません。まぁ逆に「プログラマだからお高くとまる」のも筋違いですが。。。

余談でした。それでは早速読みましょう。

Writing like the above, I feel like saying "Programmer"(笑). In japan,Lastly it can not do anything without a programmer, but I still do not understand why "should programmer be seen low in Japan?" Well, on the contrary "It is a programmer so great" is also mistake...

It was a digreesion. Let's read a code!

登場するクラス一覧(List of classes in chapter2)

  1. Main This time
  2. DummyGame This time
  3. Renderer This time
  4. GameEngine
  5. IGameLogic
  6. Timer
  7. Window

<Mainクラスはメインメソッドを起動するだけ>

import zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter2.engine.GameEngine;
import zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter2.engine.IGameLogic;
public class Main {
    public static void main(String[] args) {
        try {
            boolean vSync = true;
            IGameLogic gameLogic = new DummyGame();
            GameEngine gameEng = new GameEngine("GAME", 600, 480, vSync, gameLogic);
            gameEng.start();
        } catch (Exception excp) {
            excp.printStackTrace();
            System.exit(-1);
        }
    }
}

<DummyGameクラスはIGameLogicインターフェースを実装している>

  1. Renderクラスの初期化とクリア
  2. Windowクラスのリサイズと背景色を入力により変更する

DummyGameクラスのコード

import static org.lwjgl.glfw.GLFW.GLFW_KEY_DOWN;
import static org.lwjgl.glfw.GLFW.GLFW_KEY_UP;
import static org.lwjgl.opengl.GL11.glViewport;
import zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter2.engine.IGameLogic;
import zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter2.engine.Window;
public class DummyGame implements IGameLogic {
    private int direction = 0;
    private float color = 0.0f;
    private final Renderer renderer;
    public DummyGame() {
        renderer = new Renderer();
    }
    @Override
    public void init() throws Exception {
        renderer.init();
    }
    @Override
    public void input(Window window) {
        if ( window.isKeyPressed(GLFW_KEY_UP) ) {
            direction = 1;
        } else if (window.isKeyPressed(GLFW_KEY_DOWN) ) {
        direction = -1;
    } else {
        direction = 0;
        }
    }
    @Override
    public void update(float interval) {
        color += direction * 0.01f;
        if (color > 1) {
            color = 1.0f;
        } else if ( color < 0 ) {
            color = 0.0f;
        }
    }
    @Override
    public void render(Window window) {
        if ( window.isResized() ) {
            glViewport(0, 0, window.getWidth(), window.getHeight());
            window.setResized(false);
        }
        window.setClearColor(color, color, color, 0.0f);
        renderer.clear();
    }
}

**********************



**********************

<Renderクラスはクリア処理(背景を黒くするのか?)を行う>

package zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter2.game;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.glClear;
public class Renderer {
    public Renderer() {
    }
    public void init() throws Exception {
    }
    public void clear() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }
}


多少読んでみると十字キーの上と下でコントロールできるようです。実際に動かし背景色が変わりました。

今回はここまで、ではまた次回。(See you next time)

**********************


**********************