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

イントロダクション

以前、結構前ですが、LWJGLに触れてみました。その時は「よくわからない」の一言で済ましてしまいました。

その時は、作るもののイメージのみだったのでLWJGLがどんなものか知るだけで十分だったからです。

そして、今に至りようやく中身を理解する必要が出てきましたのでちゃんと理解します。まずは写経です。

Introduction( use google translation)

I used to talk to LWJGL a while ago. At that time I did it with a word of "I do not know well".

At that time, it was enough to know what LWJGL is like because it was only an image of what to make.

And now that we need to understand properly. First let's "写経(shakyo)"!

写経するコード( The code to  "写経"shakyo)

https://github.com/SilverTiger/lwjgl3-tutorial/blob/master/src/silvertiger/tutorial/lwjgl/Introduction.java

https://www.lwjgl.org/guide

/**
* LWJGL初めの練習用クラスです。
* This Class is Hello LWJGL
*
* @see https://github.com/SilverTiger/lwjgl3-tutorial/blob/master/src/silvertiger/tutorial/lwjgl/Introduction.java
*
* @author takunoji
*/
public class LwjglPracLv1 {

/** ウィンドウハンドラ */
long window;

/**
* 初めに動くメソッドです。全てはここから始まる。。。<br/>
* Java program start from main method...<br/>
*
* @param args Array of String
*/
public static void main(String[] args) {
   LwjglPracLv1 lv1 = new LwjglPracLv1();
}

public void run() {
   System.out.println("Hello LWJGL " + Version.getVersion());
   // 初期処理
   init();
   // ゲームループ
   gameLoop();
}

/**
*  初期処理
*/
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);

if(window == NULL) {
   throw new RuntimeException("Failed to create GLFW Window");
}

// Setup a key callback. It will be called every time a key is pressed, repeated or released.
// ラムダ式を使用しているのでJDK1.8以上のコンパイラレベルを設定する必要あり
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/11 ここまで
}

private void gameLoop() {

}

}

2018/10/11:明日も仕事があるのでここまでにします(stop coding cause I have to work tomorrow.。

昨日、写経していてビルドエラーが出ていたのでエラーの解消をしようと調べていたところ、インストールの手順が違っていたようで。。。

Yester day I had installed different packages. and referenced different site.

そんなわけで、改めて。。。

参照するサイト (Eclipseの場合を参照します)

  1. ZIP bundleをダウンロードする
  2. eclipseでUserLibraryを作成
  3. そのライブラリに全てのJARファイルを設定する

プロジェクトを右クリック→ビルドパス→Java→BuildPath(ビルドパス)→ユーザーライブラリを選択

ここでライブラリを作成し、ダウンロードしたフォルダにあるJARファイルを全部設定します。

そして、改めて写経

package zenryokuservice.gui.jogl.prac;

import org.lwjgl.*;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.*;
import java.nio.*;
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.*;
/**
 * LWJGL初めの練習用クラスです。
 * This Class is Hello LWJGL
 *
 * @see https://github.com/SilverTiger/lwjgl3-tutorial/blob/master/src/silvertiger/tutorial/lwjgl/Introduction.java
 *
 * @author takunoji
 */
public class LwjglPracLv1 {
   /** ウィンドウハンドラ */
   long window;
   /**
   * 初めに動くメソッドです。全てはここから始まる。。。<br/>
   * Java program start from main method...<br/>
   *
   * @param args Array of String
   */
   public static void main(String[] args) {
     LwjglPracLv1 lv1 = new LwjglPracLv1();
   }

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

   /**
    *  初期処理
    */
   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);
     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
     }

  );
}

  // 写経元のコードでは「loop()」になっている
  private void gameLoop() {
   GL.createCapabilities();
   glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
   while ( !glfwWindowShouldClose(window) ) {
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
      glfwSwapBuffers(window); // swap the color buffers
      glfwPollEvents();
   }
  }
}

写経完了!早速起動!。。。が起動してもすぐに終了!

画面が見れない!!!

はてどうしたものか?次へ続く(see you next page)


LWJGL 開発環境セットアップ〜Maven使用〜

諸事情

初めは、Eclipseで開発環境セットアップしましたが色々と問題があり。。。

別のサイトを参考に実行することにしました。

LWJGLインストール

今回は、GitよりダウンロードしたLWJGLのチュートリアルPDFを参考にして
「IntelliJ IDEA」を使用することにしました。
※Eclipseの場合はEclipse Meven 開発手順〜プロジェクトの作成〜
Eclipseで実行する場合、Eclipseのdumpできるリミットを解除したり
色々と面倒、調査が必要なのでIDEを変更することにしました。

