作者jeaby (hello, ActionScript)
看板Flash
標題Re: [問題] Tween無法addEventListener
時間Mon Apr 16 15:22:55 2012
: private function initial():void
: {
: for (var i:Number = 1; i <= 3; i++)
: {
: lo = new Loader();
: re = new URLRequest("bmp/"+i+".jpg");
: this.lo.load(re);
: this.addChild(lo);
: this._tween = new Tween(lo,"alpha",Strong.easeOut,0,1.0,3,true);
因為 _tween 宣告成全域變數的關係,所以迴圈跑完
_tween 只會指向 i=3 的那次 Tween
: this._tween.addEventListener(TweenEvent.MOTION_FINISH,_mf);
: }
: return;
: }
: function _mf(event:TweenEvent):void
: {
: trace("finish");
: this._tween.removeEventListener(TweenEvent.MOTION_FINISH,this._mf);
: this._tween = null;
如上面所說,不管這是哪一個 Tween 觸發的 event
都只會把 i=3 的 Tween 移除事件
所以當有第二個 Tween 完成的時候
_tween 已經是 null 了,會跳錯誤
: this.lo.unload();
: return;
: }
: }
: }
還有一點是你三個 Tween 同時 start,沒有時間差阿 ...
參考一下我幫你修改過後的,應該滿好懂的
public class main extends MovieClip
{
private var lo:Loader;
private var re:URLRequest;
private var arr:Array;
public function main()
{
arr = [];
for (var i:Number = 1; i <= 3; i++)
{
addTween(i);
}
arr[0].start();
}
private function addTween(i:int):void
{
lo = new Loader();
re = new URLRequest("/bmp/" + i + ".jpg");
lo.load(re);
lo.alpha = 0;
addChild(lo);
function onFinish(e:TweenEvent):void
{
_tween.removeEventListener(TweenEvent.MOTION_FINISH, onFinish);
_tween = null;
arr.shift();
if (arr.length) {
arr[0].start();
}
}
var _tween = new Tween(lo, "alpha", Strong.easeOut, 0, 1.0, 3, true);
_tween.addEventListener(TweenEvent.MOTION_FINISH, onFinish);
_tween.stop();
// tween 預設好像會自己 start!?
arr.push(_tween);
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.121.204.118
推 cjcat2266:耶...好像會自己start()沒錯,太久沒用忘記了XD 04/16 16:17
→ cjcat2266:同時也可以參考精華區 3 > 7 > 3 > 1 04/16 16:18
推 ninimiga:感謝感謝,測完後再回報 04/16 20:58
推 ninimiga:經過測試,發現for迴圈跑太快,其實是有執行addEventL... 04/17 00:07
推 cjcat2266:"for迴圈跑太快" 的意思是? 04/17 01:11
推 ninimiga:Tween還在監聽是否完成時,迴圈就跑到下一個,所以迴圈完 04/17 01:19
→ ninimiga:成後,其實Tween還沒有finish,自然不會執行到finish那段 04/17 01:20
→ ninimiga:還在思考如何解決,想到再跟大家說 04/17 01:21
看你的想法 是想要等前一個tween完成後再執行下一個 addTween()對嗎?
如果是這樣可以用 timer,每三秒鐘執行一次 addTween,然後把stop()拿掉
不過感覺有點多此一舉
另外就算迴圈跑的再快再慢,onFinish都會執行的,因為已經有偵聽 Event了
你可以在 onFinish裡面加個全域變數 count測測看,一定會執行到三次的
補上時間軸幫助你理解:
執行三次addTween() → arr[0]的tween開始執行 → 三秒後 →
第一個 tween完成,從arr內移除,執行下一個 tween → 三秒後 →
第二個 tween完成,從arr內移除,執行下一個 tween → 三秒後 →
第三個 tween完成,從arr內移除,arr內沒東西了,結束
※ 編輯: jeaby 來自: 118.171.118.34 (04/17 10:31)
推 ninimiga:^^一開始我也是像您這麼想的...不過,for迴圈就像定期出 04/17 10:43
→ ninimiga:現的公車,addEventListener就像是注意公車來的乘客 04/17 10:44
推 ninimiga:當乘客還在遠方看著公車靠近要舉手時,末班車早就跑走了 04/17 10:46
→ ninimiga:我把for拿掉,才發現還真是點點點>_<,我會聽您的意見 04/17 10:48
→ ninimiga:試試Timer或EnterFrame,不過可能是明後天了^^謝謝!! 04/17 10:49
推 bujinron:習慣用EnterFrame同步後就很少用For弄視覺類的東西 04/18 07:32
→ bujinron:因為EnterFrame比較能掌握時間,然後建議不要用Timer 04/18 07:33
→ bujinron:如果你拿Timer做過碼表之類的就知道為什麼了 04/18 07:33