【问题标题】:Flash as3 event listener for when a movieclip is stopped动画剪辑停止时的 Flash as3 事件侦听器
【发布时间】:2012-02-07 12:49:12
【问题描述】:

我正在考虑制作一个在某些点自行停止的影片剪辑(只需使用 stop();在影片剪辑时间线中的某些关键帧处),然后提示用户继续剪辑。

什么是最好的听电影剪辑停止的原因?我想我想要一个事件侦听器来检测电影剪辑何时停止,但我不知道是否有。

非常感谢

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    因为您必须通过 stop() 手动停止 MovieClip,您可以使用 dispatchEvent() 在同一帧上轻松手动调度您自己的事件

    例如,在一个框架上,您可以:

    stop();
    dispatchEvent(
        new Event("movieclip_stopped");
    );
    

    那个 MovieClip 的监听器是:

    myMovie.addEventListener("movieclip_stopped", _stopHandler);
    function _stopHandler(e:Event):void
    {
        trace('mc was stopped');
    }
    

    【讨论】:

    • 感谢马蒂,这非常有效!我是 Flash 新手,但我想知道为什么我刚才想到的这种方法不起作用:stage.addEventListener(Event.ENTER_FRAME, checkstop); function checkstop(evt:Event):void { if (mymovieclip.isPlaying == false) trace("停止播放");我是否误解了 isPlaying 属性的作用?
    • 看这里 (help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…) 我什至没有看到 isPlaying 属性。
    【解决方案2】:

    您可以使用一个未记录的功能; addFrameScript(MovieClip 的一个函数);顾名思义,它将代码添加到某个框架。这样您就不需要 framelistener,并且可以动态地将代码添加到关键帧。因此,知道影片剪辑何时结束;

    mc.addFrameScript(mc.totalFrames - 1, onMcEnded);
    function onMcEnded():void {
        trace("last frame of movieclip");
    }
    

    如果您想制作具有特定标签的影片剪辑,然后对这些标签进行操作,一种方法是这样做。(我想对于不想添加代码的任何人来说,这都是很常见的代码直接在时间轴上)

    假设您在时间线上添加了两个标签:askUser1 和 askUser2

    在这些标签上添加交互的方式如下:

    for each(var frameLabel:FrameLabel in mc.currentLabels) {
          configureLabel(frameLabel.name,frameLabel.frame-1)                
    }
    
    protected function configureLabel(labelName:String,labelFrame:int):void 
    {
        switch(labelName) {                 
            case "askUser1" :
                    mc.addFrameScript(labelFrame, onAskUser1);
            break;                  
            case "askUser2" :   
                    mc.addFrameScript(labelFrame, onAskUser2);
            break;
        }           
    }
    private function onAskUser1():void{
         //do stuff for askUser1 Label
    }
    private function onAskUser2():void{
         //do stuff for askUser2 Label
    }
    

    【讨论】:

      【解决方案3】:

      可怕的 hacky 解决方案是不断收听onEnterFrame

      var isPlaying:Boolean = false;
      var lastFrame:int = 0;
      addEventListener(Event.ENTER_FRAME, function(event:Event):void
      {
          isPlaying = (lastFrame != currentFrame);
          lastFrame = currentFrame;
      });
      

      更好的解决方案是根据您的 stop() 代码实际跟踪状态。

      【讨论】:

        【解决方案4】:

        user1010076我不知道你是如何从 Marty 那里得到代码来工作的..

        stop();
        dispatchEvent(
            new Event("movieclip_stopped");
        );
        

        我试了又试,然后从Introduction to event handling in ActionScript 3.0找到了这个班轮

        target.dispatchEvent(new Event("type"));
        

        因此,要让 Marty 的整个代码正常工作,您需要 ..

        myMovie.dispatchEvent(new Event("movieclip_stopped"));
        

        我有一个与你类似的用例,现在代码可以与添加的“目标”一起使用,而我没有它。

        【讨论】:

        • 嘿 Randy 我一直在尝试找到我将代码放入的文件,但到目前为止没有成功。我确实制作了一个新文件并尝试了它 - 它与 dispatchEvent(new Event("hello there"));在 MovieClip(称为 mymovieclip)中,并使用 mymovieclip.addEventListener(Event, "hello there");在主时间线上。但现在我不确定你为什么需要 mymovieclip。参加主要时间,因为无论如何该事件都应该冒泡......
        • 对不起。刚刚找到你的回复,谢谢。 @发帖时我很想知道你是如何工作的,而我没有工作。我只知道在 dispatchEvent 之前我确实需要目标前缀。确实想了解一些东西,但似乎有时不能。这里有两种方法可以尝试! 祝你好运 user1010076
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        • 2013-03-28
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多