OpenOfficeのマクロ

ウエブからコピーしてきた問題と解答があり、それをOpenOfficeCalcにペースト。それを整形して自分用の問題集に作り変えるという作業をしていた。その問題と解答はたくさんあるのでその整形をいちいちやるのは時間がかかる。だったら、ということでマクロを書いてみた。ところがうまく動かないことがあった。

プログラムの一部分において・・・・

スプレッドシートのA列に答えとその解説がペーストされている。解答部分には「1〜5」とか「ア〜オ」という番号がふってあり、ひとつのセルに入っている。(例えば、「1.妥当である」とか「イ.誤り」など)その下には解説が書かれたセルがある。そのため、セルの内容を読みこんで先頭の文字が「1〜5」または「ア〜オ」だった時とそうでないときという条件判断をする。しかし・・・・

「i」には行の番号が入っている。はじめはこう書いた。

cell = sheet.getCellByPosition(0, i)
cellvalue = cell.string

' cellvalueがENDなら終了する。
if cellvalue = "END" Then exit do

' セルの内容の1文字目を確認する。
firstString = Left(cellvalue, 1)

if cellvalue <> "" then
' 最初の文字が(1〜5)または(ア〜オ)であるか?
ascii = asc(firststring)
if (ascii > 48 and ascii < 54) or (ascii > 12449 and ascii < 12458) then
.............

しかし、「ascii = asc(firststring)」のところでオーバーフローのエラー。

Screenshot_from_2015-03-16 19:32:47どうも「1〜5」や「ア〜オ」以外のところで止まってしまう模様。asc()に何か条件でもあったのか?それとも文字セットの問題なのか?

たぶん、エラーになるだろうと思いつつも、最後の2行をこう書き換えるとすんなり動く。

if (firststring >= "1" and firststring <= "5") or ( firststring >="ア" and firststring <= "オ") then

う〜ん。BASICってこんな書き方で動いちゃうんだって実感した。javaでもこういう書き方は通ったかしら?

 

jMonkeyEngineちょっとさわってみた。

チュートリアルを少しこなす。なるほど。なるほど。これは簡単だ。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mygame;

/**
 *
 * @author yosimasa4403
 */
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.math.ColorRGBA;

/** Sample 1 - how to get started with the most simple JME 3 application.
 * Display a blue 3D cube and view from all sides by
 * moving the mouse and pressing the WASD keys. */
public class HelloJME3 extends SimpleApplication {

    public static void main(String[] args){
        HelloJME3 app = new HelloJME3();
        app.start(); // start the game
    }

    @Override
    public void simpleInitApp() {
        Box b = new Box(1, 1, 1); // create cube shape
        Geometry geom = new Geometry("Box", b);  // create cube geometry from the shape
        Material mat = new Material(assetManager,
          "Common/MatDefs/Misc/Unshaded.j3md");  // create a simple material
        mat.setColor("Color", ColorRGBA.Blue);   // set color of material to blue
        geom.setMaterial(mat);                   // set the cube's material
        rootNode.attachChild(geom);              // make the cube appear in the scene
    }
}

これは一番最初のチュートリアルのサンプル。いわゆるハローワールド的なもの。SimpleApplicationをエクステンドするとキーボードやマウスの入力のコードを書くことなく青色の立方体が動く。app.start();だけで動く。これはすばらしい。

Screenshot_from_2015-03-12 12:15:01ちょっとこのサンプルコードをいじってみるだけで結構、遊べる。

さらにこの前のシューティングゲームのロケットをjMEのサンプルコードに追加してみた。

Screenshot_from_2015-03-12 15:39:03どういう意味があるのかわからないけどチュートリアルでは壁(テクスチャが貼り付けてある)とティーポットと緑色の忍者。そいつらはそのままにロケットを追加してみた。カオス感溢れてる。

Screenshot_from_2015-03-12 17:18:12さらに・・・自分のサムネイル画像をブロックに貼り付けてみた。なるほど。

ここでSDKからEclipseへ移動した。やっぱ使い慣れた環境のほうがいい。

jME3プロジェクトを作るのはそれほど大変ではなかった。ここから最新の.zipを落としてきてホームに新しいフォルダを作ってその中に展開。エクリプスで新しいプロジェクトを立ち上げてビルドパスにさっき展開したフォルダの中の「lib」フォルダの中身のjarをすべてたせばいい。

さらにもっと遊ぶ。同じくこちらのダウンロードページに街の風景などのサンプルが置いてあった。落としてきてサンプルプログラムに追加してみる。

