2013-03-17 71 views
2

我在控制停止並根據超時返回遊戲時遇到問題。我的代碼:使用間隔停止和恢復(或只是重新啓動)

var state = true, timer; 

function block(isOn) { 
    if (isOn) { 
     $('#block').click(function() { 
      $(this).fadeOut(1200, function() { 
       state = true; 
       timer = setInterval(playGame, 500); 
      }); 
     }); 
    } else { 
     clearInterval(timer); 
     $('#block').fadeIn(1200, function() { 
      block(true); 
     }); 
    } 
} 

function playGame() { 
    if (state) { 
     (repeated game instructions) 
    } else { 
     block(false); 
    } 
} 

$(document).ready(function() { 
    block(true); 
    $('#refresh').click(function() { 
     state = false; 
    }); 
}); 

塊就像我的起始頁和中斷頁面。遊戲從true上的塊設置開始,點擊遊戲以間隔開始。但是,點擊#stop遊戲停止狀態改變,我想通過clearInterval重置定時器。然後我再次顯示block(true)。它可以工作,但是當玩家再次點擊#block返回遊戲時,它會以雙倍速度開始。看起來有兩個playGame函數同時工作的實例。我不知道它是什麼,也許我不適當地使用間隔。

編輯 謝謝安東尼,但改爲setInterval沒有解決我的問題。我將blockUp和blockDown更改爲一個函數。我已經更新了上面的代碼到我的實際進度。

我試過改變clearInterval(timer);timer = null;delete window.timer;。然後,我開始谷歌重新啓動setInterval,我看到這是嚴重的問題。我的遊戲使用了很多jquery對象,所以我不想創建一組定時器,我正在尋找經濟的解決方案:)

+0

它看起來像你應該使用'setInterval',而不是'setTimout'。如果'state == true','playGame()'每500ms調用一次。當state == false時,使用'clearInterval'似乎更容易。 – Antony 2013-03-17 13:40:28

回答

1

您必須從每次停止遊戲時因爲新的點擊而解除從#block開始的點擊事件處理程序會在您每次點擊播放時註冊。

$('#refresh').click(function() { 
    state = false; 
    $('#block').off('click'); // flushes every click bound to `#block` 
}); 

這裏是如何解除綁定處理程序逐一:

var handler1, handler2; 
$('#block').click(handler1 = function() { alert(1); }); 
$('#block').click(handler2 = function() { alert(2); }); 
// one click shows "1" then "2" 
$('#block').off('click', handler1); 
// one click shows "2" 
+0

哦......謝謝你,先生!我無法相信這個解決方案如此合乎邏輯。 – factoradic 2013-03-17 19:34:15

+0

@factoradic有關詳細信息,請參閱更新的答案。 – leaf 2013-03-17 19:38:24

+0

非常感謝,真的。它將近20個小時停止了我的工作。我沒有料到這麼詳細的回答:) – factoradic 2013-03-17 19:45:26