ダウンロードはこちらのサイトから行いました。
ダウンロード後は、以下の様な画面を見ることになると思います。
インストールが終わってから起動すると。。。

上記の様な画面のフローがありますが、よく見ると
左下に「Default〜」というボタンがあります。
こいつをクリックすると一発で終わります。
そして、起動すると下の様な画面が出ます。

プロジェクト作成

ここからプロジェクトを作成していくのですが今回は
サンプルを使用しようと思います。なので
IntelliJをCreate New Projectで起動します。

POMファイル操作

Mabenプロジェクトを作成して初めにPOMファイルが表示されていました。
POMファイルはプロジェクトの設定やライブラリのダウンロードなど自動でやってくれます


これを右のサイトのPOMファイルの中身に書き換えます。

書き換えたら以下の様な表示が出てきました。

「Down load ...」と表示されています。記載したライブラリなど
をダウンロードしている様です。
Eclipseの時は「Maven Install」を行わないと起動しませんでした。
時代は変わるもんですねぇ。。。
そして、ダウンロードが終わったらエラーがないか確認します。
案の定エラーが出ていました。

<dependency>
<groupId>org.eclipse.swt</groupId>
<artifactId>org.eclipse.swt.win32.win32.x86</artifactId>
<version>${swt.version}</version>
</dependency>

上記の様な記載があるのですが、自分の端末は64ビットなので
使用できないものになります。
まぁ面倒臭いので全部削除します。(笑)
XMLファイルの対象部分を削除します。

<profile>
<id>linux-amd64</id>
<activation>
<os>
<family>Linux</family>
<arch>amd64</arch>
</os>
</activation>
<dependencies>
<dependency>
<groupId>org.eclipse.swt</groupId>
<artifactId>org.eclipse.swt.gtk.linux.x86_64</artifactId>
<version>${swt.version}</version>
</dependency>
</dependencies>
</profile>

削除する部分を<profile>~</profile>の範囲ごと削除する。

追伸:「インポートしてください」と出る場合があります。

依存関係のダウンロード

これでとりあえずはこのままビルドをかけてください。この作業で必要なライブラリをインストールできます。

他に追加したいものがあった場合や、ダウンロードできなかったものがあったら下のような操作で追加ダウンロードできます。
プロジェクトを右クリックして「Maven」→「Download Source」でソースを
そのほか欲しいものをダウンロードしてください。
この手順でセットアップ完了のはずです。→だめでした。原因はversion指定している部分で「${project.class}」の様な記述があるのですが、これはプロパティを参照する時に使用する文字列ではあるのですが、ここの参照先が不明のためエラーになります。

なので、Gitから直接クローンを作る方法に変更しようと思います。

まとめ

手順に従い、やってダメだった場合。手順の確認などはやる必要があるけどどうしてもできないときはすっぱりと手段を変えてやることも考える必要がある。

そこの見極めが大事だと思った。新しいLWJGLのセットアップ手順は、簡単に行けたので心配ないと思います。

でわでわ。。。

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

LWJGL Errors 〜エラーが出た時の対処〜

LWJGL実行時に出たエラー

エラー1

以下の様なエラーログが出た時

A fatal error has been detected by the Java Runtime Environment:

ulimit -c unlimitedのコマンドを打ってみてとエラーメッセージがあるので
Eclipseを起動する時にコマンドから実行する

【terminalより】

  1. ulimit -c unlimitedを実行する
  2. eclipseをコマンドより実行

これで改めて実行すれば実行できる

ただし、自分は他のエラーが出力された。。。

エラー2

Image file [resources/models/cube/cube.png] not loaded: Unable to open file

こちらのGitbookのサンプルコードプロジェクトをチェックアウト(PULL)して、サンプルコードを実行したときのエラーです。
このようなエラーは、GithubからプロジェクトをPULLしてきたときにプロジェクト設定で、表示されてしまうものです。
上記の[resources/models/cube/cube.png]はもともとのコードですが、プロジェクト(フォルダ)の構成が下のようになっているので
フォルダ「chapter-XX」の部分をパスに追加する必要があります。つまりchpter-01/resources/models/cube/cube.pngとする必要があります。

Java Game作成 〜環境構築〜

イントロダクション

Javaでゲームを作成したいと思ったら、一から作るのは面倒、というか無理です。やることが多すぎて。。。
そんなときに使えるのがフレームワークであり、それぞ支えるライブラリ群になります。
ここでは、有名なマインクラフトで使用している。LWJGLを使用して、作成されたアプリケーションを見てみようと思います。

