ホーム >> 左脳Script >> Adobe Flash >> Action Script >> MovieClip 継承クラスのコーディング @ActionScript 2.0

MovieClip 継承クラスのコーディング @ActionScript 2.0


Action Script 2.0 で、MovieClip を拡張しようとして難儀。

Action Script 3 では、DisplayObject を new で作り、そのインスタンスをステージやらの親に addChild で追加する事で表示が出来る。しかし、Action Script 2.0 では、インスタンスを作れても、インスタンスを直接ステージに登録&関連付ける方法がない。

回避方法 その1

極々簡単に、真っ当な回避方法。


class hogege
{
    var mIns:MovieClip; //  クラスで管理するMovieClipインスタンス
    public function hogege(base:MovieClip)
    {
        mIns = base.createEmptyMovieClip("hugege",0);
        ~~~~~~
    }
}
クラス内のメンバーとして MovieClip を管理。全く持って継承でもなんでもない。

簡単で非常に判りやすいのだが、ひとたび MovieClip のイベントをコーディングしようとすると、 this の扱いから難儀するようになる。

class hogege
{
    var mIns:MovieClip; //  クラスで管理するMovieClipインスタンス
    //  コンストラクタ
    public function hogege(base:MovieClip)
    {
        mIns = base.createEmptyMovieClip("hugege",0);
        ~~~~~~
        mIns.onPress = function():Void
        {
            trace(this);
        };
    }
    //  イベント
    private function eve():Void
    {
        ~~~~
    }
}
onPress に関数を登録し「マウスクリック時のイベントを扱いたい」のはコードから明らかだが、 この trace が吐き出す this が実は、hogege のインスタンスではないのだ。

on****系のイベント関数全てに言えるのだが、この場合の this はイベントを受け取った MovieClip になるようだ。当然、イベント関数内部から、hogege の関数 eve を呼び出せるはずも無く、エラーも出ないものだから、しばらくは「嵌って唸ってドロどろりん!」な状態であった。


コレについて調べた所「Delegateを使え」というのが王道らしい。
が、FlashDevelop + Flex SDK の無料環境で、 mx.utils.Delegate が見当たらない。そもそもコードで書かれたライブラリで解決できる問題なら使わずともなんとかなるハズだと開き直り・・・

Java Script のクロージャでよく使う?「this をメンバ変数に保存する」事で何とかクラスのインスタンスにアクセス出来る様になった。イベントを受ける MovieClip にクラスのインスタンス(this)を保存しておき、イベントルーチン内でこの参照からクラスにアクセスする方法取った。

class hogege
{
    var mIns:MovieClip; //  クラスで管理するMovieClipインスタンス
    //  コンストラクタ
    public function hogege(base:MovieClip)
    {
        mIns = base.createEmptyMovieClip("hugege",0);
        ~~~~~~
        mIns._s_ = this;    //  このインスタンスへの参照
        mIns.onPress = function():Void
        {
        //  trace(this);
            this._s_.eve();
        };
    }
    //  イベント
    private function eve():Void
    {
        trace(this);
        ~~~~
    }
}



本気で継承させる

なにやらサブクラスに細工をすると、コーディングオンリーで出来るようだ。


class サブクラス名 extends MovieClip
{
    // AttachMovieで追加するのに必要
    static var SymbolName = "__Packages.サブクラス名";
    static var SymbolOwner = サブクラス名;
    static var SymbolLinked = Object.registerClass(SymbolName, SymbolOwner);
・
・
上記のルールで static メンバを追加。すると、サブクラス名.SymbolName で attachMovie が出来るようになるそうだ。静的記述なら特に重くもならないだろうし、イベント毎の小細工に比べれば、容量もたかがしれている?!


もうちょっと判りやすく書くと、以下のようになる。

class hogege extends MovieClip
{
    // AttachMovieで追加するのに必要
    static var SymbolName = "__Packages.hogege";
    static var SymbolOwner = hogege;
    static var SymbolLinked = Object.registerClass(SymbolName, SymbolOwner);
    //  コンストラクタ
    public function hogege()
    {
        ~~~~~~
    }
    //  イベント関数を直接書ける
    private function onPress():Void
    {
        ~~~~
    }
}

このクラスでの表示は、

    _root.attachMovie(hogege.SymbolName, "~名前~" , ~深度~);
このような形で書ける。

サブクラスから別のクラスへの呼び出しが必要な場合は、結局参照を保存して呼び出さなければいけなかったりもする。


雑感

registerClass を使う方法は、サブクラスのコードがスッキリするので非常に有用。と考えたのだが、正直、使える事が判っただけで registerClass に関しては大して調査していない。折を見てリファレンスを読むベキであろう。

また、今回の継承の件はあまり一般的でないのか、検索時には相当?絞り込まないと同様の情報にヒットしない。
そもそも Action Script 2.0 の情報は 3.0 と比べれば相当少ないように感じる。何故だらう?



新たなる疑問:createEmptyMovieClip と attachMovie のどちらが重いか?!




トラックバック(0)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/222

コメントする

ホーム >> 左脳Script >> Adobe Flash >> Action Script >> MovieClip 継承クラスのコーディング @ActionScript 2.0

アーカイブ

このブログ記事について

このページは、n-yagiが2009年9月 4日 22:14に書いたブログ記事です。

ひとつ前のブログ記事は「Amazon API 認証について」です。

次のブログ記事は「WindowsからWebスクリプトの実験や作成をするのに便利な環境」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。