Screenshot_from_2015-03-12 17:43:06スクショの中央に街の中央広場?のモニュメントらしきものがある。その左にさきほど作ったブロックやモデルが半分地面に埋もれているのが見える。

jMonkey Engine SDKのインストール(linux)

ここしばらくEclipseを使ってlwjglプロジェクトを勉強していた。3Dモデルも使った。サウンド(openAL)も鳴らした。ゲームパッドも使えた。次回、どんなゲームをつくろうかと考えるとアクションゲームかな?と思う。

するとブレンダーで3Dモデルを作ってそれをアニメにしてjava(lwjgl)に取り込むわけだがチュートリアルを見ているととても難しそうに感じられた。(英文のチュートリアルを読むのが疲れるw)

そこでjMonkey Engine(以下、jME) SDKに挑戦してみようと考えた。jMEはlwjglを使ったゲームエンジンでありライブラリだそうだ。以下、lwjglのWikiより。

jME (jMonkey Engine) is a high performance scene graph based graphics API. jMonkeyEngine 3 was rebuilt from the ground up to be a modern 3D game engine, compatible with OpenGL 2.0 and above. Its architecture is shader-based, making it fully capable of current and next generation graphics standards.

jMEはグラフィックAPIを使用した高いパフォーマンスのシーンを描くシステムです。jME3は基本的なところからモダンな3Dゲームエンジンに生まれ変わりました。OpenGL2.0以上にコンパチブルです。そのアーキテクチャはシェーダーベース(モダンな3D描画ってかんじかしら?)であり次世代のグラフィック基準と傾向を受け入れることができます。(訳:俺。へたくそw)

基本、lwjglなのなら取っ付き易いだろうしチュートリアルも充実しているようだし(チュートリアルの英文が読みやすかったw)ちょっとさわりだけでもやってみようかという気分になった。

そこでインストールしてみた。今回はその手順を記す。

ホームページよりダウンロードする。わたしゃの環境はLinuxMint17。64bit。なのでそれをダウンロード。SDK(自身の開発ツール)とエクリプスなどの統合開発環境で使うためのjarがあるようだが今回はSDKをインストール。

ダウンロードしたファイルは「.sh」なのでターミナルを開いて「sh jmonkeyplatform-linux-x64.sh」とタイプするとインストールが始まる。

Screenshot_from_2015-03-12 10:16:29結構起動には時間がかかる。エクリプスとどっこいどっこいかしら?

Screenshot_from_2015-03-12 10:17:04起動後のメイン画面。すぐに自動的にアップデートがチェックされて一つあったようなのでそれがダウンロードされてアプリの再起動が促された。

再び起動した後画面中央をみるとチュートリアルに進む案内が表示されている。なんて親切。これからいじってみます。それでは。

jarファイルにするにあたってソースを改変する部分

エクリプスで実行している場合とjarファイルにして実行する場合ではいくらかソースを変更する必要があった。ここではそれをまとめます。ほとんど(すべて)リソースの読み込みの部分。

変更にあたっての注意点は以下の通り。

  • リソースを読み込むのにgetClassLoader()やgetResourceAsStream()を使うこと。
  • jarファイルの中ではファイルセパレータは全部「/」を使うこと。
  • エクリプスとjarファイル、双方の実行環境でも動くように例外処理をしておくこと。

今回のプロジェクトではリソースは

  • 3Dモデルオブジェクト(テキストファイル)
  • サウンド(.wavファイル)
  • 3Dモデルに使うテクスチャやタイトル画面に使う画像(.pngファイル)

以上3種類。

桃缶たべたいさんのブログから3Dモデルオブジェクトを読み込んだりディスプレイに描画したりするクラスをいただいてきた。サウンドを鳴らすクラスはlwjglのwikiのチュートリアルにあったスペースインベーダーから頂いた。

まずは単純な画像ファイルの読み込み。ももかんさんのプロジェクトの「TextureLoader」クラスを使って読み込んでいる。クラスローダーを使うメソッドを追加させていただいた。以下改変させていただいた「TextureLoader」クラスのソースの一部。

package shooting.TextureLoader;
/**
*  指定されたパスの画像ファイルをテクスチャーに変換して返す
*/
public Texture loadTexture(String imagePath) throws IOException {
return loadTexture(ImageIO.read(new FileInputStream(imagePath)));
}
/**
*  指定されたパスの画像ファイルを、指定された ClassLoader で探して、テクスチャーに変換して返す
*/
public Texture loadTexture(String imagePath, ClassLoader classLoader) throws IOException {
return loadTexture(ImageIO.read(classLoader.getResourceAsStream(imagePath)));
}

