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つだったから、大分容量が減るのではないだろうか。
まあ、実際はかなりめんどいことになりそうだけど、今の段階では予想が付かない。


てか、今現実逃避中です(;つД`)
これを作るのはいつになるやら……(;´Д`)