作者etrexetrex (moonet)
看板Flash
标题Re: [问题] 多个影片片段之播放与暂停
时间Thu Dec 10 17:25:39 2009
※ 引述《sextitanic (阿信163)》之铭言:
: ※ 引述《tira0419 (提拉)》之铭言:
: : 恕删一点原文
: : 我需要做一个播放与暂停钮,能停止动画播放,却又在暂停的地方开始播放。
: : 我试了很久,一开始发现STOP跟PLAY只能控制最上层的时间轴,无法暂停影片片段里的
: : 播放。所以後来又开始把第一层的每个影片片段设一个实体名称,然後再用程式码去暂
: : 停这些影片片段的播放。(感觉很土法炼钢...)
: : 程式码如下:(假设10个影片片段的实体名称是aaa bbb ccc ddd eee .........)
: : on (release) {
: : aaa.stop();
: : bbb.stop();
: : ccc.stop();
: : ddd.stop();
: : eee.stop();
: : fff.stop();
: : ggg.stop();
: : hhh.stop();
: : iii.stop();
: : sss.stop();
: : }
: 其实如果是命名成 a1、a2、a3....a11
: 那可以写成
: for(var i=1; i<=11; i++){
: this["a" + i].stop();
: }
: : (恕再删一点原文)我必须每个
: : 都设实体名称,再设定相对应的程式码。这样搞下去程式码就一长串比乡民的30cm还
: : 长了...
: : 然後...我总共有60个flash要改,每个都有一模一样的情况.....= ="
: : 所以来请教各位大大...有没有程式码可以一次控制这麽多层的影片片段
: : 设定我按下暂停钮,这些动画就全部暂停
: : 按下播放钮,就从我刚刚暂停的那个画面开始播放?
: : 恳求各位大大帮忙了>"<
: 如果不想要每一个都设名字的话,倒可以用另一个方法
: typeof
: 嗯.....就是侦测场景上的元件是什麽类型
: 如果是 movieclip 就停止
: 大概范例如下:
: for(var i in _root){ //回圈,会跑在 _root 里面的所有物件,指定给 i
: if(typeof(this[i])=="movieclip"){ // movieclip 就是影片片段
: this[i].stop(); //先把第一层的停下来
: for(var j in this[i]){ //再来就是停 i 影片片段里面的罗
: if(typeof(this[i][j]) == "movieclip"){
: this[i][j].stop();
: }
: }
: }
: }
: 嗯......这个应该是 ok 的,写的还挺丑的啊 XD
写成递回 就能支援到所有层级
function stopMC(MC)
{
MC.stop();
for(var i in MC)
if(typeof(MC[i]) == "movieclip")
stopMC(MC[i]);
}
不过其实等到复原的时候就出包了,因为
function playMC(MC)
{
MC.play();
for(var i in MC)
if(typeof(MC[i]) == "movieclip")
playMC(MC[i]);
}
当初停止全部的MC之前,也许只有少数几个MC会动
但是复原时却是所有MC都在动阿~~~(无解)
有办法判断出某个MC是否正在play吗?
==尝试修改推文中提到的问题
function stopMC(MC)
{
for(var i in MC)
if(typeof(MC[i]) == "movieclip")
stopMC(MC[i]);
//备份资料
MC.onEnterFrameBackup = MC.onEnterFrame;
MC._currentFrameBackup = MC._currentFrame;
MC.onEnterFrame = function()
{
//判断这MC本身会不会动
if(this._currentFrame == this._currentFrameBackup)
this.stopByFunction = false;
else
this.stopByFunction = true;
//马上停掉
this.onEnterFrame = null;
MC.stop();
}
//MC.stop(); 放这里就错了
}
function playMC(MC)
{
for(var i in MC)
if(typeof(MC[i]) == "movieclip")
playMC(MC[i]);
MC.onEnterFrame = MC.onEnterFrameBackup;
if(MC.stopByFunction)
MC.play();
}
测试档案:用滑鼠左键点到球 球就会停下或继续跑
http://cgm.cs.ntust.edu.tw/etrex/stopPlay/stopPlay.html
http://cgm.cs.ntust.edu.tw/etrex/stopPlay/stopPlay.fla
有组件也ok的版本:
http://cgm.cs.ntust.edu.tw/etrex/stopPlay/stopPlay2.html
http://cgm.cs.ntust.edu.tw/etrex/stopPlay/stopPlay2.fla
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.118.9.202
1F:推 Angelliya:给他一个stopByFunction的Boolean ? 12/10 17:30
2F:→ Angelliya:纪录是不是因为这个function停下来的 12/10 17:31
3F:→ etrexetrex:对 问题是不知道怎样判断他原本有没有在动 12/10 17:37
4F:→ Angelliya:喔喔 对耶...= = 12/10 17:45
5F:→ Angelliya:我是都抓currentFrame==1或totalFrames,不是就当在动XD 12/10 17:47
6F:→ etrexetrex:我想的是另外写一个onEnterFrame 去看两个时间点的 12/10 17:48
7F:→ etrexetrex:currentFrame 是否相同 不过太冗长 不想写 12/10 17:49
8F:→ Angelliya:如果元件本身会轮播,我会在里面下gotoAndPlay("loop") 12/10 17:49
9F:→ etrexetrex:不过话说回来这样只能停住影格 不能停住onEnterFrame 12/10 17:49
10F:→ etrexetrex:作出的动画 12/10 17:50
11F:→ Angelliya:避掉currentframe==1或是totalFrames的误判 12/10 17:50
※ 编辑: etrexetrex 来自: 140.118.9.202 (12/10 18:04)
12F:推 tira0419:两位大大的讨论好热烈啊...而且确实点出我今天早上测试 12/10 19:46
13F:→ tira0419:时所延伸出来的问题,就是停止可以同时停止,但是一播就 12/10 19:47
14F:→ tira0419:大家一起来... 12/10 19:48
15F:推 cjcat2266:我在 #172GgoE6 有提到怎麽判断是否一个MC在播放 :) 12/10 20:39
16F:推 tira0419:有神!快拜(举香) 12/10 20:59
17F:→ etrexetrex:发现bug !! 我改一下 0.0 12/10 21:08
※ 编辑: etrexetrex 来自: 118.168.163.148 (12/10 21:09)
18F:→ etrexetrex:使用方法: stopMC(_root); 12/10 21:16
19F:→ etrexetrex:使用方法: playMC(_root); 12/10 21:17
20F:推 sextitanic:(笔记中) 12/10 21:20
21F:推 tira0419:大大,我成功了@@,超酷的!!!真的是全部都停止,而且播 12/10 21:26
22F:→ tira0419:放的时候又不会全部一起动~该动的会动,不该动的都很乖@@ 12/10 21:27
23F:→ etrexetrex:贺 12/10 21:28
24F:推 cjcat2266:真是难得一见的 热烈+happy ending 的讨论呀 ^^ 12/10 21:29
25F:推 tira0419:刚刚还苦恼到头有点晕,结果拿旧档案出来改,一成功整个 12/10 21:35
26F:→ tira0419:人都清醒了起来XD 12/10 21:35
27F:→ etrexetrex:XD 我在作测试档案 竟然遇到一个问题 12/10 21:43
28F:→ etrexetrex:画面上有组件就会出bug 12/10 21:43
29F:→ tira0419:怪了...我这边相当正常耶@@" 12/10 21:44
30F:→ etrexetrex:真可怕 组件只要出现在元件库 就会挂点了 12/10 21:47
※ 编辑: etrexetrex 来自: 118.168.163.148 (12/10 21:52)
31F:→ etrexetrex:新增了测试档案 12/10 21:53
32F:→ etrexetrex:谁要来避免一下组件的bug XDDD 12/10 21:53
33F:→ etrexetrex:对了 这个测试档案只有一层 所以递回的部分测不到 12/10 21:55
34F:推 tira0419:所以是我的fla里面根本没有组件所以才没事搂@.@" 12/10 21:55
35F:→ etrexetrex:嗯 12/10 21:56
36F:→ tira0419:这又更深奥了...(远目) 12/10 22:00
37F:→ etrexetrex:如果有办法知道某个MC是否为组件 就能除去问题 12/10 22:07
38F:推 cjcat2266:if (mc is fl.core.UIComponent) trace("component"); 12/10 22:16
39F:→ cjcat2266:这是AS3的判断法,AS2的我记得写法一样 12/10 22:16
40F:→ etrexetrex:好像不能 12/10 22:20
41F:→ etrexetrex:if (mc instanceof mx.core.UIComponent) 这样可以 12/10 22:32
※ 编辑: etrexetrex 来自: 118.168.163.148 (12/10 22:35)
42F:推 tira0419:建议版主收录@.@" 12/11 11:45
43F:→ aquarianboy:其实是有收了 :) 12/11 11:52
44F:→ GGPlay:拜一下好文! 12/13 13:41