上半分はもともとあったメソッド。下半分が追加したメソッド。

「FileInputStream(imagePath)」を「classLoader.getResourceAsStream(imagePath)」に変更してある。これらのメソッドはBufferedImageを読み込む本体のメソッドを呼び出している。本体は変更していない。

そしてメインクラスでタイトル画像「SpaceVacterian.png」とゲームオーバー画像「gameover.png」をこのクラスを使って読み込んでいる。以下メインクラスのソースより。

package shooting.Main;
//エクリプスで起動するときはgetClassLoaderは使えない。jarファイルの時はgetClassLoaderを使う。
//なのでnullだった時にgetClassLoaderで再度読み込むようにした。
try{
titleTexture = textureLoader.loadTexture("images/" + "SpaceVacterian.png");
gameOver = textureLoader.loadTexture("images/" + "gameover.png");
}
catch(FileNotFoundException e){
System.out.println("loading by getClassLoader....");
titleTexture = textureLoader.loadTexture("images/" + "SpaceVacterian.png", Main.class.getClassLoader());
gameOver = textureLoader.loadTexture("images/" + "gameover.png", Main.class.getClassLoader());
}

try文の中ではエクリプスで読み込む場合を想定している。jarファイルで実行するとこのままでは「ファイルがみつからねえ云々」というエラーがでるのでそれをcatch文の中で受け止めている。getClassLoader()を追加している。逆にエクリプスではgetClassLoader()だとエラーを吐き出す。なので例外処理で双方の環境に対応できるようにした。

3Dモデルオブジェクトを作るModelクラスでも同じような改変をしている。以下、モデルのテクスチャーを読み込む部分の改変後。

package shooting.Main;
String  texturePath;
//WindowsでもLinuxでもjarファイルの中でのディレクトリのセパレータは「/」でよい。
texturePath = imagesDir + "/" + material.textureName;
//エクリプスで起動するときはgetClassLoaderは使えない。jarファイルの時はgetClassLoaderを使う。
//なのでnullだった時にgetClassLoaderで再度読み込むようにした。
try{
material.texture = textureLoader.loadTexture(texturePath);
}
catch(FileNotFoundException e){
System.out.println("loading by getClassLoader....");
material.texture = textureLoader.loadTexture(texturePath, Model.class.getClassLoader());
}

Windowsではファイルセパレータは”\(¥)”だが、jarファイルの中では”/”で良いことに注意。jarファイルができた後、Windows側でエラーがでてしまい、ここでも結構悩んだ。


次に3Dモデルを読み込む「ObjectLoader」クラスの改変。ブレンダーで作成した3Dモデルは「.obj」ファイルでエクスポートしている。これの実際の中身はテキスト。オブジェクトを読み込むメソッドの先頭部分より。まずは元のソースより。

package shooting.ObjectLoader;

