HOME>WEBプログラム覚書>ActionScript3.0 表示リスト メモ

ActionScript3.0 表示リスト メモ

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

表示リスト

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

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

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

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

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

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

addChild()、removeChild()

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

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

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

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

サンプル

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

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

ActionScript3.0

  1. package {
  2.  
  3.     import flash.display.Sprite;
  4.     import flash.display.SimpleButton;
  5.     import flash.text.TextField;
  6.     import flash.events.MouseEvent;
  7.  
  8.     public class DisplaySample extends Sprite
  9.     {
  10.         var button:SimpleButton;
  11.         var circle_position:Array;
  12.  
  13.         public function DisplaySample()
  14.         {
  15.             circle_position = new Array(-100, -100);
  16.             button = createButton();
  17.  
  18.             this.x = stage.stageWidth / 2;
  19.             this.y = stage.stageHeight / 2;
  20.  
  21.             this.addChild(button);
  22.         }
  23.  
  24.         private function createButton():SimpleButton
  25.         {
  26.             var button:SimpleButton = new SimpleButton();
  27.             var txt:TextField = new TextField();
  28.  
  29.             txt.text = "Click";
  30.             txt.border = true;
  31.             txt.width = 100;
  32.             txt.height = 30;
  33.             txt.backgroundColor = 0x555555;
  34.  
  35.             button.upState = txt;
  36.             button.overState = txt;
  37.             button.hitTestState = txt;
  38.  
  39.             button.addEventListener(MouseEvent.CLICK, buttonOnClick);
  40.  
  41.             return button;
  42.         }
  43.  
  44.         private function createCircle():Sprite
  45.         {
  46.             var circle:Sprite = new Sprite();
  47.  
  48.             circle.graphics.lineStyle(2, 0x000000);
  49.             circle.graphics.beginFill(0xC5C5C5);
  50.             circle.graphics.drawCircle(circle_position[0], circle_position[1], 20);
  51.             circle.graphics.endFill();
  52.  
  53.             circle_position[0] += 30;
  54.             circle_position[1] += 10;
  55.  
  56.             return circle;
  57.         }
  58.  
  59.         private function buttonOnClick(evt:MouseEvent):void
  60.         {
  61.             var circle:Sprite = createCircle();
  62.             circle.addEventListener(MouseEvent.CLICK, circleOnClick);
  63.  
  64.             this.addChild(circle);
  65.         }
  66.  
  67.         private function circleOnClick(evt:MouseEvent):void
  68.         {
  69.  
  70.             /**
  71.              *
  72.              * trace(evt.target);// [object Sprite]
  73.              *
  74.              * 静的型 Objectの値が、関連しない可能性が高い型 flash.display:DisplayObjectに
  75.              * 暗黙で型変換されています。ってコンパイルエラーがでる。
  76.              * removeChild(evt.target);
  77.              */
  78.  
  79.             removeChild(Sprite(evt.target));
  80.         }
  81.     }
  82. }
  83.  

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

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

ActionScript3.0

  1. private function circleOnClick(evt:MouseEvent):void
  2. {
  3.     removeChild(Sprite(evt.target));
  4.     evt.target = null;
  5. }
  6.  

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

ActionScript3.0

  1. private function circleOnClick(evt:MouseEvent):void
  2. {
  3.     removeChild(Sprite(evt.target));
  4.     Sprite(evt.target) = null;
  5. }
  6.  

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

ActionScript3.0

  1. private function circleOnClick(evt:MouseEvent):void
  2. {
  3.     var t:Sprite = Sprite(evt.target);
  4.     removeChild(t);
  5.     t = null;
  6. }
  7.  

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

投稿日 2009年8月 4日 04:15
カテゴリ ActionScript
タグ Flash | 言語仕様
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1177

コメント

コメントする
Name
Email Address
URL