Flash CS3 AS3 Movieclips携带到其他帧

时间:2014-08-01 21:55:00

标签: actionscript-3 flash button adobe movieclip

好的,我有一个奇怪的问题。我在屏幕上有一些动画片段,其中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();
}

按钮代码位于主时间轴上,动画片段代码位于动画片段的时间轴上。

出于某种原因,如果你将movieclip置于DOWN状态(打开弹出窗口)并单击按钮转到下一帧,则动画片段将跟随下一帧和任何其他帧,而不是仅仅消失。

我在其他框架上有相同的代码,其他框架都不会这样,这真的很奇怪。

当它在其他帧上时,你甚至可以点击它,然后调出弹出窗口,其中甚至不存在动画片段和代码。

它发生了什么?

1 个答案:

答案 0 :(得分: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);
}