作者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
推 Angelliya:給他一個stopByFunction的Boolean ? 12/10 17:30
→ Angelliya:紀錄是不是因為這個function停下來的 12/10 17:31
→ etrexetrex:對 問題是不知道怎樣判斷他原本有沒有在動 12/10 17:37
→ Angelliya:喔喔 對耶...= = 12/10 17:45
→ Angelliya:我是都抓currentFrame==1或totalFrames,不是就當在動XD 12/10 17:47
→ etrexetrex:我想的是另外寫一個onEnterFrame 去看兩個時間點的 12/10 17:48
→ etrexetrex:currentFrame 是否相同 不過太冗長 不想寫 12/10 17:49
→ Angelliya:如果元件本身會輪播,我會在裡面下gotoAndPlay("loop") 12/10 17:49
→ etrexetrex:不過話說回來這樣只能停住影格 不能停住onEnterFrame 12/10 17:49
→ etrexetrex:作出的動畫 12/10 17:50
→ Angelliya:避掉currentframe==1或是totalFrames的誤判 12/10 17:50
※ 編輯: etrexetrex 來自: 140.118.9.202 (12/10 18:04)
推 tira0419:兩位大大的討論好熱烈啊...而且確實點出我今天早上測試 12/10 19:46
→ tira0419:時所延伸出來的問題,就是停止可以同時停止,但是一播就 12/10 19:47
→ tira0419:大家一起來... 12/10 19:48
推 cjcat2266:我在 #172GgoE6 有提到怎麼判斷是否一個MC在播放 :) 12/10 20:39
推 tira0419:有神!快拜(舉香) 12/10 20:59
→ etrexetrex:發現bug !! 我改一下 0.0 12/10 21:08
※ 編輯: etrexetrex 來自: 118.168.163.148 (12/10 21:09)
→ etrexetrex:使用方法: stopMC(_root); 12/10 21:16
→ etrexetrex:使用方法: playMC(_root); 12/10 21:17
推 sextitanic:(筆記中) 12/10 21:20
推 tira0419:大大,我成功了@@,超酷的!!!真的是全部都停止,而且播 12/10 21:26
→ tira0419:放的時候又不會全部一起動~該動的會動,不該動的都很乖@@ 12/10 21:27
→ etrexetrex:賀 12/10 21:28
推 cjcat2266:真是難得一見的 熱烈+happy ending 的討論呀 ^^ 12/10 21:29
推 tira0419:剛剛還苦惱到頭有點暈,結果拿舊檔案出來改,一成功整個 12/10 21:35
→ tira0419:人都清醒了起來XD 12/10 21:35
→ etrexetrex:XD 我在作測試檔案 竟然遇到一個問題 12/10 21:43
→ etrexetrex:畫面上有組件就會出bug 12/10 21:43
→ tira0419:怪了...我這邊相當正常耶@@" 12/10 21:44
→ etrexetrex:真可怕 組件只要出現在元件庫 就會掛點了 12/10 21:47
※ 編輯: etrexetrex 來自: 118.168.163.148 (12/10 21:52)
→ etrexetrex:新增了測試檔案 12/10 21:53
→ etrexetrex:誰要來避免一下組件的bug XDDD 12/10 21:53
→ etrexetrex:對了 這個測試檔案只有一層 所以遞迴的部分測不到 12/10 21:55
推 tira0419:所以是我的fla裡面根本沒有組件所以才沒事摟@.@" 12/10 21:55
→ etrexetrex:嗯 12/10 21:56
→ tira0419:這又更深奧了...(遠目) 12/10 22:00
→ etrexetrex:如果有辦法知道某個MC是否為組件 就能除去問題 12/10 22:07
推 cjcat2266:if (mc is fl.core.UIComponent) trace("component"); 12/10 22:16
→ cjcat2266:這是AS3的判斷法,AS2的我記得寫法一樣 12/10 22:16
→ etrexetrex:好像不能 12/10 22:20
→ etrexetrex:if (mc instanceof mx.core.UIComponent) 這樣可以 12/10 22:32
※ 編輯: etrexetrex 來自: 118.168.163.148 (12/10 22:35)