The next JAVA library
今自分が使っているJAVAのライブラリは、自分で作ったライブラリなのだけれど、結構悪いところが多くなってきたので、そろそろ新しいライブラリを作ろうと思う。
どの辺が悪いかというと、このライブラリは、ライブラリのインスタンスを、メインのクラスに作って、そこから呼び出すようになっていたのだけれども、いろんなパラメータを渡してやらなければならないことを、ライブラリ側から保証できなかったり、わざわざ命令を呼び出すために、インスタンスの名前を書かないといけなかったり、あまりスマートではない。
他にも、サウンドを扱うためのクラスがあるのだけれども、サウンドプレイヤー、サウンドデータ、サウンドリスナの3つのクラスを作っているので、容量が大きくなって仕方がない。
新しいライブラリは、その欠点を補って作成できるようにしよう。
まず、新しいライブラリの使われ方は、今までとは違い、継承で使用する。
class CMain extends NewLibrary implements ...{ }
ということは、このNewLibraryが、Canvasを継承することになる。
class NewLibrary extends Canvas implements Runnable, ...{ }
こういう作り方をする。というか、これがライブラリの基本だな(;´Д`)
で、NewLibraryには、多くのインターフェースを含ませる。
と言っても、Interfaceクラスを作るのは、容量的にきついので、空のメソッドにしておく。
void _init(Integer width, Integer height, Integer wait){} void _move(){} void _draw(){} void _loop(){}
_initメソッドで、ダブルバッファ用のイメージの大きさと、ゲームの速度を決定する。
フレームスキップを実装するかどうかについては未だ考え中。
で、ライブラリ側は、この_initを呼び出す前に、Integerに初期値を入れておいて、新しいライブラリの、何もしない_initを呼び出すのだが、必要に応じて、メイン側で_initメソッドをオーバーライドして、そちらの_initが呼び出されるようにして、引数の値を書き換える。
protected int _width; protected int _height; protected int _wait; //コンストラクタ NewLibrary(){ Integer width = new Integer(240); Integer height = new Integer(240); Integer wait = new Integer(50); _init(width, height, wait); _width = width.intValue(); _height = height.intValue(); _wait = wait.intValue(); }
//メイン側 void _init(Integer width, Integer height, Integer wait){ wait = new Integer(40); }
で、設定したゲーム速度に応じて、_moveと_drawと_loopが呼び出される。
_loopは何かというと、1フレーム呼び出すごとに何かしたい、と言う要求に応えるためのメソッド。_drawが呼び出された後に呼び出される。
//ライブラリのRunnableのメソッド public void run(){ while(_isValid()){ _timeWait(); _move(); _draw(); _loop(); } }
ちなみに、どうでもいいことなのだけれど、ライブラリのメンバ変数やメソッドは、名前が重複すると嫌なので、全て先頭にアンダーバーを付けることにする。
あとは基本的に、今までのライブラリをコピペすれば良いだろう。アンダーバーを付けるのがめんどいってことぐらいか。
で、次はサウンド。これも基本的には、自分のライブラリのメソッドとして使用する形にする。
しかし、サウンドデータの中には、playを命令してから、実際に鳴るまでに時間がかかって、一瞬だけゲームが止まってしまうようなデータがあるので、サウンドを鳴らす際には、別のスレッドで実行させる。
class NewSoundData implements Runnable{ private Thread th; NewSoundData(){ th = new Thread(this); } void play(){ th.start(); } void run(){ //ここで再生する } }
こんな感じ。
リスナについては、NewLibraryに実装する。
こうすれば、ライブラリは、NewLibraryと、NewSoundDataの2つのクラスだけで作れそうだ。
あとは、MIDletもしくはIApplicationクラスを継承したクラスと、NewLibraryを継承したクラスの2つが必要なので、全部で4つになる。前回が6つだったから、大分容量が減るのではないだろうか。
まあ、実際はかなりめんどいことになりそうだけど、今の段階では予想が付かない。
てか、今現実逃避中です(;つД`)
これを作るのはいつになるやら……(;´Д`)