2009年08月04日 04:15
パーマリンク | http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/484
ActionScript 3.0でオブジェクトを表示するための重要な仕組み。
swfで表示されるグラフィックなどは表示リストと呼ばれる ステージを頂点としたツリー構造となっている。
表示リストは表示オブジェクトコンテナと 表示オブジェクトから構成される。
表示オブジェクトコンテナは表示オブジェクトと 表示オブジェクトを持つことができる枝。表示オブジェクトは なにも持つことはできない葉である。
表示オブジェクトと表示オブジェクトコンテナとして 機能するものはすべてDisplayObjectを継承している。
表示オブジェクトコンテナとして機能するものはさらに DisplayObjectContainerを継承している。
コアで定義されている表示オブジェクトコンテナはわずか4つ。
表示オブジェクトを実際に表示させるには 表示リストに追加する必要がある。
表示リストに追加するにはaddChild()を利用する。 表示リストから外したい場合はremoveChild()を利用する。
removeChild()はあくまで表示リストから外すだけで 実際のオブジェクトはメモリ上に存在している。 なので2度と使わない場合はきっちり消しておかないと メモリリークを起こしてしまう可能性があるとのこと。
この話は下記の本にかいてありました。
/ 金額 : ¥ 3,570
ためしにボタンクリックで円をドキュメントクラス(メインのタイムライン)に追加して 追加された円をクリックするとそれが消えるってのを書いた。
イベントオブジェクトからターゲットオブジェクトを 参照するとこでエラーが出た。
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;
}
参照のプロパティは一度取り出してから設定する 感じなんだろうか??
/ 金額 : ¥ 2,940
/ 金額 : ¥ 2,940
1-5
6-10
/ 金額 : ¥ 3,465
/ 金額 : ¥ 3,150
/ 金額 : ¥ 2,699
/ 金額 : ¥ 3,497
/ 金額 : ¥ 3,675