/**
*  渡されたファイルパスの OBJ ファイルを読み込み、Model インスタンスとして返す
*/
public static Model load(String filePath) throws IOException {
Model           model = new Model(filePath, DEFAULT_IMAGES_DIR);
DisplayList     displayList = null;
File            file = new File(filePath);
BufferedReader  br = null;
String          line;

//  テキストファイルなので 1 行ずつ読み込んでパースしていく
try {
br = new BufferedReader(new FileReader(file));

・・・・・・・・

次に改変したもの。

package shooting.ObjectLoader;

/**
*  渡されたファイルパスの OBJ ファイルを読み込み、Model インスタンスとして返す
*/
public static Model load(String filePath) throws IOException {
filePath = "models/" + filePath;
Model           model = new Model(DEFAULT_IMAGES_DIR);
DisplayList     displayList = null;
File            file = new File(filePath);
BufferedReader  br = null;
String          line;

//  テキストファイルなので 1 行ずつ読み込んでパースしていく
try {
br = new BufferedReader(new InputStreamReader (ObjectLoader.class.getResourceAsStream(filePath),"UTF-8"));

・・・・・・・・・・・・・・・・・

一番最後のBufferdReader()に与える引数として、

  • 改変前ではFileReader(File arg0)を使っているのに対して
  • 改変後ではInputStreamReader(InputStream arg0, String arg1) を使っている。

さらにFileReaderとInputStreamReaderでは与える引数が違ってくる。前者に与える引数はFileなのでFileオブジェクトを作って与えるが後者ではInputStreamなので後者ではStringであるfilePathとなる。後者でもFileオブジェクトを作っているが、後で読み込みメソッド本体で使用されているのでここはそのまま。

また、このプログラムはLinux環境で作られているのでテキストはUTF-8形式になるのでInputStreamReader()には”UTF-8″も引数として与えている。これはWindows環境での実行の際に必要になる。

オブジェクト本体の他に「.mtl」ファイル(マテリアルを設定するファイル)も読み込むので同じように改変した。

メインクラスは以下の通りでパスに指定されたファイルを読み込める。自機のファイルを読み込む部分。

package shooting.Main;

public Model myRocket;
・・・・・・・・・・・・・・・・

textureLoader = new TextureLoader();
・・・・・・・・・・・・・・・・

//  ファイルのパス指定で画像を読み込む
myRocket = ObjectLoader.load("MyRocket3.obj");
myRocket.compile(textureLoader);

 

さて、次はサウンドの読み込み。改変後のソース、SoundManager2クラスより、addSoundメソッド。つまりリソースを読み込む部分。

package shooting.SoundManager2;

public int addSound(String path) throws Exception {
// Generate 1 buffer entry
scratchBuffer.rewind().position(0).limit(1);
AL10.alGenBuffers(scratchBuffer);
buffers[bufferIndex] = scratchBuffer.get(0);

// load wave data from buffer
//WaveData wavefile = WaveData.create(path);元々のコードはこうだった。この一行を下のように変更すると動いた。
//どうもコードが古かったようだ。
//WaveData wavefile = WaveData.create(new BufferedInputStream(new FileInputStream(path)));
//さらに上記のコードからjarにした時を考慮してgetResourceAsStream()を使用するコードに変更した。
InputStream is = SoundManager2.class.getResourceAsStream(path);
WaveData wavefile = WaveData.create(new BufferedInputStream(is));
// copy to buffers
AL10.alBufferData(buffers[bufferIndex], wavefile.format, wavefile.data, wavefile.samplerate);
//generate data from the file (binary data?)

// unload file again
wavefile.dispose();

// return index for this sound
return bufferIndex++;
}

WaveData wavefile = WaveData.create(path);

元々のチュートリアルではこうなっていた部分だが、エクリプスにコピペしたところエラーがでた。なので以下のように変更した。BufferedInputStream()を使うように変更。(そりゃそうだよな・・・・大きめのファイルだもんな・・・)このスペースインベーダーが動かなくて困っている人がいればここがポイントです。

WaveData wavefile = WaveData.create(new BufferedInputStream(new FileInputStream(path)));

さらに変更。2行に分ける(わざわざInputStreamオブジェクトを作る)必要はなかったかもしれないけど。

InputStream is = SoundManager2.class.getResourceAsStream(path);
WaveData wavefile = WaveData.create(new BufferedInputStream(is));

・・・ほぼソースに書いてあるままです。

Screenshot_from_2015-03-09 14:56:53今回のプロジェクトではリソースはこういうふうに配置してある。srcフォルダに全部いれるかそれともプロジェクトのフォルダにいれとくのかどっちかにすれば良さそうな感じだがうまくいかなかった(かなり苦労した)ww

エクリプスのプロジェクトからJARファイルを作る。

覚書。

自分で作ったプログラムを自分一人で遊んでいる分にはエクリプス上でインタープリタ感覚で実行できるんだが、これをインターネットに公開したいとなると、ダブルクリックで起動できる(簡単に起動できる)形式にしなきゃならんでしょう。

わたしゃJAVAでプログラムを書いているのでそれを実現するにはJARファイルをつくればいい、ということ。手順は複雑なのでしばらくすると絶対に忘れるだろうから覚書として書いておきます。

Screenshot_from_2015-03-09 09:06:22まず、jarにしたいプロジェクトを選択して右クリック(またはファイルメニュー)から「エクスポート…」を選択。javaメニューには三通りの選択肢があるが、「JARファイル」を選択。そして「次へ」ボタン。

Screenshot_from_2015-03-09 09:08:49エクスポートするのはソースフォルダ(src)のみ。ちなみに事情により?リソースの一部、3Dモデルのオブジェクトファイルやサウンドファイルはsrcフォルダに入っている。3Dモデルなどに使用する「images」フォルダだけ外にあるのだがこれはここではエクスポートしない。後で別のjarファイルにして追加する。

ちょっと話がずれるが、後述するつもりだが、jarファイルが実行された時にリソースを読み込もうとするときにエクリプス上のプロジェクトではうまく行ってたパスの指定がエラーになる。getClassLoaderを使うんだけど試行錯誤の結果、このような形でできたのでこういう手順をとっている。もっとスマートで正しいやり方もあるはずなんだけどその勉強はまた後日。

エクスポートする先を指定してファイル名もここで指定する。

「次へ」ボタン。

Screenshot_from_2015-03-09 09:09:10マニフェストの生成は必要(だったと思う)。種々オプションは触らないw

メインクラスを指定する。ここでは「shooting」パッケージの「Main」クラスを指定している。

Screenshot_from_2015-03-09 09:17:32次に「JarSplice」を使う。

起動したての画面には簡単な説明が書かれている。

Screenshot_from_2015-03-09 09:19:231)ADD JARS

必要なjarを足していく。

  • 先ほどエクリプスで作ったソース本体のjar。
  • 画像リソースが入った「images.jar」これはそのフォルダを右クリックして圧縮することで作れる。拡張子には「.jar」を選ぶ。
  • 日本語フォントをlwjglで使うためのlwjgFontのjar。クラス本体とフォントの、2つのjarが必要。
  • さらにこれは「lwjgl」を使ったプログラムなのでlwjglのjarも追加。何故か最新のものではエラーを吐き出すので「lwjgl2.8.2」を使う。他には「jinput.jar」と「lwjgl_util.jar」が必要。他にもダウンロードしたlwjglには色々なjarが含まれているがどうやらこの3つで動くようだ。

(今回は)合計7つ。

Screenshot_from_2015-03-09 09:21:082)ADD NATIVES

MacOSXで動かすことは考えていないので(テストできないので)ネイティブライブラリーは「.dll」(Windows用)と「.so」(Linux用)を追加すればよい。ファイル名には「64」がついたものとそうではないものがあるが両方入れておくと32bitでも64bitでも動くようにできるようだ。

Screenshot_from_2015-03-09 09:21:423)MAIN CLASS

さきほどエクリプスでも指定したようにここでもメインクラスを指定する。「shooting」パッケージの「Main」クラスって指定だな。

Screenshot_from_2015-03-09 09:22:374)CREATE FAT JAR

