Eclipse アプリ作成 Lv5〜惨敗:CubeにTextureを貼る〜

参照するドキュメント(LWJGL-GitBook)

参照コード:Chapter7-1(Gitです)

イントロダクション

前回、なんとか以下のように各Cube毎に「高さ」を与えてやることができました。

 

しかし、ぱっと見では「よくわからん」のが現状です。なのでこいつを少しはわかりやすくするために「思いやり」を発揮します。

思いやりその1

実は上記のキャプチャは以下のものを示しています(そのつもりです)。

  1. Cubeの「高さ」は家計簿の支出金額を示しています。
  2.  7 x 5のマスは1ヶ月を示しています(マスは1日)。

「全然わかんねぇよ!」と怒られそうですが、現状はそんなもんでしょう。

そんなわけで試行錯誤してみます。

  1. 手前の面に(月)〜(日)をつけてみる
  2. 左の面に1週〜5週までを示す文言を表示する

とりあえずはこれで行ってみようと思います。

テクスチャを貼る

<2018/11/05>  /** 戦闘中 */

今日の目玉です。ですが、今日はテクスチャを退治することができず。。。

以下のようなエラーが出てしまい、解決に至らず。。。と行ったところです。


Warning validating Shader code: Validation Failed: No vertex array object bound.

java.lang.NullPointerException
at de.matthiasmann.twl.utils.PNGDecoder.readFully(PNGDecoder.java:802)
at de.matthiasmann.twl.utils.PNGDecoder.(PNGDecoder.java:112)
at zenryokuservice.gui.lwjgl.kakeibo.engine.graph.Texture.loadTexture(Texture.java:31)
at zenryokuservice.gui.lwjgl.kakeibo.engine.graph.Texture.(Texture.java:14)
at zenryokuservice.gui.lwjgl.kakeibo.game.DummyGame.putOnTexturePlate(DummyGame.java:109)
at zenryokuservice.gui.lwjgl.kakeibo.game.DummyGame.init(DummyGame.java:81)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.init(GameEngine.java:48)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.run(GameEngine.java:36)
at java.lang.Thread.run(Thread.java:748)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.start(GameEngine.java:27)
at zenryokuservice.gui.lwjgl.kakeibo.game.Main.main(Main.java:13)
java.lang.NullPointerException
at de.matthiasmann.twl.utils.PNGDecoder.readFully(PNGDecoder.java:802)
at de.matthiasmann.twl.utils.PNGDecoder.(PNGDecoder.java:112)
at zenryokuservice.gui.lwjgl.kakeibo.engine.graph.Texture.loadTexture(Texture.java:31)
at zenryokuservice.gui.lwjgl.kakeibo.engine.graph.Texture.(Texture.java:14)
at zenryokuservice.gui.lwjgl.kakeibo.game.DummyGame.putOnTexturePlate(DummyGame.java:109)
at zenryokuservice.gui.lwjgl.kakeibo.game.DummyGame.init(DummyGame.java:81)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.init(GameEngine.java:48)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.run(GameEngine.java:36)
at java.lang.Thread.run(Thread.java:748)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.start(GameEngine.java:27)
at zenryokuservice.gui.lwjgl.kakeibo.game.Main.main(Main.java:13)
java.lang.ArrayIndexOutOfBoundsException: 7
at zenryokuservice.gui.lwjgl.kakeibo.game.DummyGame.putOnTexturePlate(DummyGame.java:109)
at zenryokuservice.gui.lwjgl.kakeibo.game.DummyGame.init(DummyGame.java:81)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.init(GameEngine.java:48)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.run(GameEngine.java:36)
at java.lang.Thread.run(Thread.java:748)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.start(GameEngine.java:27)
at zenryokuservice.gui.lwjgl.kakeibo.game.Main.main(Main.java:13)
java.lang.NullPointerException
at zenryokuservice.gui.lwjgl.kakeibo.engine.graph.Mesh.render(Mesh.java:89)
at zenryokuservice.gui.lwjgl.kakeibo.game.Renderer.render(Renderer.java:70)
at zenryokuservice.gui.lwjgl.kakeibo.game.DummyGame.render(DummyGame.java:278)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.render(GameEngine.java:100)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.gameLoop(GameEngine.java:68)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.run(GameEngine.java:37)
at java.lang.Thread.run(Thread.java:748)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.start(GameEngine.java:27)
at zenryokuservice.gui.lwjgl.kakeibo.game.Main.main(Main.java:13)
java.lang.NullPointerException
at zenryokuservice.gui.lwjgl.kakeibo.engine.graph.Mesh.cleanUp(Mesh.java:114)
at zenryokuservice.gui.lwjgl.kakeibo.game.DummyGame.cleanup(DummyGame.java:285)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.cleanup(GameEngine.java:77)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.run(GameEngine.java:41)
at java.lang.Thread.run(Thread.java:748)
at zenryokuservice.gui.lwjgl.kakeibo.engine.GameEngine.start(GameEngine.java:27)
at zenryokuservice.gui.lwjgl.kakeibo.game.Main.main(Main.java:13)


