EnterFrame处理程序仅在特定帧上停止时间轴时运行

时间:2012-09-17 15:37:19

标签: actionscript-3 flash actionscript

我在框架中有一些代码。这基本上是

this.addEventListener(Event.ENTER_FRAME, handleUpdate);
function handleUpdate(e:Event):void
{...}

我希望代码只在该帧上执行。但即使我离开那个框架,handleUpdate函数仍会被调用。

时间轴在此帧上停止,我希望handleUpdate连续运行,直到时间轴离开帧。

3 个答案:

答案 0 :(得分:2)

如果您在相关框架上设置了此代码,那么您可以这样做:

        var tmpCurFrame:int = currentFrame; //store the current frame
        this.addEventListener(Event.ENTER_FRAME, handleUpdate)

        function handleUpdate(e:Event):void {
            if (tmpCurFrame != currentFrame) { //if the frame has changed, stop the frame handler
                this.removeEventListener(Event.ENTER_FRAME, handleUpdate);
                return;
            }
            //do your code
        }

        handleUpdate(null);

顺便说一句,拥有一个文档类和其他类文件来管理这类事情而不是使用框架脚本要简单得多。但是,如果您正在寻找的是对现有代码进行快速而肮脏的调整,那么这应该可以解决问题。

答案 1 :(得分:1)

你没有听说过addFrameScript吗? 它非常适合您的需求。

var desiredFrame = 25;  // Timeline frame (starts from 1)
this.addFrameScript(desiredFrame-1, onFrame25);  // 1st param is zero-based

function onFrame25():void
{
    trace("I'm on frame", desiredFrame);
}

答案 2 :(得分:0)

您的方法应该考虑以下几点:

  • 在您输入该帧之后,在您关注的帧上添加一个ENTER_FRAME侦听器,因此如果正在播放动画片段,则在下一帧(此时它可能已移开)之前不会获得ENTER_FRAME事件那个框架)。

  • 请注意每次播放头进入该帧时帧上的代码都会执行,并且在适当的内存泄漏时应小心删除侦听器。

所以一种方法是将这些代码放在有问题的框架上 - 注意它也很好地删除了它的监听器:

var thisFrame:int = currentFrame;
function handleUpdate(e:Event) {
  if (currentFrame==thisFrame) {
    // your code here...
  } else {
    // remove listener if we moved off the frame
    removeEventListener(Event.ENTER_FRAME, handleUpdate);
  }
}
// call it now because the listener won't fire until next frame
handleUpdate(null);

// add listener in prep for next ENTER_FRAME, though note that
// if we move off this frame, then the listener is removed above
addEventListener(Event.ENTER_FRAME, handleUpdate);

另一种方法是在第1帧上添加以下代码,因此侦听器始终运行并且永远不会被清除,并且仅在第12帧时执行代码:

addEventListener(Event.ENTER_FRAME, handleUpdate);
function handleUpdate(e:Event):void
{
  if (currentFrame==12) {
    // your code here...
  }
}