作者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
1F:推 cjcat2266:耶...好像会自己start()没错,太久没用忘记了XD 04/16 16:17
2F:→ cjcat2266:同时也可以参考 3 > 7 > 3 > 1 04/16 16:18
3F:推 ninimiga:感谢感谢,测完後再回报 04/16 20:58
4F:推 ninimiga:经过测试,发现for回圈跑太快,其实是有执行addEventL... 04/17 00:07
5F:推 cjcat2266:"for回圈跑太快" 的意思是? 04/17 01:11
6F:推 ninimiga:Tween还在监听是否完成时,回圈就跑到下一个,所以回圈完 04/17 01:19
7F:→ ninimiga:成後,其实Tween还没有finish,自然不会执行到finish那段 04/17 01:20
8F:→ 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)
9F:推 ninimiga:^^一开始我也是像您这麽想的...不过,for回圈就像定期出 04/17 10:43
10F:→ ninimiga:现的公车,addEventListener就像是注意公车来的乘客 04/17 10:44
11F:推 ninimiga:当乘客还在远方看着公车靠近要举手时,末班车早就跑走了 04/17 10:46
12F:→ ninimiga:我把for拿掉,才发现还真是点点点>_<,我会听您的意见 04/17 10:48
13F:→ ninimiga:试试Timer或EnterFrame,不过可能是明後天了^^谢谢!! 04/17 10:49
14F:推 bujinron:习惯用EnterFrame同步後就很少用For弄视觉类的东西 04/18 07:32
15F:→ bujinron:因为EnterFrame比较能掌握时间,然後建议不要用Timer 04/18 07:33
16F:→ bujinron:如果你拿Timer做过码表之类的就知道为什麽了 04/18 07:33