<2018/11/06>

今日も敗北を喫してしまいました。

だけど、NullPointerExceptionは解決しました。

原因は、参照しているファイルが間違っていたことです。実装したコード

そして、Meshクラス1つで2種類のMeshクラスを管理しようとしたりと。。。つまづきました。

そして今日は、ここまで来ました。

本当は、Cubeの手前に「月〜日」のテクスチャをつける予定だったのですが。。。なんでこうなったのかが、まるでわかりません。→敗北。。。

修正したコードは、

  1. DummyGame
  2. GameItem
  3. Renderer

上記3クラスです。そして、新たに追加したのが「TexturedMesh」クラスです。

<2018/11/07>

色々試したけど、次の機会にリベンジを決める方向に移行します。。。

中途半端にImageが読み込めているのが悔しいさを倍増させますな。。。「月」の一部が表示されている感じに見えます。

Maven executable jar〜実行可能Jarファイル出力〜

イントロダクション

RPiへのデプロイをする時にMacからJARファイルをSSHで転送するやり方は不便なので以下の手順でできないか検討してみます。

つまり、Windowsで開発して、できたものをラスパイ(RPi)で動かすのにはどうしたらよいか?を検討しました。

解決へ移動

デプロイのフロー

  1. Mac上で起動テストを行ったソースをGitへ登録(Push)
  2. RPiで上記のプロジェクトをダウンロード
  3. RPi上でソースをビルドしてJARファイルを作成

この手順でJARファイルを作成し、実行する、上記の手順はRPi起動時に自動実行する様にautostartファイルに記載する

開発端末でのMaven設定(pom.xml)

pom.xmlの構成

?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <!-- プロジェクト設定 -->

 <build>
 <!-- 入出力の設定 -->
 <!-- DEFAULT RASPBERRY PI PROPERTIES -->
 <pi.host>XXX.XXX.XXX</pi.host>
 <pi.port>22</pi.port>
 <pi.user>user_name</pi.user>
 <pi.password>password</pi.password>
 <pi.deployDirectory>/home/user_name/</pi.deployDirectory>
 <pi.main.class>your.package.name.mainClass</pi.main.class>

 <plugins>
   <plugin> 
      <!-- ビルド設定:mvn [plugin name] --> 
   </plugin>
 </plugins>
</build>
 <reporting>
   <plugin>
      <!-- レポート設定 -->
   </plugin>
 </reporting>
 <dependencies>
   <dependency>
     <!-- ライブラリ依存関係の設定 -->
   </dependency>
 </dependencies>
</project>

この構成の中に必要な情報を記述する。

作成したpom.xml(テスト未実施)→失敗

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>zenryokuservice</groupId>
    <artifactId>PAppletRpiCtl</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <repositories>
        <repository>
            <id>RPiCtl</id>
            <url>https://github.com/ZenryokuService/rpictl</url>
        </repository>
    </repositories>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <url>http://repo1.maven.org/maven2/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </pluginRepository>
    </pluginRepositories>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.processing/core -->
        <dependency>
            <groupId>org.processing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.6</version>
        </dependency>
    </dependencies>
    <build>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>libs/</classpathPrefix>
                            <mainClass>
                                pictl.swing.frame.RpiCtl
                            </mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Mac上でのMavenビルド結果(RPi上では未実施)

結果、上記の方法ではできませんでした。

原因

  1. 「マニフェスト属性がありません」と怒られる
  2. 「processingを使用するためのJARがない」と怒られる 

問題部分

  • pomファイルにマニフェストを追加していなかった
  • 参照するJARを出力するJARにインクルードしていなかった

足りない部分をpomファイルに記載してビルドする

processingから参照しているものがある様だ。。。

<修正箇所>

・jarプラグインのバージョンを追記

・${artifactId}を${project.artifactId}に修正

 

2018/09/29 現在:調査中

<参考サイト>

processing: https://github.com/processing/processing/releases

maven: https://www.ibm.com/developerworks/jp/java/library/j-5things13/

pom: https://stackoverflow.com/questions/49398894/unable-to-compile-simple-java-10-project-with-maven

補足

実はpomファイルでjarを出力する前にRPi上では画面を起動するために(processingを起動するためにXFCE4をインストール、起動する必要があります。

この部分に関しては後日。。。

2018-09-30現在

まるで動かない。。。違う手段を検討する。。。

解決

GIthubを使用して、Git経由で、プログラムを起動する。

つまり

  1. Windowsで作成したプログラムをGithubhへPUSH
  2. 他の端末でPULLして実行

上記の手段を用いることにする。

具体的に

必要なツールは以下のものになります。

  • Git
  • Maven

手順

以下の手順を踏みます。

Githubからのダウンロード

gitコマンドでインストールした後に、次のコマンドを使用します。

git clone GithubのURL

Mavenで実行する

作成したプロジェクトをクローンしたら次のコマンドで実行します。

mvn install

これで、必要なライブラリなどをインストールできます。

mvn exec:java

このコマンドで、Javaプログラムを起動できます。