Nick
Nick

Reputation: 1277

Dispatch event on every frame for MovieClip

I have a Movie Clip, and I need to stop the movie when it's reaches a certain frame. To do this, I need to add an event listener that will dispatch when that specific movie clip enters a new frame (as opposed to the whole animation ENTER_FRAME).

bar.addEventListener(Event.ENTER_FRAME, function(e:Event) {
    var b:MovieClip = MovieClip(e.currentTarget);
    if(b.currentFrame == mp.getPopularity())
        b.stop();
});

Any ideas?

Thanks.

Upvotes: 1

Views: 910

Answers (2)

scriptocalypse
scriptocalypse

Reputation: 4962

You should remove the event listener when it's no longer needed, otherwise you risk memory leaks. An anonymous function can make this difficult, though you might be able to do it with arguments.callee.

bar.addEventListener(Event.ENTER_FRAME, function(e:Event) {
    var b:MovieClip = MovieClip(e.currentTarget);
    if(b.currentFrame == mp.getPopularity()){
        b.stop();
        b.removeEventListener(e.type, arguments.callee); 
            // ^^ this may work to remove your anonymous listener.
    }
});

There's another way to go about this, though. Does mp.getPopularity() change frequently? If it does not change after bar is told to play() then you could use addFrameScript. Just remember that addFrameScript is 0-indexed, so adding a script to frame 1 means you have to pass 0... so if an action is to happen on mp.getPopularity() then you'll have to pass mp.getPopularity() - 1.

var framescript:Function = function():void{
  bar.stop();
  bar.addFrameScript(bar.currentFrame-1, null); 
         // ^^ nulling the framescript after 
         // ^^ it is no longer needed.
}

bar.stop();  // Generally a good idea to call stop before calling addFrameScript

bar.addFrameScript(mp.getPopularity() - 1, framescript);

bar.gotoAndPlay(1); // or wherever it needs to start from.

This is a more precise solution, but you do have to remember to clean up your framescript after you're done, if you plan to use this same bar instance later with a different mp.getPopularity() value.

Upvotes: 1

Marty
Marty

Reputation: 39466

Try this;

A simple function:

function playUntil(target:MovieClip, frame:int):void
{
    target.stopFrame = frame; // Works because MovieClip is dynamic.
    target.addEventListener(Event.ENTER_FRAME, _checkFrame);
}

With the listening function:

function _checkFrame(e:Event):void
{
    var m:MovieClip = e.target as MovieClip;

    if(m.currentFrame == m.stopFrame)
    {
        m.stop();
        m.removeEventListener(Event.ENTER_FRAME, _checkFrame);
    }
}

Apply it to all your instances:

playUntil(instance1, 15);
playUntil(instance2, 27);
playUntil(instance3, 113);

Upvotes: 1

Related Questions