[AS3]swcを使って入れ子書き出しにしたMCの挙動をひもづけ

2010/06/3

>> (追記)今回の件もうちっと考えてみました。

———

こんにちは。きんくまです。

タイトルよくわかんないと思うんですが、今回はswcを使って、FlashIDEからのパブリッシュではなく、FlashDevelopやFlashBuilderを使ってのパブリッシュについての話題です。

先日F-siteのセミナーに行きまして、そこで@matsumosさんに教えてもらいました。
「FlashからSWCにしたあと、FDやFB使ってコンパイルするとすごく速い」そうです。

最近クラスの数が結構多くなってくると書き出しがすんごく遅くなって困ってたところだったので、これは有益な情報!
ということで試してみました。

あとどうでもいいんですが、ひそかに私F-siteスタッフになってたので、今度F-siteに私の@clockmakerさんの講義のレポートが載ると思います。

話もどしまして、ちなみに参考ソースはこちらです。
>> SWC書き出しを有効に使って作業効率アップ(kayac)
>> SWC内のクラスに配置されたインスタンスが正しいクラスで初期化されない問題(pekolog)

なんか調べてみたら自分も2年前にswc書き出しでコードヒントが出るところまではつかんでたみたいなんですが、なんでやめちゃったんだろう??
当時はあんまりクラス数が多くなかったからかな??
>> swcをflexにとりこみ

今回作ったやつ

Flash側の書き出し設定

swc_test_fig1

そんでやりたかったことは、

・Flash側では空のクラスとしてリンケージ書き出したものを、実際の挙動クラスにひもづけしたい
・MCの挙動は親が指定するのでなく、別クラスとしてまとめたい

です。swc書き出ししたものはそのままだと、動的にひもづいているクラスを変更することができなかったので、挙動を書いたクラスをひとつつくって、そいつに投げるようにしてみました。

■メイン FD上で作ったもの

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package
{
    import flash.display.Sprite;
    import flash.events.Event;
     
    /**
     * ...
     * @author KinkumaDesign
     */
    [SWF(width="400",height="300",frameRate="30",backgroundColor="0xffffff")]
    public class Main extends Sprite
    {
        public var container:ExContainer;
         
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
         
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
             
            container = new ExContainer();
            addChild(container);
        }
         
    }
     
}

■ExContainer
Flashから書き出したContainerを継承して挙動を制御

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package 
{
    import flash.events.MouseEvent;
    /**
     * ...
     * @author KinkumaDesign
     */
    public class ExContainer extends Container
    {
        public var mybtnBehavior:MyButtonBehavior;
         
        public function ExContainer()
        {
            mybtnBehavior = new MyButtonBehavior(mybtn);
            mybtn.addEventListener(MouseEvent.CLICK, clickHD);
        }
         
        private function clickHD(e:MouseEvent):void
        {
            trace("clicked!");
        }
         
    }
 
}

■MyButtonBehavior
MyButtonがおかれている親のDisplayObject(この場合はExContainer)から
参照をわたしてもらって、挙動を制御

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package 
{
    import flash.events.MouseEvent;
    /**
     * ...
     * @author KinkumaDesign
     */
    public class MyButtonBehavior
    {
        public var mybtn:MyButton;
         
        public function MyButtonBehavior(mybtn:MyButton)
        {
            this.mybtn = mybtn;
            init();
        }
         
        private function init():void
        {
            mybtn.buttonMode = true;
            mybtn.addEventListener(MouseEvent.ROLL_OVER, overHD);
            mybtn.addEventListener(MouseEvent.ROLL_OUT, outHD);
        }
         
        private function outHD(e:MouseEvent):void
        {
            mybtn.alpha = 1;
        }
         
        private function overHD(e:MouseEvent):void
        {
            mybtn.alpha = 0.5;
        }
         
    }
 
}

MyButtonBehaviorとかやってあげることで、こいつ自身のロールオーバーの設定はこいつ自身のみの情報がかかれたクラスにとじこめられたので、いいのじゃないかと。
なので、
・もとのクラスを継承
・参照わたしてもらってそこに挙動を書く
の2択かなーと思いました。

ただ、FlashIDEだと通常の書き出しの際にクラスとひもづけされてコンパイルされるので、
こんな感じにひと手間かけなくてもすむのも魅力。
だけど、クラスが多くなってくると遅いんだよなー。

それで、今回のソース一式です。
>>swctest100603

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

LINEスタンプ作りました!
毎日使える。とぼけたウサギ。LINEスタンプ販売中! 毎日使える。とぼけたウサギ

ページトップへ戻る