Flash as3如何通过鼠标事件停止播放子电影剪辑?
Posted
技术标签:
【中文标题】Flash as3如何通过鼠标事件停止播放子电影剪辑?【英文标题】:Flash as3 how stop playing child movie clips by mouse event? 【发布时间】:2013-08-08 01:04:01 【问题描述】:我在这个论坛帖子How to stop all child movieclips inside a movieclip in AS3?中也有同样的问题
除了我的要求是当用户单击暂停按钮时,当前帧包含影片剪辑子元素应该 gotoAndStop 和 25 帧。
我还使用了计时器功能,因此当用户单击暂停按钮时,计时器应该停止。当我添加以下代码 myTimer.stop();
时,这实际上是有效的,但是如果我单击播放按钮,我会放置一个 myTimer.start();
。问题来自myTimer.start();
函数,它实际上是重新启动计时器,但我需要恢复计时器。
可以帮助我解决这些问题。尽快
【问题讨论】:
你用定时器做什么?并且您想让当前计数不重置? 我正在使用计时器移动到下一个帧 很遗憾,定时器没有pause
/ resume
能力,所以当你停止定时器并重新启动它时,你需要保留一个变量。
你能告诉我怎么做吗?我对 AS3 很陌生
我已经发布了答案。看看能不能用。
【参考方案1】:
你可以使用递归:
function stopAll(parent:DisplayObjectContainer)
for(var i:int = 0; i < parent.numChildren; i++)
var child = parent.getChildAt(i);
if(child.hasOwnProperty('stop'))
child.stop();
if(child.hasOwnProperty('numChildren'))
stopAll(child);
分配给按钮:
yourButton.addEventListener(MouseEvent.CLICK, onClick)
function onClick(e:MouseEvent)
stopAll(youMainMovieClip);
【讨论】:
谢谢,但我应该如何将此函数分配给按钮事件? 嘿,当我尝试这个时,我遇到了以下错误,` 1061:通过静态类型 flash.display:DisplayObject 的引用调用可能未定义的方法 getChild。 1119:通过静态类型 flash.display:DisplayObject 的引用访问可能未定义的属性 numChildren。` ` 仅供参考:我在您的代码运行之前导入以下对象 import flash.utils.Timer;导入 flash.events.TimerEvent;导入 flash.display.Sprite;` 尝试将 DisplayObject 更改为 DisplayObjectContainer 当我尝试你的时候,我得到了这个1061: Call to a possibly undefined method getChild through a reference with static type flash.display:DisplayObjectContainer.
仅供参考:我在函数中将我的电影剪辑定义为 stopAll(MovieClip(root).home)
应该是parent.getChildAt(i)
而不是parent.getChild(i)
【参考方案2】:
要停止所有子动画剪辑,您可以使用您在问题中链接到的答案中提供的代码:
yourButton.addEventListener(MouseEvent.CLICK, onClick);
function onClick(e:MouseEvent):void
stopAllClips(yourMovieClip);
function stopAllClips(mc:MovieClip):void
var n:int = mc.numChildren;
for (var i:int=0;i<n;i++)
var clip:MovieClip = mc.getChildAt(i) as MovieClip;
if (clip && clip.name != 'mc_2')
clip.gotoAndStop(2);
为了“恢复”您的计时器,您需要保留一个变量,以便您可以再次“恢复”。 像这样的:
var tempTimerCount:int = 0;
var timer:Timer = new Timer(1000);
timer.start();
然后当你想停下来的时候:
tempTimerCount += timer.currentCount;
timer.stop();
在开始之后,您想要获得该计时器的值,您需要获取timer.currentCount + tempTimerCount
;
希望对你有帮助。
【讨论】:
谢谢,这很好:)。但是,您对我遇到的其他问题有任何想法吗? (即停止播放子电影剪辑),因为那个仍然不工作。 不走运,我现在遇到以下错误1046: Type was not found or was not a compile-time constant: MoviceClip.
。只是为了确认我将我的电影剪辑定义如下stopAllClips(MovieClip(root).home)
尝试在代码顶部添加import flash.display.MovieClip;
。
您的代码中有“MovieClip” - 它应该是“MovieClip”
我认为它有效,但我错过了解释的重点。因为在 MovieClip(root).home 中有 15 个影片剪辑,其中只有 13 个影片剪辑有子动画影片剪辑,其余的是普通影片剪辑。添加代码后,它会尝试将所有影片剪辑子帧移动到定义的帧。因此,有没有办法中和这 13 个影片剪辑。仅供参考:我已将该影片剪辑的实例名称添加为“mc_2”,这可以帮助我们吗【参考方案3】:
试试这个代码 100% 有效
将此代码放入主时间轴并使用鼠标事件调用 MovieClip_name.stopAllClips();
MovieClip.prototype.stopAllClips = function():void
var mc:MovieClip = this;
var n:int = mc.numChildren;
mc.stop();
for (var i:int=0; i<n; i++)
var clip:MovieClip = mc.getChildAt(i) as MovieClip;
if (clip)
clip.stop();
clip.stopAllClips();
【讨论】:
以上是关于Flash as3如何通过鼠标事件停止播放子电影剪辑?的主要内容,如果未能解决你的问题,请参考以下文章
来人啊。。。。flash as3.0 box2d停止刚体移动问题。