設計を始める〜1.アプリイメージ〜

せっかくLWJGLを学び始めたのでスマホゲーム式の家計簿アプリを作ろうと思います。

まずイメージ図

そして、処理のイメージを作る

  1. ボタン押してレシートを読む
  2. レシートから情報取得
  3. ファイルor DBに保存
  4. Checkボタンで支出のチェック
  5. scheduleボタンでスケジュール表示
  6. Viewに表示する

Readボタン押してレシートを読み内容をDB登録

設計っては考えている事を描く…

こんな時、イラストとかかける人は凄く強い、なんせイメージをビジュアライズできるのだから。

script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">





LWJGL tutorial〜ここからダウンロード〜

イントロダクション

ここしばらく、LWJGLでのCube描画を試みようと色々と調べたが、部分的に理解してやろうとしてもダメなようだ。。。と判断しました。

そんなわけで、良いものを見つけたのでここにメモします。

見つけたもの

Gitブック(PDFでもHTMLでもいける)のページを見つけました。以前見つけたのはPDFでダウンロードできるドキュメントのみを見ていたのですが、ソースもあるならそれも一緒にダウンロードした方がわかりやすい。。。と言うことになりました。(自分の中で)

どうやるのか?(Gitクローンします)

上のリンクからページに飛びます。

スクリーンショット 2018-10-21 20.31.06.png

Clone or downloadの部分からURLをコピーします。

Eclipseのプロジェクト部分を右クリックします。

スクリーンショット 2018-10-21 20.33.47.png

Importを選択します。

スクリーンショット 2018-10-21 20.35.16.png

Git -> Project from Gitを選択、Nextをクリックします

スクリーンショット 2018-10-21 20.36.19.png

Clone URIを選択します ※URIはURLよりも意味の広い言葉です。

スクリーンショット 2018-10-21 20.36.44.png

ここまできたら、そのまま「Next」を押下します

スクリーンショット 2018-10-21 20.41.50.png

ダウンロードが始まります。

スクリーンショット 2018-10-21 20.43.01.png

スクリーンショット 2018-10-21 20.43.41.png

Finishをクリックするとプロジェクトが作成されます。

スクリーンショット 2018-10-21 20.43.56.png

これでGitからプロジェクトをクローンできました。

 

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

イントロダクション

前回は、"LWJGL Hello Wold"を写経しました。そして起動しても動きませんでした。そんな時に何をするべきか記載いたします。※自分の場合になります。

Introduction

Last time, we  did "写経(shakyo)". But it did not view anything. This time, list up to what we have to do?. ※ In my case.

やるべきこと

この時に考えるのは以下の点見直す、もしくは考えます。

  1. 写し間違えがないか確認する
  2. ビルドエラーがないか確認する
  3. 実装漏れがないか確認する
  4. エラーが出ている部分を見つける

What we have to do?

  1. check there is not miss in target code.
  2. check there is not build error in Eclipse.
  3. check wrote all code in target code.
  4. if you get Exception then find out Exception point in your code.

自分の場合 (In my case)

解決はしたので、結果から記載します。下は実行結果です。

I had get resolution after performing the above procedure.

<作成したコード(Implemented code)>

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/>
 * <ul>
 * <li>LWJGLの起動には"-XstartOnFirstThread"のVM引数がいるようだ</li>
 * <li>Javaのバージョンは1.8以降を使用する</li>
 * </ul>
 * @param args Array of String
 */
 public static void main(String[] args) {
 LwjglPracLv1 lv1 = new LwjglPracLv1();
 // 2018/10/12 このメソッドを起動していないから動かなかった。。。
 lv1.run();
 }

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
 });
 // 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);
 // 2018/10/12 実装漏れここまで
 }
 }
 // 写経元のコードでは「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();
 }
 }
}

初めの起動時には以下のようなエラーが出ました。

First time, I had get Exception as bellow.

Exception in thread "main" java.lang.IllegalStateException: There is no OpenGL context current in the current thread.
at org.lwjgl.opengl.GL.createCapabilities(GL.java:376)
at org.lwjgl.opengl.GL.createCapabilities(GL.java:320)
at zenryokuservice.gui.jogl.prac.LwjglPracLv1.gameLoop(LwjglPracLv1.java:108)
at zenryokuservice.gui.jogl.prac.LwjglPracLv1.run(LwjglPracLv1.java:48)
at zenryokuservice.gui.jogl.prac.LwjglPracLv1.main(LwjglPracLv1.java:40)

もし、英語がよめなかったら「google翻訳」などを使えば良いと思います。※自分はフル活用しています(笑)
「OpenGLのコンテキストがありませんよ」と怒られているので、調べました。そしたら、赤字で書いている行以降の実装をしていなかったので上記のようなエラー(例外)が出ました。その他にもメインメソッドのJavaDoc部分に記載したようなことがありました。JavaDoc部分は緑色にしてあります。

VM引数に関してはこちらのページを参照してください。ページ内を「VM引数」で検索すれば見つかります。

I found message that "There is no OpenGL context....", and thought how to get  resolution. so I wrote resolution in javaDoc wrote in green text. and I missed implementation in red text part.

次回は、このコードをいじってみようと思います(笑)

Next time I will play with this code(笑)


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

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

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

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

Mabenプロジェクトを作成して初めに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から直接クローンを作る方法に変更しようと思います。

 

関連ページ一覧

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の使用)〜

Java Game作成 〜環境構築〜

Javaでのゲーム作成

ちなみに、有名なマインクラフトはLWJGLを使用して作成されたアプリケーションです。

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