Re: [問題] Tween無法addEventListener

看板Flash作者 (hello, ActionScript)時間13年前 (2012/04/16 15:22), 編輯推噓8(808)
留言16則, 3人參與, 最新討論串2/2 (看更多)
: 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

04/16 16:17, , 1F
耶...好像會自己start()沒錯,太久沒用忘記了XD
04/16 16:17, 1F

04/16 16:18, , 2F
同時也可以參考精華區 3 > 7 > 3 > 1
04/16 16:18, 2F

04/16 20:58, , 3F
感謝感謝,測完後再回報
04/16 20:58, 3F

04/17 00:07, , 4F
經過測試,發現for迴圈跑太快,其實是有執行addEventL...
04/17 00:07, 4F

04/17 01:11, , 5F
"for迴圈跑太快" 的意思是?
04/17 01:11, 5F

04/17 01:19, , 6F
Tween還在監聽是否完成時,迴圈就跑到下一個,所以迴圈完
04/17 01:19, 6F

04/17 01:20, , 7F
成後,其實Tween還沒有finish,自然不會執行到finish那段
04/17 01:20, 7F

04/17 01:21, , 8F
還在思考如何解決,想到再跟大家說
04/17 01:21, 8F
看你的想法 是想要等前一個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)

04/17 10:43, , 9F
^^一開始我也是像您這麼想的...不過,for迴圈就像定期出
04/17 10:43, 9F

04/17 10:44, , 10F
現的公車,addEventListener就像是注意公車來的乘客
04/17 10:44, 10F

04/17 10:46, , 11F
當乘客還在遠方看著公車靠近要舉手時,末班車早就跑走了
04/17 10:46, 11F

04/17 10:48, , 12F
我把for拿掉,才發現還真是點點點>_<,我會聽您的意見
04/17 10:48, 12F

04/17 10:49, , 13F
試試Timer或EnterFrame,不過可能是明後天了^^謝謝!!
04/17 10:49, 13F

04/18 07:32, , 14F
習慣用EnterFrame同步後就很少用For弄視覺類的東西
04/18 07:32, 14F

04/18 07:33, , 15F
因為EnterFrame比較能掌握時間,然後建議不要用Timer
04/18 07:33, 15F

04/18 07:33, , 16F
如果你拿Timer做過碼表之類的就知道為什麼了
04/18 07:33, 16F
文章代碼(AID): #1FYyZIEy (Flash)
討論串 (同標題文章)
文章代碼(AID): #1FYyZIEy (Flash)