2008年03月20日
Flash | Tweener処理後に対象オブジェクトを削除
Tweener.addTween(aDisplayObject, {alpha:0, onComplete:deleteObject});
function deleteObject():void {
this.removeChild(aDisplayObject);
}上のコードのように、あるDisplayObjectをフェードアウトした後に、それが属しているDisplayObjectContainer(上の場合this)から削除したいのだけど、上のコードだとdeleteObject()が呼ばれた時ににはTweenerがまだaDisplayObjectを何かしてるから削除できないよとエラーになってしまう。
こういうことをしたい場合、どうすればいいのでしょうか? Tweenerに詳しい方、教えてくださいまし。
お礼にSMEの3/30のライブチケットを差し上げます。
Tweener 詳しくないですけど、Tweener.removeTween してから delete なり、removeChild なりじゃだめですか?
tkshさん、ありがとうございます。
が、よくよく調べてみると僕の勘違いでした。onCompleteハンドラの中での「this」が参照するのは、Tweenの対象オブジェクト(上のコードの例だとaDisplayObject)でした。なので、this.removeChild(aDisplayObject); がそもそもの間違いでした。
AS2時代の名残ですかね。AS3でこの仕様はいかがなものかと思いました。
さて、tkshさん。ライブいらっしゃいますか?
>this」が参照するのは、Tweenの対象オブジェクト
これうちでは違う挙動なのですが、どうなんでしょうね。
---
package {
import caurina.transitions.Tweener;
import flash.display.MovieClip;
import flash.display.Sprite;
public class tweener_onCompleteremoveChild extends Sprite{
private var aaa:MovieClip
public function tweener_onCompleteremoveChild() {
aaa = new aho();
this.addChild(aaa);
Tweener.addTween(aaa, { x:100, time:1, transition:"linear",onComplete:onMoveEnd } );
}
function onMoveEnd():void {
trace("#onMoveEnd",this);
this.removeChild(aaa);
}
}
}
---
これで実行するときちんと消えますし、onMoveEndのなかのトレースも
//#onMoveEnd [object tweener_onCompleteremoveChild]
って出てきます。
うーん、謎ですね。後日もう一度調べてみます。
では、+39さんは4月27日のライブに是非。