Category Archive: ActionScript

[AS]removeChild()でガベージコレクション(GC)対象となる。

例えば、フレームアクションで、

var sp:Sprite = new Sprite();
this.addChild(sp);
removeChild(sp);
sp = null;

スプライトを作って、
メインのタイムラインに追加して、
メインのタイムラインから削除して、
スプライトの参照も削除

当然これで、spはGC対象となる。
でもこの場合ではsp=nullは特に要らないみたい。

var sp:Sprite = new Sprite();
this.addChild(sp);
removeChild(sp);

この場合は、これでもspはGCの対象となるようす。
removeChild()した時点で、GC対象となっている。

removeChildについてのドキュメントより、

DisplayObjectContainer インスタンスの子リストから指定の child DisplayObject インスタンスを削除します。
削除された子の parent プロパティは null に設定されます。その子に対する参照が存在しない場合、そのオブジェクトはガベージコレクションによって収集されます。

参考サイト:
FlashPlayer9のガベージコレクタのメモリ解放の考察

DisplayObjectじゃない(addChildしてない)変数をGC対象とするときは○○=nullを使って参照を切ればいいってことなのかな。

[AS]progressionでpreloaderのインスタンスにアクセスする方法

教えてもらったこと。
index.asにて

MovieClip(stage.getChildAt(0))

でpreloader本体を指定可能。

例)
preloader.flaに、hoge1_mcとかhoge2_mcとか置いてあった場合。
index.asからhoge1_mcにアクセスするには、

MovieClip(stage.getChildAt(0)).hoge1_mc

でOK

[FD]FlashDevelopでFlex SDKのコンパイルの際のドキュメントクラス的なものについて

緑色の↓(下矢印)のついたアイコンのファイルがコンパイル対象となる。
※右クリックでAlwaysCompileにチェックが入ってる
mxmlとかasファイルとかに指定する。

変更するときは、変更したいファイルを右クリックしてAlwaysCompileにチェック。
(さっきまでチェックされてたファイルのアイコンから緑下矢印が消える)

[AS]ドキュメントクラスでのthisについて

ドキュメントクラスは、MovieClipかSpriteを継承していないといけない。
そのためどっちを継承したかでthisの性質が変わってくる模様。

以下、Spriteを継承しててはまったこと。
ステージにインスタンス名myMcのムービークリップを配置。
ドキュメントクラスをMain.as

//Main.as
public class Main extends Sprite {
public function Main() {
var main2:Main2 = new Main2(this);
}
}
//Main2.asのコンストラクタ
public function Main2(container) {
var container2:Sprite = container

trace(container2.myMc.x);
}

これだと、container2にmyMcなんてプロパティ無いよと起こられる。
おそらくSpriteはDynamicじゃないからってことかな?
でも、↓こう書けばSprite継承でも参照できるみたい。
trace(container2[“myMc”].x);
まぁcontainer2:Spriteとせずに、Mainとすれば問題ないけど。

最初からMainはMovieClipを継承してれば何の問題もない

//Main.as
public class Main extends MovieClip{
public function Main() {
var main2:Main2 = new Main2(this);
}
}
//Main2.asのコンストラクタ
public function Main2(container) {
var container2:MovieClip= container
trace(container2.myMc.x);
}

結論としては、ドキュメントクラスはMovieClipを継承しといた方が無難・・・

[AS]クラスインスタンスを作って表示リストに追加を1行で書く

たとえば、ライブラリにMCがあり、それはクラス名Mcでリンケージしてある。

一般的には

var mc:Mc = new Mc();//インスタンス作成
addChild(mc)//表示リストに追加

一行で書くと

var mc:Mc = Mc(addChild(new Mc()));

もしくは

var mc:Mc = addChild(new Mc()) as Mc;

※addChildの返り値はDisplayObjectなので、型変換が必要

2009/03/04追記
※DisplayObjectで問題なければしなくても良い

[AS]functionの中のfunctionのthisについての注意

関数の中に関数を入れた場合(関数クロージャというらしい)、中の関数でのthisの扱いには注意が必要。

例えば。。。

//フレームアクション
function main(){
trace(this);
//mc赤い四角定義
	var mc = new MovieClip();
	mc.graphics.beginFill(0xFF0000);
	mc.graphics.drawRect(0,0,100,100);
	mc.graphics.endFill();
	sub();
//関数クロージャ(たぶん)
	function sub(){
trace(this);
		addChild(mc);
	}
}
main();

上記を実行すると100×100の赤い四角がx:0,y:0の位置に表示される。
ここで注意したいのが、function subの中のaddChild(mc);
これは本来の文法的にはDisplayObjectContainer.addChild(mc)
DisplayObjectContainerが記載されてないから、thisになるのか、
と思うとそうでもない。。。

this.addChild(mc)

これはエラーになります。
finction sub()のthisと、function main()のthisはtrace結果を見ると違うものです。
よって、関数クロージャのaddChild(~)は、thisが省略されてるわけではないってことで。
※この例では”メインのタイムライン”になっているみたい。(フレームアクションなので)

[AS][?]progression addCommandのexecute()について

_onload(),_onInit(),_onCastAdded(),_onCastRemoved(),_onGoto()などのoverride系のメソッドの中のaddCommand()は、execute()無しで、自動的に実行されるみたい。

addCommand()はリスト(CommandList?)にコマンドを追加するメソッドで、色んなクラスに入っている。
が、しかし、
CommandListクラスのメソッドのaddCommand()と
SceneObjectクラスのメソッドのaddCommand()とでは
動作の意味が若干違うみたい。(ドキュメントに書いてあることが違うし)

[AS][?]xmlから取得したデータをBoolean型として認識するには?

なんかうまくできなかった。

[AS][?]loaderInfo.addEventListener( Event.COMPLETE, _complete );

loaderInfo.addEventListener( Event.COMPLETE, _complete );
↑これってメインのタイムラインとかドキュメントクラスには書いといた方がいいのかな?

[AS][?]progression ParallelListとかSerialListについて

まずはドキュメントのサンプルより

パラレルリストの中にパラレルリストを作って実行しているがメリットがわからない・・・

var list:ParallelList = new ParallelList();
list.addCommand(
new ParallelList( null,
new Trace("この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" )
);
list.execute();

コマンド内に書くとexecute();無しでも自動で実行されるのでシンプルな感じ
↓これで上と同じ意味になってるっぽいけど厳密には違うのかしら?

addCommand(
new ParallelList( null,
new Trace( "この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" )
)
);