台灣最大程式設計社群網站
線上人數
1174
 
會員總數:246276
討論主題:189811
歡迎您免費加入會員
討論區列表 >> CSS/HTML5/Bootstarp >> 計算setInterval所剩時間
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
計算setInterval所剩時間
價值 : 100 QP  點閱數:3098 回應數:5
樓主

泡夢
高級專家
7083 19
3445 1067
發送站內信

捐贈 VP 給 白果喵
例如我設定了一個30秒的setInterval
但我會中途以clearInterval停止setInterval的動作
我應怎樣拿到setInterval距離觸發的所剩時間?

本篇文章發表於2006-03-22 11:21
== 簽名檔 ==
長期潛水中…
1樓
回應

Arashi
捐贈 VP 給 Arashi 檢舉此回應
不曉得是不是這個:
音樂的開始, 停止和迴圈
mySound.start([Secondsoffset], loop);
start當中的兩個參數分別為Secondsoffset, Seconds就是秒數而offset就是抵消或取消的意思...所以簡單的說就是取消開始播放,以秒數來計算... 沒有定義的話就是0, 另外一個loop就是迴圈了...
mySound.start(5, 99);
這個意思就是音樂從第5秒開始播放, 並迴圈99次, 這奡ㄗ悀F個例子為mySound.start(0,99);
點擊流覽該檔
mySound.stop();
mySound.stop("tomato"); //如果new Sound沒有定義的話就這樣使用, 不然多個聲音會全部停止
這個很簡單不用解釋了吧...就是停止音樂
我們看到某些網站所使用的一個按鈕控制播放和停止的效果就是使用這些就可以達成了, 如:
mySound = new Sound();
mySound.attachSound("tomato");
mySound.start(0,99); //音樂開始播放並迴圈99次
var music = true; //定義一個變數記錄目前音樂是否是在播放, 因為音樂已經播放所以設定為true
btn.onRelease = function() {
if(music) { //當變數為true時就表示音樂是在播放
mySound.stop(); //使用stop設定音樂停止
music = false; //變數記錄false為音樂停止
} else { //以下的和以上相反
mySound.start(0,99);
music = play;
}
}

setPan 和 setVolume
mySound.setPan(pan);
pan的值是介於 -100 到 100, 用意在於設定喇叭的平衡... -100為只能左邊的喇叭聽到聲音, 100為右邊的, 而0就是平衡點, 兩個喇叭都能聽到聲音
例如:
mySound = new Sound();
mySound.attachSound("tomato");
mySound.start(0, 10);
var speaker = -100; //變數設定為-100, 即是從左邊喇叭開始
mySound.setPan(speaker); //設定喇叭平衡
function pan() { //設定函數並通過setInterval每秒調整平衡
speaker += 20; //每秒平衡偏移20
mySound.setPan(speaker); //設定喇叭的平衡
if(speaker > 100) { //當音樂完全偏移到右邊喇叭播放的時候就停止
mySound.stop();
clearInterval(p);
}
}
var p = setInterval(pan, 1000); //開始每秒執行喇叭平衡
mySound.setVolume(volume);
volume為0 - 100, 0為靜音, 100為最大
mySound = new Sound();
mySound.attachSound("tomato");
mySound.start(0, 99);
var top = key.vol._y; //定義拖動按鈕的最高點
var left = right = key.vol._x; //定義拖動左右的範圍
var bottom = key.vol._y+100; //定義拖動按鈕的最低點
key.vol.onPress = function() {
this.startDrag(true,left,top,right,bottom); //按鈕按下拖動範圍
}
onEnterFrame = function() {
v = int(key.textInput.value.text); //取得輸入框內的值
mySound.setVolume(v); //設定音量
}

