2013-07-01 56 views
1

我是Flash的新手,我在AS3Flash CS4中为Adobe Air创建教育应用程序。我想使用按钮播放和暂停所有内容(movieclips AND sound)。如何在Flash CS4中使用AS3播放/暂停所有Adobe Air应用程序

我已经创建playpause按钮,工作切换020之间的帧速率,不幸的是我已经意识到这是从来没有真正0 fps,而是0.01 fps,因此它继续播放,虽然非常非常缓慢。这也不会影响音频;我已将声音文件设置为Stream,它们的时间线上会同步到movieclips,但即使将应用程序设置为0 fps,音频也会继续。

因为我有很多movieclips各有同步音频,我希望能够做的就是用一个按钮暂停每个movieclip中的所有内容,并且能够使用另一个按钮从同一地点恢复按钮。这可能吗?如果没有,是否有全局功能pause/resume整个application/program

回答

0

将帧率设置为0不会停止所有影片剪辑。 要做到这一点的唯一方法是停止每个单独的动画片段和声音。做到这一点的方法之一是使用自定义事件系统:

首先,派遣时,启动/停止按键(从舞台调度自定义事件,以方便入店(声音的时间轴上。 。停止影片剪辑将藏汉停止如果从脚本(的SoundChannel)播放声音,那么你应该藏汉阻止他们

btnStop.addEventListener(MouseEvent.CLICK, onClick_stop); 
function onClick_stop(e:MouseEvent):void { 
    stage.dispatchEvent(new Event("STOP_EVERYTHING")); 
} 

btnStart.addEventListener(MouseEvent.CLICK, onClick_start); 
function onClick_start(e:MouseEvent):void { 
    stage.dispatchEvent(new Event("START_EVERYTHING")); 
} 

然后,每个影片剪辑要停止,听事件:

stage.addEventListener("START_EVERYTHING", onStart_everything); 
function onStart_everything(e:Event):void { 
    //play this movieclip 
    play(); 
} 

stage.addEventListener("STOP_EVERYTHING", onStop_everything); 
function onStop_everything(e:Event):void { 
    //stop this movieclip 
    stop(); 
} 
2

将监听器添加到所有你的影片剪辑实例是采用递归暂停和恢复一个MovieClip及其所有儿童(和孩子的孩子,等等):

/** 
* Recursively pause a display object and all contained display objects 
* @param clip  
* @param rewind whether to go to the first frame 
*/ 
public function recursivePause(clip:DisplayObject, rewind:Boolean = false):void 
{ 
    if (clip is MovieClip) 
    { 
     if (rewind) 
     { 
      (clip as MovieClip).gotoAndStop(1); 
     } 
     else 
     { 
      (clip as MovieClip).stop(); 
     } 
    } 

    if (clip is DisplayObjectContainer) 
    { 
     for (var i:uint = 0; i < (clip as DisplayObjectContainer).numChildren; i++) 
     { 
      recursivePause((clip as DisplayObjectContainer).getChildAt(i), rewind); 
     } 
    } 
} 

/** 
* Recursively play a display object and all contained display objects 
* @param clip 
* @param rewind whether to go to the first frame 
*/ 
public function recursivePlay(clip:DisplayObject, rewind:Boolean = false):void 
{ 
    if (clip is MovieClip) 
    { 
     if (rewind) 
     { 
      (clip as MovieClip).gotoAndPlay(1); 
     } 
     else 
     { 
      (clip as MovieClip).play(); 
     } 
    } 

    if (clip is DisplayObjectContainer) 
    { 
     for (var i:uint = 0; i < (clip as DisplayObjectContainer).numChildren; i++) 
     { 
      recursivePlay((clip as DisplayObjectContainer).getChildAt(i), rewind); 
     } 
    } 
} 

用法:recursivePause(stage)recursivePause(myMainMovieClip)

这略高于更方便事件方法,因为如果/当您将新的MovieClip添加到混合中时,它将“开箱即用”。

0

我的解决方案

private var pausedArr:Array = []; 

// recursive function to store all MovieClip children and their currentFrame values 
public function pause(mc:*, rootObj:Boolean = false):void 
{ 
    if (!mc is MovieClip) return; 

    if (rootObj) { 
     pausedArr = []; 
     mc.addEventListener(Event.ENTER_FRAME, stepOneFrame); 
    } 

    pausedArr.push({ mc:mc, frame:mc.currentFrame, paused: false }); 

    if (mc.numChildren > 0) { 
     for (var i:int = mc.numChildren - 1; i >= 0; i--) { 
      if (mc.getChildAt(i) is MovieClip) pause(mc.getChildAt(i)); 
     } 
    } 
} 

// resume only paused MovieClips 
public function resume():void 
{ 
    for (var i:int = 0; i < pausedArr.length; i++) { 
     if (pausedArr[i].mc && pausedArr[i].paused) pausedArr[i].mc.play(); 
    } 

    pausedArr = []; 
} 

// see if MovieClips' frame changed, this is to avoid resuming stopped MovieClips before pause 
private function stepOneFrame(e:Event):void 
{ 
    pausedArr[0].removeEventListener(Event.ENTER_FRAME, stepOneFrame); 
    for (var i:int = 0; i < pausedArr.length; i++) { 
     if (pausedArr[i].mc.currentFrame != pausedArr[i].frame) { 
      pausedArr[i].mc.stop(); 
      pausedArr[i].paused = true; 
     } 
    } 
} 

使用com.reintroducing.sound.SoundManager播放/暂停声音。 使用com.greensock.TweenMax定时器和补间,它可以暂停/恢复两者。

相关问题