1

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

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

我希望代码仅在该帧上执行。但是,即使我不在那个框架内,handleUpdate 函数也会不断被调用。

时间线在此帧上停止,我希望 handleUpdate 连续运行,直到时间线移出该帧。

4

3 回答 3

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);

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

于 2012-09-17T16:22:27.920 回答
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);
}
于 2012-09-17T18:03:26.080 回答
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...
  }
}
于 2012-09-20T17:46:47.900 回答