Position, Duration 和 暫停
mySound.position();
唯讀指令, 主要是取得目前播放音樂的毫秒數(1秒 = 1000毫秒), 在音樂播放之後才能夠取得, 在一開始start()之後使用是無法取得的
mySound.duration();
唯讀指令, 主要是取得音樂的總毫秒數 要使音樂暫停, 播放的時候再繼續之前暫停的位置開始播放, 我們可以先取得按鈕按下暫停時的position以取得位置, 然後再次按下播放的時候就使用start()當中的SecondsOffset使音樂從暫停的部分開始播放, 如:
mySound = new Sound();
mySound.attachSound("tomato");
var SecondsOffset = 0; //設定SecondsOffset為0
p1.onRelease = function() {
mySound.start(SecondsOffset, 0); //播放按鈕按下開始從0offset播放
}
p2.onRelease = function() {
SecondsOffset = mySound.position/1000; //暫停按鈕按下時記錄目前位置並換成秒數

至於loadSound部分就寫一下進度條的寫法
1. 在場景上建立一個為100%長度的MC(loadBar)
2. 在第一幀使用以下代碼 :
onLoad = function () {
mySound = new Sound();
mySound.loadSound("tomato.mp3"); //載入同一目錄中的MP3
var percent = 0; //%一開始為0
loadBar._xscale = percent; //進度條的寬度比例為percent
};
onEnterFrame = function () {
mySoundBytesTotal = mySound.getBytesTotal(); //取得檔的size
mySoundBytesLoaded = mySound.getBytesLoaded(); //取得目前檔所載入的size
percent = int(mySoundBytesLoaded/mySoundBytesTotal*100); //計算出文件所載入的比例
loadBar._xscale = percent; //設定進度條寬度比例
if (percent>=100) { //當完全載入之後
delete onEnterFrame; //刪除迴圈
mySound.start(); //音樂開始播放
}
};

Q1. 為何loadMovie當中的swf音樂無法播放?
ans: 只要在swf當中把 mySound = new Sound() 換成 mySound = new Sound(this) 就可以了
Q2. 為何不能同時設定兩首音樂不同的音量? ans: 一般你們會這樣使用AS
mySound1 = new Sound();
mySound1.attachSound("tomato1");
mySound1.start();
mySound2 = new Sound();
mySound2.attachSound("tomato2");
mySound2.setVolume(50); //另外一首音量為50
mySound2.start();
但這樣是錯誤的, 正確方法是分別把音樂分開在不同的層當中 :
mySound1 = new Sound(this);
mySound1.attachSound("tomato1");
mySound1.start();
createEmptyMovieClip("mc", 0);
mySound2 = new Sound(mc);
mySound2.attachSound("tomato2");
mySound2.setVolume(50);
mySound2.start();

本篇文章回覆於2006-03-22 23:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

泡夢
捐贈 VP 給 白果喵 檢舉此回應
樓上的我棍您誤會了我的意思了..不過仍感謝您的回答。
setInterval是一個類似計時器一樣...
它會不斷在相隔的一段時間後執行動作...

而我想要的是讀取setInterval距離執行的剩餘時間...
並不是讀取播放音樂的播放時間喔...
本篇文章回覆於2006-03-23 11:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Arashi
捐贈 VP 給 Arashi 檢舉此回應
ㄜ....這種方式我沒玩過...sorry,沒辦法幫助你@@
本篇文章回覆於2006-03-23 16:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
最有價值解答

Bryan(不來ㄣ)
捐贈 VP 給 Bryan(不來ㄣ) 檢舉此回應
純理論,沒實作過

加設一個1秒的setInterval
每次將一變數counter +1

原來的setInterval裡面
要將counter歸0

當clearInterval停止setInterval的動作時,順便停止加設的setInterval
然後去讀counter的值

應該就可以得到你想要的


本篇文章回覆於2006-03-23 17:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

泡夢
捐贈 VP 給 白果喵 檢舉此回應
恩恩...的確是可以的說...
但還是很期待有更簡單的方法...

如果明天為至沒有我認為更好的答案出現的話
我才接受Bryan兄您的答案,好嗎?
本篇文章回覆於2006-03-23 17:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.