ここでは「Create Fat Jar」ボタンを押すとダイアログが出てくる。

うまく行けば・・・・・成功する。何か手順がおかしかったりするとエラーになることもある。

linuxで生成されたjarファイルを実行するときはファイルを右クリックしてプロパティの「実行可能なプログラム・・・」云々にチェックを入れて置かなければならない。

できたファイルをダブルクリックすれば・・・・・・・・

Screenshot_from_2015-03-09 10:11:38見事!起動しました。ああ、よかった。長かった。

バージョンアップしました。

https://sourceforge.jp/users/yosimasa4403/pf/yosimasa4403_java_room/wiki/FrontPage

バージョン1.1を追加しました。

上のリンクから 「yosimasa_shooting_1.jar」 をダウンロードしてください。

変更点

  • 隊列を組んで現れる敵を最初に出てきた時に全滅させた時にボーナス50点がもらえるようになりました。
  • fishタイプの敵を追加。円運動しながら少しずつ降りてきます。
  • ゲームパッドに対応。(以前もしていたが)ゲームタイトル画面で選択できるようなりました。

とりあえず、アップまで。

ボーナス制度追加

昨夜、遅くまで起きててボーナス制度を追加した。隊列を組んだ敵を最初に現れた時に全滅させると50点。

結構、この判定が難しかった。色々試した挙句落ち着いた。(つまりはちゃんと論理があるわけではなく何と無く適当に判定しててうまくいってるからオッケーってなノリ)

今朝はそれに音を追加した。

改造。しかし見た目は変わらない。

今日は休みだったのでシューティングゲームを改造。敵グループのクラスと敵のクラスを改造した。実行しても何が変わったのかはわからないw

敵を発生させるためだけにグループのクラスを利用していた。例えば隊列を組んで出現するときは一定の出現場所やベクトルが必要だった。ところがそのままだと隊列が一旦、画面の下に消えて再び上部から出現するときに同じx座標から出現する。テストプレイしててゲームとしてつまならい。なので出現ポイントを変えていく必要があった。

なので敵グループの情報を利用し続ける必要ができてしまった。今後、もっと多くの敵のタイプを考案するときにもグループのクラスは利用することができそうだ。

