How to apply action to mulitple flash layers

ε祈祈猫儿з 提交于 2019-12-13 07:41:38

问题


I have 5 layers with symbols on each: a, b, c, d and e. I am trying to work out how to apply the action bellow to a, c, d and e when you hover over b.

Also is there another action similar to ' gotoAndStop(0); ' that instead of going immediately to frame 0 it goes back the way it came?

Link to .Fla http://www.fileden.com/files/2012/11/27/3370853/Untitled-2.fla

stop();

stage.addEventListener(MouseEvent.MOUSE_OVER, playMovie); function playMovie(event) { play(); }
stage.addEventListener(MouseEvent.MOUSE_OUT, stopMovie); function stopMovie(event) { gotoAndStop(0); }


stop();

Thanks


回答1:


EDIT

After looking at your .fla, here is what is missing/misplaced:

  1. Layers in flash don't mean anything other than z-order/depth. You cannot manipulate a layer in code. All your animations are on the same timeline, so they will always play together. If you want an individual item to animate without the others, you'll have to do the animation on it's own timeline (not just it's only layer). You access your symbols own timeline by double clicking it - do your animation in there.

  2. To reference items that are on the stage, you need to give them an instance name. You do that by clicking on the item that's on the stage, then in properties panel, there is field where you can put in an instance name. For the code below to work, you'd need to give them an instance name of "a","b","c","d","e" respectively. This is different than the symbol name in your library (though it can be the same name).


One way you could do this:

var btns:Vector.<MovieClip> = new Vector.<MovieClip>(); //create an array of all your buttons
btns.push(a,b,c,d,e); //add your buttons to the array

for each(var btn:MovieClip in btns){
    btn.addEventListener(MouseEvent.MOUSE_OVER, btnMouseOver);  // listen for mouse over on each of the buttons
    btn.addEventListener(MouseEvent.MOUSE_OUT, btnMouseOut);
}

function btnMouseOver(e:Event):void {
    for each(var btn:MovieClip in btns){ //loop through all your buttons
        if(btn != e.currentTarget){ //if the current one in the loop isn't the one that was clicked
            btn.play();

            try{
                btn.removeEventListener(Event.ENTER_FRAME,moveBackwards); //this will stop the backwards animation if running.  it's in a try block because it will error if not running
            }catch(err:Error){};
        }
    }
}

function btnMouseOut(e:Event):void {
    for each(var btn:MovieClip in btns){ //loop through all your buttons
        if(btn != e.currentTarget){ //if the current one in the loop isn't the one that was clicked
            goBackwards(btn);
        }
    }
}

There is no nice way to play a timeline backwards, but there are ways to do it. One such way:

//a function you can call and pass in the item/timeline you want played backwards
function goBackwards(item:MovieClip):void {
    item.stop(); //make sure the item isn't playing before starting frame handler below
    item.addEventListener(Event.ENTER_FRAME, moveBackwards); //add a frame handler that will run the moveBackwards function once every frame
}

//this function will move something one frame back everytime it's called
function moveBackwards(e:Event):void {
    var m:MovieClip = e.currentTarget as MovieClip; //get the movie clip that fired the event
    if(m.currentFrame > 1){ //check to see if it's already back to the start
        m.prevFrame();  //if not move it one frame back
    }else{
        m.removeEventListener(Event.ENTER_FRAME,moveBackwards); //if it is (at the start), remove the enter frame listener so this function doesn't run anymore
    }
}


来源:https://stackoverflow.com/questions/13592705/how-to-apply-action-to-mulitple-flash-layers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!