我有一个Movie Clip,我需要在电影到达某个帧时停止它。为此,我需要添加一个事件侦听器,当该特定影片剪辑进入新帧时(而不是整个动画ENTER_FRAME)将调度该事件侦听器。
bar.addEventListener(Event.ENTER_FRAME, function(e:Event) {
var b:MovieClip = MovieClip(e.currentTarget);
if(b.currentFrame == mp.getPopularity())
b.stop();
});
有什么想法吗?
感谢。
答案 0 :(得分:1)
试试这个;
一个简单的功能:
function playUntil(target:MovieClip, frame:int):void
{
target.stopFrame = frame; // Works because MovieClip is dynamic.
target.addEventListener(Event.ENTER_FRAME, _checkFrame);
}
使用聆听功能:
function _checkFrame(e:Event):void
{
var m:MovieClip = e.target as MovieClip;
if(m.currentFrame == m.stopFrame)
{
m.stop();
m.removeEventListener(Event.ENTER_FRAME, _checkFrame);
}
}
将其应用于您的所有实例:
playUntil(instance1, 15);
playUntil(instance2, 27);
playUntil(instance3, 113);
答案 1 :(得分:1)
您应该在不再需要时删除事件侦听器,否则可能会导致内存泄漏。匿名函数可能会使这很困难,尽管您可以使用arguments.callee。
bar.addEventListener(Event.ENTER_FRAME, function(e:Event) {
var b:MovieClip = MovieClip(e.currentTarget);
if(b.currentFrame == mp.getPopularity()){
b.stop();
b.removeEventListener(e.type, arguments.callee);
// ^^ this may work to remove your anonymous listener.
}
});
但还有另一种方法可以解决这个问题。 mp.getPopularity()经常更改吗?如果在告诉play()后它没有改变,那么你可以使用addFrameScript。只记得addFrameScript是0索引的,所以在第1帧添加一个脚本意味着你必须传递0 ...所以如果在mp.getPopularity()上发生一个动作那么你必须传递mp.getPopularity() - 1。
var framescript:Function = function():void{
bar.stop();
bar.addFrameScript(bar.currentFrame-1, null);
// ^^ nulling the framescript after
// ^^ it is no longer needed.
}
bar.stop(); // Generally a good idea to call stop before calling addFrameScript
bar.addFrameScript(mp.getPopularity() - 1, framescript);
bar.gotoAndPlay(1); // or wherever it needs to start from.
这是一个更精确的解决方案,但是如果您计划稍后使用相同的条形实例并使用不同的mp.getPopularity()值,则必须记住在完成后清理framecript。