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

イントロダクション

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

前回は、Chapter2をやりました。でもまだ半分くらいしか見ていなかったので続きを記載いたします。

Introduction

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

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

コードを読む(Read the Code)

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

前回は上記の13のクラスについて見てみました。

今回はその続きになります。

Last time we watched 1 to 3 code of class. This time it will be the continuation.

Chapter2の肝になるクラスはDummyGameクラスになりますのでもう一度クラスのコードを記載いたします。

このクラスは「IGameLogic」インターフェースを実装しているので以下のメソッドをオーバーライドしています。

  1. init()
  2. input()
  3. update()
  4. render()

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

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

そして、「IGameLogic」インターフェースのコードは以下になります。

public interface IGameLogic {

    void init() throws Exception;

    void input(Window window);

    void update(float interval);
    
    void render(Window window);
}

インターフェースの詳細に関してはこちらのページを見てください。

上の4つのメソッドは宣言のみで中身がありません。そして、インターフェースはImplements(実装)するクラスに4つのメソッドを実装(オーバーライド)を強制します。

For detail of Inteface, Please see this page. The above 4 methods declarations only and not contents. And the interfafce implements class

つまり、以下のようなことができると言うことです。

That means that we can do following that things.

Call LogicA#render() draw LogicA of render()

IGameLogic typeA = new LogicA();
typeA.render(); // typeAクラスの描画処理を起動する

Call LogicB#render() draw LogicB of render()

IGameLogic typeB = new LogicB();
typeA.render(); // typeAクラスの描画処理を起動する

上のクラスをまとめて呼び出したい方を選択できるようにする(サンプル)

Handle to call above tow classes( Sample code as follow)

public staic void main(String[] args) throws Exception {
   Map<String, IGameLogic> map = new HashMap<>();
   map.put("typeA", new LogicA());
   map.put("typeB", new LogicB());

   // setting program arguments(プログラム引数を設定している)
   if (args.length != 0) {
      throw new Exception("プログラム引数を設定してください");
   } else {
       IGameLogic logic = map.get(args[0]);
       if (logic == null) {
          throw new Exception("プログラム引数が不適当です");
       }
       logic.render();
   }
}
  1. Mapにキーを設定し、対応するIGameLogicをimplements(実装)したクラスをセット(put)する
  2. 入力によりLogicA, LogicBを選択して各クラスのrender()を呼び出す

シンプルな処理ができました。一応、Mapインターフェースについてはこちらのページに記載しています。

  1. Set (put) the class that implements (implements) the corresponding IGameLogic
  2. Select LogcA and LogicB by input, And call each render().

Implements a simple method. And please see this page if you would like to know Map interface.

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();
    }

    /**
     * IGameLogicインターフェースを実装したので以下の
     * メソッドをオーバーライドしなくてはなりません。
     * init()
     * input()
     * update()
     * render()
     */
    @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();
    }
}

そして、再度このクラスを眺めてみると下のような構成になっています。

  • フィールド変数が3つ。うち2つは数値
  • IGameLogicインターフェースのメソッドが4つ、コンストラクタ

起動する順序としては、定義しているメソッドは全部インスタンスメソッドなのでコンストラクタから起動することになります。

  1. コンストラクタでRenderクラスを作成してフィールドにセット
  2. オーバーライドメソッドに関しては呼び出し順序が指定されません
  3. しかし、メソッド名からしてinit()が初めに呼ばれるであろうと予想はできます
  4. init()でRenderクラスのinit()を呼び出しています

あとはメソッドの中でフィールド変数の値を変更したりWindowクラスのメソッドを起動したりしています。

    1. Create a Render class in the constructor and set it in the field
    1. Calling order is not specified for override methods
    1. But from the method name it can be expected that init () will be called firstCalling
    1. init () of Render class with init ()

After that we change the value of the field variable in the method and invoke the method of the Window class.

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

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

まとめ

ここまでみれば、黒い画面がどのように動くかある程度予想できると思います。

実際にアプリケーションを起動して動かして見てください。画面に変化が出ると思います。

次回は、Chapter3を見て見ます。