Java 3DGame Creation LWJGL Lv3〜 Javaでゲームを作るLv3〜

イントロダクション

前回、Hello LWJGLをやりました。とりあえずは動いたのでここから遊んでみます。→これがプログラムの内容理解になります。

Introduction

Last time, we tried "Hello LWJGL". so let's play LWJGL in own code! → playing will learn.

実装したコードは、こちらになります。

First, implemented code is here.

どうやって遊ぶのか?( How do i play with sample code?)

実行結果が以下のようになります。(The execution result is as fllow)

画面が真っ赤じゃ面白くないのでこの表示を変更する方法を見つけていじることにします。

It's no interesting as only red view. so I think try to change view and draw something.

どこをいじるのか探す(Find out where you are fidding)

スマートな方法としては、対象コード、使用しているフレームワークのドキュメント見るのが良いと思います。

Best way is watch the document

Git Book

https://legacy.gitbook.com/book/lwjglgamedev/3d-game-development-with-lwjgl/details

まず、メソッドの名前をみてみます。今回の実装しているコードにあるメソッドは以下の通りです。

  1. メインメソッド(main())
  2. 初期処理(init())
  3. ゲームループ(gameLoop())

そして、実装したソースの中身が見れないと何もわからないのでソースのリンクを貼ります。

And we do not understand anything if not read LWJGL source, so attach the LWJGL sources.

ソースのアタッチ

中をみてみたいソースコードにカーソルを当てた状態でF3(windows)か[fn]+F3(mac)を押下してください。以下のよう眺めんが見れます。

そして、「Attach Source」と書いてあるボタンをクリックします。

ラジオボタンで下の方を選択します。(External location)

「External File」ボタンをクリックします。

見辛いですが、下の画像にあるように「lwjgl-glfw.jar」と記述されている部分があります。

なので、そいつを探してアタッチします。前回ダウンロードしたZIPファイルの中にあるのでご安心を

こんな感じです。

ポイント(watch it out)

今回使用している(インポートしている)、LWJGLの部品で「static」のついているものがあります。

import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;

これは宣言、やインスタンスを作らなくてもアクセスするための記述になります。

JUnitというテスト用のフレームワークでも「assertTrue(), assertNull(), fail()」などのメソッドも「static import」しています。下にサンプルコードを示します。

JUnitでのテストコードサンプル( Sample code in JUnit)

@Test
public void test01() {
   System.out.println("テスト開始");
   try {
       File file = new File("/text.txt");
       if (file.exist()) {
          throw new FileNotFoundException("パスが間違っています");
       }
   catch(FileNotFoundException e) {
       fail("テスト失敗");
   }
}

ちょっと長くなったので、今回はここまでにします。

Because I wrote too much. I will describe it in the next step.

2018-10-18

今まで見てきた処理からして、構成は以下のようになります。

From the back ground. Code configuration is as bellow,

  1. run(): このクラスの処理を起動する(メイン処理)
  2. init(); 初期化
  3. gameloop(); 未実装
  4. glfwTerminate(): GLFWの終了処理

  5. glfwSetErrorCallback(null).free(); メモリなどの解放

結論から言うと、「ここに書く」と言うのが見つかりません。。。なので追記します。

From the conclusion, there is no place to implements display method. however we can do it!

コードを追記するのに適当な場所は、画面を描画(初期化)している部分に記載するのが良いと判断し、そこを探します。

I decided that it is a good idea place it in the part where the screen is being drawing(initialized), and search there for places suitable for appending code.

そして、こんな時はメイン処理を眺めます。And look for the place main function.

public void run() {
		System.out.println("Hello LWJGL " + Version.getVersion());
		// 初期処理
		init();
		// ゲームループ
		gameLoop();
		
		glfwFreeCallbacks(window);
		glfwDestroyWindow(window);
System.out.println("終了処理");
		glfwTerminate();
		glfwSetErrorCallback(null).free();		
	}

大まかな処理を一望できるのでメイン処理部分はメインでまとめるとあとあと楽です。

Since you can see the rough processing, the main processing part is easy if you  put in the main.

ソースをいじって遊ぶ場所(The place to play code)

赤字の部分です。 Red line.

/**
 *  初期処理
 */
private void init() {
	// エラー時のコールバックに標準エラー出力を設定する
	GLFWErrorCallback.createPrint(System.err).set();
	// GLFWの初期化
	if (!glfwInit()) {
		throw new IllegalStateException("Unalbe to Initialize GLFW");
	}
	
	// GLFWの設定処理
	glfwDefaultWindowHints();
	glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
	glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
	
	window = glfwCreateWindow(300, 300, "Hello LWJGL", NULL, NULL);
	// ここに描画用のメソッドを追加します。
	addMethod(window);
	if(window == NULL) {
		throw new RuntimeException("Failed to create GLFW Window");
	}
	
	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
		});
		// 2018/10/12 実装漏れ
	try (MemoryStack stack = stackPush()) {
		IntBuffer pWidth = stack.mallocInt(1);
		IntBuffer pHeight = stack.mallocInt(1);
		// ウィンドウサイズ指定
		glfwGetWindowSize(window, pWidth, pHeight);
		// 
		GLFWVidMode vidMode = glfwGetVideoMode(glfwGetPrimaryMonitor());
		// 画面の中央座標を設定する
		glfwSetWindowPos(
				window
				, (vidMode.width() - pWidth.get(0) / 2)
				, (vidMode.height() - pHeight.get(0)) / 2
		);
		// OpenGLコンテキストを作成する
		glfwMakeContextCurrent(window);
		// enable v-sync
		glfwSwapInterval(1);
		// 表示処理
		glfwShowWindow(window);
	}
}

追加する場所がわかったので、次は中身の実装をしてみようと思います。

We knew the place to add, we will try to implement content next.

Have a good day!

 


投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す