在MovieClip的每一帧上发送事件

时间:2012-03-26 04:56:05

标签: actionscript-3

我有一个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();
});

有什么想法吗?

感谢。

2 个答案:

答案 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。