なんでこんなことをしようかというと、「何かしらゲームを作りたいな。。。」と思ったけどゲームの作り方なんて知らんしな。。。と思ったので
知らなければ、知ればよい」ので調べることにしました。

つまりは、LWJGLというフレームワークについて調べようということです。

Javaでのゲーム作成

LWJGLでのゲーム作成に関して、LWJGLはOpenGL(3Dモデルの描画)、OpenAL, OpenXXといろいろなライブラリを統合しています。
これらのライブラリ群を使用することが可能です。なので、3D以外でも2Dなど、イメージとしてはUnityで実行できるようなことは大体できるということです。
そして、Javaで、できているので、ネットワーク通信などは得意分野になるのですがいろんな方面にて拡張する実装が可能です。

そして、LWJGLドキュメントがあるのでそれを学習するのも良いと思います。※英語なので日本語(Google翻訳)で学習しました

合わせて、コードもあるので、それらをGitからPULLしてくると自分のPC上で実行することができます。下の動画は、それぞれプログラムを実行してみたものです。 ※パスの指定など多少コードを修正して実行しました。

LWJGLの内容について

大まかに、下のような感じで3Dモデルの操作ができます。

<環境構築>

<スカイボックス>

<間接描画>


新しいバージョンでのセットアップ

こちらのセットアップは、Maven, Gradleなどでサクッとできます。

上記のリンク先に細かいセットアップ方法を記載しています。

古いバージョンでのセットアップ

LWJGLを使うとこんな感じの処理ができます。文字が見切れていますが(笑)

Javaでのゲーム作成を行う為に「LWJGL」(フレームワーク)を使用して行う

LWJGLのインストール

このサイトからダウンロードする

・上記の様な画面(2018/05/05)で「Natives」の部分で使用しているOSと
あっているか確認
・Zipでダウンロードする(「Mode」の部分でZIPが選択されていること)
・緑色の「Download」ボタンをクリックしてダウンロード
・上のZIPファイルをEclipseなどのIDEから参照しやすい場所へ展開

セットアップ(Eclipse-Oxigenを使用した場合)

参照したサイト: http://wiki.lwjgl.org/wiki/Setting_Up_LWJGL_with_Eclipse.html
・Eclipseを起動し以下の手順でライブラリを作成する
※「LWJGL_LIB」はすでに作成済みのライブラリフォルダ(JARファイルを配置しているフォルダ)です。

1. 設定画面を開く(使用するプロジェクトを右クリック→Properties(設定))

2. 「New(新規)」を選択してライブラリ名を決める

3. 作成したライブラリに参照する「JARファイル」を追加する
右側にある「Edit(編集)」ボタンを押下

4. ダウンロードしてきたZIPファイルの中にある全てのJARファイル(*.jar)を選択

・読み込みの確認
以下のクラスを作成しアプリケーションを実行する

(1) クラスの作成、メインメソッドを実装する(クラスの作成方法はこちら)
import
org.lwjgl.Version;
public class TestSetUp {
// 下のものがメインメソッド
public static void main(String[] args) {
System.out.println("LWJGJL Version = " + Version.getVersion());
}
}

クラスを作成したら、実行するときにVM引数に以下を追加
>-XstartOnFirstThread
(手順)
作成したクラスを右クリック→実行→実行構成

下の引数タブ(Arguments)のVM引数(VMarguments)に上の引数を入力して実行

実行結果が以下の様に表示されればOK

LWJGJLのバージョンが表示されます。参考にしたサイトでダウンロードした
ライブラリのバージョン名を表示しています。
(余談)
初めのプログラムで「Hello World」をやりましたが、これもやってることは
同じで、「Hello World」の代わりにバージョン名を表示しています。

関連ページ一覧

<Java Step1〜ミニゲーム作成>

  1. Java Hello World はじめのプログラム Step1-1
  2. Java 四則演算 演算子 Step1-2
  3. Java データ型 変数の扱い方〜Step1-2-1
  4. Java Basic Booleanなどの意味 Step1_2_2
  5. Java Basic for Step1_3_1
  6. Java Basic While Step1_3_2
  7. Java Basic try catch Step1_3_3
  8. Java Basic クラスとは〜Step2_1
  9. Java Basic API Listの使い方 Step2_2
  10. Java Basic インターフェース Step2_3
  11. Java Basic ミニゲーム作成 Step3_1
  12. Java Basic ミニゲーム作成 Step3_2