【问题标题】:EnterFrame handler to run only while timeline is stopped on a certain frameEnterFrame 处理程序仅在时间轴在某个帧上停止时运行
【发布时间】:2012-09-09 20:48:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: actionscript-3 flash actionscript


    【解决方案1】:

    如果您打算在相关框架上使用此代码,那么您可以这样做:

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

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

    【讨论】:

      【解决方案2】:

      你没听说过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);
      }
      

      【讨论】:

      • 我认为这不能回答问题。他已经在有问题的框架上有代码。
      • addFrameScript 是一个未记录的功能,因此可能会在未来的 Flash 播放器中被删除。我不认为使用它真的是一个好习惯,但我认为你想说的是在类文件中使用它比直接将代码放在时间轴上更好?在这种情况下,我同意。
      【解决方案3】:

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

      • 在您关心的帧上添加 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...
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-12
        • 2015-03-08
        • 2015-04-24
        • 2014-05-20
        • 2015-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多