4
votes

I am trying to make a button in Flash that pauses all of the movie clips that are running in my file. None of these movie clips are tweens in my main timeline, they all have their own individual timeline. Each move clip is triggered by a button that tells the clips to start playing. So, if anyone could help me create this pause button, I would greatly appreciate it. Thank you for your time.

4
Read this firststrah

4 Answers

3
votes

Export your all symbols that you want to be paused/resumed recursively with a base class like this one, then you don't have to walk the entire display tree:

package com.stackoverflow
{
import flash.display.MovieClip;
import flash.events.Event;

[Event(name="clipAdded", type="flash.events.Event")]
[Event(name="clipRemoved", type="flash.events.Event")]
public class BaseClip extends MovieClip
{
    protected var baseClipChildren:Array;
    protected var paused:Boolean = true;

    public function BaseClip()
    {
        super();
        baseClipChildren = new Array();
        addEventListener(Event.ADDED_TO_STAGE, onAdded);
        addEventListener("clipAdded", onClipAdded);
        addEventListener(Event.REMOVED_FROM_STAGE, onRemoved);
        addEventListener("clipRemoved", onClipRemoved);
    }

    protected function onAdded(event:Event):void
    {
        var target:BaseClip = event.target as BaseClip;
        if(target == this) {
            dispatchEvent(new Event("clipAdded", true));
        }
    }

    protected function onClipAdded(event:Event):void
    {
        var target:BaseClip = event.target as BaseClip;
        if(target && target != this) {
            event.stopImmediatePropagation();
            baseClipChildren.push(target);
        }
    }

    protected function onRemoved(event:Event):void
    {
        var target:BaseClip = event.target as BaseClip;
        if(target == this) {
            dispatchEvent(new Event("clipRemoved", true));
        }
    }

    protected function onClipRemoved(event:Event):void
    {
        var target:BaseClip = event.target as BaseClip;
        if(target && target != this) {
            event.stopImmediatePropagation();
            baseClipChildren.splice(baseClipChildren.indexOf(target),1);
        }
    }

    public function stopAll():void {
        stop();
        for each(var clip:BaseClip in baseClipChildren) {
            clip.stopAll();
        }
    }

    public function playAll():void {
        play();
        for each(var clip:BaseClip in baseClipChildren) {
            clip.playAll();
        }
    }
}
}
2
votes

The following should do the trick:

// create an array to store all playing movieclips 
var playing = [];

// when a movieclip is played add it to the array like this:
// playing.push(myMovieClip);

// call this from your pause button's click handler
function pauseAll() 
{
    // loop through all the playing movieclips ...
    for (var i = 0; i < playing.length; i ++)
    {
        // ... and stop them
        playing[i].stop();
    }

    // now clear the array
    playing = [];
}
0
votes

There isn't a built-in way that I know of to pause all movie clips.

If you kept a reference to movie clips that you want to pause in a globally accesible object, you could iterate through those references calling pause.

0
votes

This function will stop all nested movieClips of an object. Just pass in your stage or top-level display class to stop/play everything. This way you don't have to keep track of adding things to an array and there's no overhead.

function recursiveStop(parentClip:DisplayObjectContainer, useStop:Boolean = true, gotoFrame:Object = null):void {
    var tmpClip:MovieClip = parentClip as MovieClip;
    if (tmpClip) {
        if (useStop) {
            (gotoFrame != null) ? tmpClip.gotoAndStop(gotoFrame) : tmpClip.stop();
        }else {
            (gotoFrame != null) ? tmpClip.gotoAndPlay(gotoFrame) : tmpClip.play();
        }
    }

    var i:int = parentClip.numChildren;
    while(i--){
        if(parentClip.getChildAt(i) is DisplayObjectContainer){
            recursiveStop(parentClip.getChildAt(i) as DisplayObjectContainer, useStop, gotoFrame);
        }
    }
}