Flash CS3 AS3 影片剪辑转移到其他帧

Posted

技术标签:

【中文标题】Flash CS3 AS3 影片剪辑转移到其他帧【英文标题】:Flash CS3 AS3 Movieclips carrying over to other frames 【发布时间】:2014-09-25 04:32:58 【问题描述】:

好的,所以我遇到了一个奇怪的问题。我在屏幕上有一些电影剪辑,其中 4 个,每个都有以下代码(当然有不同的实例名称):

stage.addEventListener(MouseEvent.MOUSE_DOWN,globalMouseDown,false,0,true); //add a  global mouse listener

function globalMouseDown(e:Event):void 
    //find out if the target is a descendant of this, if not, then something else was clicked.
    var parent:DisplayObject = e.target as DisplayObject;
    while(parent && parent != stage)
        if(parent == this) return;
        parent = parent.parent;
    

    //something else was clicked that wasn't this, so go to the up state
    gotoAndStop(1);



stop();

addEventListener(MouseEvent.MOUSE_DOWN, onHs1Press);
addEventListener(MouseEvent.MOUSE_OVER, onHs1Over);
addEventListener(MouseEvent.MOUSE_OUT, onHs1Out);

function onHs1Press(event:MouseEvent):void 



    // toggle between frame 1 and 3 on button press
    gotoAndStop(this.currentFrame == 3 ? 1 : 3);
    parent.addChild(this)


function onHs1Over(event:MouseEvent):void


    if (currentFrame != 3)
    
        gotoAndStop(2);
    


function onHs1Out(event:MouseEvent):void

    // only switch back to UP state if the button is "pressed"
    if (currentFrame != 3)
    
        gotoAndStop(1);
    
 

基本上,它可以让您将鼠标悬停在动画剪辑上,然后当您单击它时会出现一个小弹出窗口,直到您再次单击该动画剪辑以将其关闭。

屏幕上还有一个按钮,可让您使用此代码向前或向后移动到其他帧:

Next.addEventListener(MouseEvent.CLICK,Nclick);
function Nclick(event:MouseEvent):void  
    nextFrame();

Back.addEventListener(MouseEvent.CLICK,Bclick);
function Bclick(event:MouseEvent):void  
    prevFrame();

按钮代码位于主时间轴上,而影片剪辑代码位于影片剪辑的时间轴上。

由于某种原因,如果您的影片剪辑处于 DOWN 状态(弹出窗口打开)并且您单击按钮转到下一帧,影片剪辑将跟随下一帧和任何其他帧,而不是消失。

我在其他帧上也有相同的代码,其他帧都没有这样的行为,这真的很奇怪。

您甚至可以在它位于其他帧上时仍然单击它,然后弹出一个弹出窗口,其中甚至不存在影片剪辑和代码。

这是怎么回事?

【问题讨论】:

如果您注释掉parent.addChild(this) 代码,它是否可以正常工作?或者注释掉全局鼠标监听器? 你不应该使用框架。框架用于快速/简单的动画。不要使用它们来控制代码。此外,一般来说,您永远不应该使用 parent。 全局鼠标监听器的评论已经不在了?并且向 parent.addChild(this) 添加评论什么都不做。这很奇怪,因为我在另一个框架上有完全相同的代码,但它没有这样做。就作品的架构而言,有主时间轴,在主时间轴的这一帧上有 4 个动画剪辑,第一段代码在 4 个动画剪辑的每个的第一帧上,所以代码不在主线。第二段代码,用于下一步和后退按钮是在主时间轴上。 好的,我认为问题出在 parent.addChild(this) 部分。我用它来确保所有子影片剪辑都显示在其他所有内容之上。有没有其他方法可以做到这一点? 当我说注释掉时,我的意思是把整行变成注释(有效地删除这行代码来测试它是否是原因)。 【参考方案1】:

我尝试对此进行测试,并且可以重现您的问题。如果您在 FlashPro 中将影片剪辑添加到舞台,在更改它的索引或父级之后,它将被视为从代码创建的对象,时间轴将忽略它,甚至在它所在的帧上创建它的另一个实例已创建。

您必须手动从显示列表中删除按钮。

function Nclick(event:MouseEvent):void  
    nextFrame();
    removeBtns();


function Bclick(event:MouseEvent):void  
    prevFrame();
    removeBtns();


function removeBtns():void 
    if(currentFrame != 2)  //whatever the frame of your buttons is
        if(btn1 && btn1.parent) removeChild(btn1); //btn1 being whatever your button instnace name is
        if(btn2 && btn2.parent) removeChild(btn2);  //repeat for all buttons
    

或者,如果您希望封装代码而不是上述代码,请将其放在您的按钮类/时间轴上:

var myFrame:int = MovieClip(parent).currentFrame;

this.addEventListener(Event.ENTER_FRAME,enterFrameHandler);
this.addEventListener(Event.REMOVED_FROM_STAGE,removedHandler);

function enterFrameHandler(e:Event):void 
    if(MovieClip(parent).currentFrame != myFrame)
        parent.removeChild(this);
    


function removedHandler(e:Event):void 
    this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
    this.removeEventListener(Event.REMOVED_FROM_STAGE, removedHandler);

【讨论】:

所以如果我使用第一个选项,我需要删除所有 5 个按钮。我可以将所有五个按钮都添加到 removeBtn 函数中,还是需要创建 5 个单独的 removeBtn 函数并在我点击按钮时全部调用它们? 将它们全部添加到同一个函数中。 太棒了,看起来成功了。我在调试时仍然会遇到一些随机错误,但它似乎并没有引起我可以看到的任何问题,并且一切都按照我的意愿进行。感谢您的所有帮助!

以上是关于Flash CS3 AS3 影片剪辑转移到其他帧的主要内容,如果未能解决你的问题,请参考以下文章

用flash as3语言如何将影片剪辑存入一个数组以及如何访问?

影片剪辑中的 As3 Flash 按钮

Flash AS3 从影片剪辑访问全局变量

AS3.0中影片剪辑元件嵌套了个动态文本框,怎样才能在文本框上也能显示手型?

调整影片剪辑 AS3 的大小

FLASH中影片剪辑嵌套按钮实现。AS2.0