KANTENNA.COM

Solarized

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.  }

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

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

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

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

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

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

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

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

トラックバック(2)

2010年2月16日 02:36

ActionScript3.0 コメントとかコーディング規約とか情報備忘録

ActionScript3.0 コメントとかコーディング規約とか続きを読む

2010年2月16日 03:55

ActionScript3.0 [練習] XMLとナビゲーションWEBプログラム覚書

ActionScript3.0を利用してXMLを読み込んでダサいナビゲーションを作ってみる続きを読む

コメント

コメントする
Name
Email Address
URL
TIME LINE
2012
02.08

[Ubuntu11.10]Winows XPユーザーがUbuntuを使ってみて

Windows XPとUbuntuのデュアルブート環境にしてみておもったこと。

2012
02.03

[jQuery]closest()とparents()

今から16年前Netscapeブラウザのソースコードの公開方法の会議の中で、初めてオープンソースという言葉が使われた今日、 みなさんいかがお過ごしでしょうか。

今回の投稿はそれとは関係のないjQueryのparents()とclosest()が 似てたので何が違うのか試した時のメモです。

2012
02.01

[jQuery Mobile]初期化イベントメモ

jQuery Mobileは読み込まれてから

mobileinit -> pagebeforecreate -> pagecreate -> pageinit

の順番でイベントが発生する。

2012
02.01

[WordPress]管理画面のフッタのフィルタとアクション。

時間も時間なので、あまり使用頻度の高くない微妙なネタを。

会員制サイトなどで不特定多数の人にログインさせる場合、フッタのバージョン情報は隠しておきたかったり、 こじゃれたメッセージを表示したいときとか使うアクションとフィルタ。

2012
01.28

[WordPress] ブログの情報を取得する方法とノーキャッシュ疑惑

ブログのget_bloginfo()で取れないデータが必要な場合に使うもの。

2012
01.26

[jQuery Mobile]ダイアログ

jQuery Mobileにおけるダイアログの扱いはウインドウではなくページ。 なので通常のページと同様に扱える。ダイアログウインドウを出す。じゃなくダイアログページに遷移する。的な。

2012
01.25

[Ubuntu11.10]Ubuntuのインストール後の設定

インストール完了後の環境構築。PC起動時いちいちBIOSからブートドライブ選んで ブートするのかと思ってたら起動時にOS選択画面が出てくる。

すばらしいですね。

2012
01.24
2012
01.23

MinGW+Mintty+Git

MinGW+Mintty+Gitをやろうとして失敗に終わった。このエントリーには収穫できるものはありません。