2009年08月04日 04:15

ActionScript3.0 表示リスト メモ

| http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/484

ActionScript 3.0でオブジェクトを表示するための重要な仕組み。

表示リスト

swfで表示されるグラフィックなどは表示リストと呼ばれる ステージを頂点としたツリー構造となっている。

表示リストは表示オブジェクトコンテナと 表示オブジェクトから構成される。

表示オブジェクトコンテナは表示オブジェクトと 表示オブジェクトを持つことができる枝。表示オブジェクトは なにも持つことはできない葉である。

表示オブジェクトと表示オブジェクトコンテナとして 機能するものはすべてDisplayObjectを継承している。

表示オブジェクトコンテナとして機能するものはさらに DisplayObjectContainerを継承している。

コアで定義されている表示オブジェクトコンテナはわずか4つ。

addChild()、removeChild()

表示オブジェクトを実際に表示させるには 表示リストに追加する必要がある。

表示リストに追加するにはaddChild()を利用する。 表示リストから外したい場合はremoveChild()を利用する。

removeChild()はあくまで表示リストから外すだけで 実際のオブジェクトはメモリ上に存在している。 なので2度と使わない場合はきっちり消しておかないと メモリリークを起こしてしまう可能性があるとのこと。

この話は下記の本にかいてありました。

サンプル

ためしにボタンクリックで円をドキュメントクラス(メインのタイムライン)に追加して 追加された円をクリックするとそれが消えるってのを書いた。

イベントオブジェクトからターゲットオブジェクトを 参照するとこでエラーが出た。


package {
    
    import flash.display.Sprite;
    import flash.display.SimpleButton;
    import flash.text.TextField;
    import flash.events.MouseEvent;
    
    public class DisplaySample extends Sprite
    {
        var button:SimpleButton;
        var circle_position:Array;
        
        public function DisplaySample()
        {
            circle_position = new Array(-100, -100);
            button = createButton();
            
            this.x = stage.stageWidth / 2;
            this.y = stage.stageHeight / 2;
            
            this.addChild(button);
        }
        
        private function createButton():SimpleButton
        {
            var button:SimpleButton = new SimpleButton();
            var txt:TextField = new TextField();
            
            txt.text = "Click";
            txt.border = true;
            txt.width = 100;
            txt.height = 30;
            txt.backgroundColor = 0x555555;
            
            button.upState = txt;
            button.overState = txt;
            button.hitTestState = txt;
            
            button.addEventListener(MouseEvent.CLICK, buttonOnClick);
            
            return button;
        }

        private function createCircle():Sprite
        {
            var circle:Sprite = new Sprite();
            
            circle.graphics.lineStyle(2, 0x000000);
            circle.graphics.beginFill(0xC5C5C5);
            circle.graphics.drawCircle(circle_position[0], circle_position[1], 20);
            circle.graphics.endFill();
            
            circle_position[0] += 30;
            circle_position[1] += 10;
            
            return circle;
        }
        
        private function buttonOnClick(evt:MouseEvent):void
        {
            var circle:Sprite = createCircle();
            circle.addEventListener(MouseEvent.CLICK, circleOnClick);
            
            this.addChild(circle);
        }

        private function circleOnClick(evt:MouseEvent):void
        {
            
            /**
             *
             * trace(evt.target);// [object Sprite]
             *
             * 静的型 Objectの値が、関連しない可能性が高い型 flash.display:DisplayObjectに
             * 暗黙で型変換されています。ってコンパイルエラーがでる。
             * removeChild(evt.target);
             */

            removeChild(Sprite(evt.target));
        }
    }   
}

circleOnClick()がエラーの宝庫。 なんでキャストが必要になるのかわからない。 ちゃんとSpriteって認識してるじゃんとか思うんだけどそういうことじゃないのか?

とりあえずこれで表示リストから消せるけどメモリからは消えていないので


private function circleOnClick(evt:MouseEvent):void
{
    removeChild(Sprite(evt.target));
    evt.target = null;
}

とするとevt.targetは読み取り専用ですってなってコンパイルエラー。


private function circleOnClick(evt:MouseEvent):void
{
    removeChild(Sprite(evt.target));
    Sprite(evt.target) = null;
}

とすると「代入のターゲットは参照値でなければなりません。」とのコンパイルエラー。 結局こうなった。


private function circleOnClick(evt:MouseEvent):void
{
    var t:Sprite = Sprite(evt.target);
    removeChild(t);
    t = null;
}

参照のプロパティは一度取り出してから設定する 感じなんだろうか??

ActionScript3.0 表示リスト メモタグ:

トラックバック

  • http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/484
[情報備忘録]2010年02月16日 02:36
ActionScript3.0 コメントとかコーディング規約とか
ActionScript3.0 コメントとかコーディング規約とか
[WEBプログラム覚書]2010年02月16日 03:55
ActionScript3.0 [練習] XMLとナビゲーション
ActionScript3.0を利用してXMLを読み込んでダサいナビゲーションを作ってみる
コメント (0)
コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)





この情報を登録しますか?


先月アクセスが多かったページ