メインクラスからグループのクラスを操作して、そのグループに所属する敵を操作するという方法に変えた。そして隊列が上から再出現するときの座標を変えることができるようになった。

言葉で記述するのはむずかしいw

今日は更に彗星型の敵がこちらに向かってくるパターンを追加した。得点が高くなるとよりそのパターンが多く出現するようにした。より難易度が上がったと思う。

 

シューティングゲーム詳細

Screenshot_from_2015-02-23 08:58:57Screenshot_from_2015-02-23 08:58:26

 

「動作確認環境」

  • Windows7 64bit
  • LinuxMint 64bit
  • いずれもJRE(JAVA実行環境)が必要です。
  • MacOSXや他のWindows、Linux、32bit、それぞれテストはしてないんですが多分動きますww(一応、ネイティブライブラリーは追加してある)

「ダウンロードと起動とアンインストール」

  • こちらから”yosimasa_shooting.jar”をダウンロードしてください。
  • ダウンロードしたファイルをダブルクリックすれば起動します。
  • Linuxで実行しようとするときは「プロパティ」の「パーミッション」タブの「プログラムとして実行可能」にチェックを入れてください。
  • アンインストールするときはファイルを削除するだけです。

「遊び方」

  • ゲームスタートは「F2」
  • カーソルキーで上下左右に移動できます。
  • 「z」キーでショットが撃てます。
  • 左右移動の時、一度押して離してすぐ押し直すと「エルロンロール」しながらすばやく左右に移動します。エルロンロール中は敵には当たりません。しかしこちらもショットを撃つことはできません。
  • 敵は今のところ3種類。それぞれ違う動きをします。
  • 1000点ごとに少しずつ敵の出現数が増え、スピードが上がっていきます。
  • 自機が3機やられるとゲームオーバーです。
  • 「F5」キーでゲームタイトルに戻ります。
  • ゲーム中は「F1」キーでポーズできます。もう一度「F1」キーでポーズ解除します。
  • ゲームパッドにも対応しているはず・・・・(持ってないのでテスト出来てませんw)

「考えていたこと」

  • JAVAの勉強のために作ってみようと思いました。
  • 自機のパワーアップ、敵が弾を撃つというシステムは(敢えて)取り入れませんでした。
  • 動く敵を狙って当てることを楽しみたいと考えました。

「今後の予定」

  • 集団で出現する敵を一度に全滅させた時にボーナス。
  • 敵の種類と移動パターンを増やす。
  • (内部プログラムの問題だが)敵グループクラスを改良。
  • 敵グループクラスによってもっと敵を管理できるようにする。出現パターンや画面下に消えた敵が画面上部より再び出現するときなどでもグループクラスを利用するなど。(現時点では敵はグループクラスを利用して出現するが出現した後は勝手に動いている)
  • タイトル画面やゲームオーバー画面をもうちょっと豪華にする。
  • タイトル画面で(昔ながらのアーケードゲームのように)操作説明や敵の紹介やハイスコアなどを順番に表示する。
  • BGMを追加。

「制作に使用、利用したもの」

  • Eclipse(JAVAを書くために)
  • Blender(各キャラクターの3Dモデルを書くために)
  • GIMP(各キャラクターのテクスチャー(モデル表面)を書くため)
  • sfxr(効果音を作成するため)
  • GarageBand(iPhone版。BGMを作成するため。iPhoneで作ってSoundCloudにあげてPCに落としてきて.wavに変換するという方法をとった。簡単に曲を作るにはガレバンは最適。)
  • lwjgl(ライブラリとして。JAVAでOpenGL、OpenALなどを利用するときは必要。)
  • lwjgFont(ライブラリとして。lwjglでディスプレイに日本語を表示するために。便利でした。)

「スクリーンショット」

Screenshot_from_2015-02-23 08:56:11

ぜひお試し頂いて動かなかった、楽しかった、つまらない、などなどご感想をいただけると嬉しいです。

 

javaを実行中にどこから起動してるのかを知る

表題のように、例えばeclipseから実行している場合、完成してjarファイルをダブルクリックして実行されている場合…などなどそのプログラムの中で知ることはできるんだろうか?

eclipse環境下の時とjarファイルの時とではリソース読み込む時のエラーの出方が違うんだよな。

例外処理で良さそうなんだけどもっとスマートなやり方はないもんか。

System.getProperty()でなんか調べれば自分自身の環境下では区別できるけどどんな環境下でもって訳にもいかんし。