自作ライブラリは型の集まり?

前々から自分用ライブラリを作っているのですが、ライブラリというものをまだよく分かっていません。
しかし色々プログラムとか打ち込んでいるうちに、
ライブラリとはタスクシステムみたいな大き目の集まりでもあれば、
用途に合わせた細かい型の集まりでもあるのでは?と思いました。
(ここで使う「型」とはCでの意味でとってください。)

例えば僕の場合の自作ライブラリにあったら便利そうな型を作ってみます。


僕がゲームを作る上で確実と言っていいほど良く使うのは物体のスピード用変数です。
アクションゲームでは重力についても考えなければならないので、
加速度を表現するためには必須です。
スクリプトは以下のようにすればいいかな?(パッケージの階層などは無視。)

class Speed
{
    private var _xd:Number;  // x方向
    private var _yd:Number;  // y方向

    // コンストラクタ
    public function Speed()
    {
        x = 0;
        y = 0;
    }

    // プロパティの設定や取得用メソッド
    public function set x(sx:Number):Void { _xd = sx; }
    public function set y(sy:Number):Void { _yd = sy; }
    public function get x():Number { return _xd; }
    public function get y():Number { return _yd; }

    // スピードの設定
    public function setSpeed(sx:Number, sy:Number):Void
    {
        _xd = sx;
        _yd = sy;
    }

    // プロパティの加算メソッド
    public function addX(n:Number):Void { _xd += n; }
    public function addY(n:Number):Void { _yd += n; }
}

コレが最適か?と言われたら怪しいですが、とりあえずこんな感じです。


なんやスピードぐらいでめんどくさそうやなぁ
と言われそうですが、どう使えばいいのかは次で書きます。

使い方

sp:Speed = new Speed();

と書きます。
当然パッケージのインポートは忘れずに。


以下はボールを跳ねさせるサンプルです。

import ・・・・

class Ball extends MovieClip
{
    private var _sp:Speed;

    // コンストラクタ
    public function Ball()
    {
        // 初期位置
        _x = 50;
        _y = 50;

        _sp = new Speed();  // スピードオブジェクトを作成
        _sp.setSpeed(5, 0); // 初期スピード

        // ループ定義
        this.onEnterFrame = function()
        {
            // ボールの壁や床の判定
            if (_x < 0)
            {
                _x = 0;
                _sp.x *= -1;
            }
            if (_x > 200)
            {
                _x = 200;
                _sp.x *= -1;
            }
            if (_y > 200)
            {
                _y = 200;
                _sp.y *= -1;
            }

            _sp.addY(0.98);    // 重力加速度

            addPosition(_sp); // スピード加算
        };
    }

    // _x, _yにスピードを加算するメソッド
    public function addPosition(sp:Speed):Void
    {
        _x += sp.x;
        _y += sp.y;
    }
}

ボールMCシンボルを作って、"リンケージプロパティ"の"AS2.0クラス"の欄に"Ball"と記述します。
このMCシンボルをステージに配置してプレビューすると、
ちょっと右に進みながら落ちて行く物体の出来上がり!


結局めんどくさいやんか
と言われそうですが、ちょっと待ってください。

addPosition(_sp);

というのがありますが、
通常この手のメソッドというのはx, yの2つの引数を渡します。
しかしSpeedオブジェクトを1つ渡すだけで動作しています。
つまり、細かい「型」を事前に作っておけば、
値の受け渡しの手間がちょっと楽になります!
大量の引数を必要とするメソッドばっかり作る愚かな僕としては非常にありがたいのです。

あとがき

今回はスピードを扱ったクラスを作りましたが、
簡単な透視変換を備えた三次元の座標を扱うクラスとかの方が具体的に便利さが痛感できたかも...。


今回のライブラリの考え方が
「はい大丈夫ッ!完璧に合ってるぜ!OK!たぶん
かどうか分かりません。まだ試行錯誤状態です。
どうせ自分用ライブラリなので、好きなように納得がいくようにゆっくり作っていこうと思います。




はい、以上。