3

タイムアウトに基づいてゲームの停止と復帰を制御することに問題があります。私のコード:

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てゲームに戻ると、倍速のようなものから始まります。関数の2つのインスタンスがplayGame同時に機能しているようです。それが何であるかわかりません、多分私はインターバルを不適切に使用しています。

ありがとうAntonyを編集 しましたが、setIntervalに変更しても問題は解決しませんでした。blockUpとblockDownを1つの関数に変更します。上記のコードを実際の進捗状況に合わせて更新しました。

とに変更clearInterval(timer);timer = null;てみましdelete window.timer;た。それから私はsetIntervalの再起動についてグーグルを始めます、そして私はこれが深刻な問題であることがわかります。私のゲームは多くのjqueryオブジェクトを使用しているので、タイマーの配列を作成したくありません。経済的な解決策を探しています:)

4

1 に答える 1

1

#blockプレイをクリックするたびに新しいクリックハンドラーが登録されるため、ゲームを停止するたびにクリックイベントのバインドを解除する必要があります。

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

ハンドラーを1つずつバインド解除する方法は次のとおりです。

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"
于 2013-03-17T19:20:12.193 に答える