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のライブチケットを差し上げます。

Posted by otsuka : 18:23 | Comment (4) | Trackback (0)
Comment

Tweener 詳しくないですけど、Tweener.removeTween してから delete なり、removeChild なりじゃだめですか?

Posted by: tksh : 2008年03月20日 22:22

tkshさん、ありがとうございます。

が、よくよく調べてみると僕の勘違いでした。onCompleteハンドラの中での「this」が参照するのは、Tweenの対象オブジェクト(上のコードの例だとaDisplayObject)でした。なので、this.removeChild(aDisplayObject); がそもそもの間違いでした。

AS2時代の名残ですかね。AS3でこの仕様はいかがなものかと思いました。


さて、tkshさん。ライブいらっしゃいますか?

Posted by: otsuka : 2008年03月21日 00:58

>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]
って出てきます。

Posted by: +39 : 2008年03月28日 18:56

うーん、謎ですね。後日もう一度調べてみます。

では、+39さんは4月27日のライブに是非。

Posted by: otsuka : 2008年03月30日 17:13









名前、アドレスを登録しますか?