8

私のゲームでは、単語が入力されたグリッドがあります。単語を綴るには、ユーザーは「ドラッグ」と呼ばれる側面の文字をクリックする必要があります。文字をクリックすると、アニメーションでグリッド上の位置に移動します。

私が抱えている問題は、ユーザーが文字をすばやくクリックできるため、プログラムがクラッシュすることです。これを解決するには、アニメーションが完了するまでクリック イベントを無効にします。

過去にsetTimeOut関数を使用したことがありますが、タイミングはすべてブラウザの速度に依存するため、信頼できる方法ではありません。

クリックイベントは次のとおりです。

$('.drag').on('click', function (e) {
    e.preventDefault();
    var target = $('.highlight-problem .drop-box:not(.occupied):first');
    var targetPos = target.parents('td').position();
    console.log(targetPos);
    var currentPos = $(this).offset();
    var b = $(this);
    if (target.length) {
        target.addClass("occupied");
        $(".occupied").parent(".flip-wrapper").addClass("flipped");
        var clonedObject = b.clone()
        if (b.data("letter") == target.parents('td').data("letter")) {
            clonedObject.addClass("right-letter");
            target.addClass('right-letter');
            setTimeout(function () {
                hitSound.play();
            }, 550);
        } else {
            clonedObject.addClass("wrong-letter");
            target.addClass('wrong-letter');
            setTimeout(function () {
                missSound.play();
            }, 550);
        }
        clonedObject.appendTo("table").css({
            position: "absolute",
            top: currentPos.top,
            left: currentPos.left
        }).stop().animate({
            top: targetPos.top,
            left: targetPos.left
        }, "slow", function () {
            $(this).prop('disabled', false).css({
                top: 0,
                left: 0
            }).appendTo(target);
            var spellWord = $('.highlight-problem .drop-box');
            if (!spellWord.filter(':not(.occupied)').length) {
                var wordIsCorrect = 0;
                spellWord.each(function () {
                    if ($(this).parents('td').data("letter") == $(this).find("div").data("letter")) {
                        console.log('letter is: ' + $(this).find("div").data("letter"))
                        wordIsCorrect++;
                    }
                });
4

2 に答える 2

8

あなたは簡単な3つのステップでそれを行うことができます。

  1. と呼ばれるグローバル変数を宣言し、animationCompleteに設定しfalseます。

    var animationComplete = false;
    
  2. .animate({...});関数で、アニメーションの完了後に値を切り替えます。

    .animate({
        top: targetPos.top,
        left: targetPos.left
    }, "slow", function () {
        ...
        animationComplete = true;
    });
    
  3. グローバル変数を使用して完全性を確認します。

    if (animationComplete)
    {
        // Do something!
    }
    

完全なコード

JavaScript

animationComplete = true;
$(document).ready(function(){
    animationComplete = false;
    $(".background").animate({
        height: 50,
        width: 50
    }, 10000, function(){
        animationComplete = true;
    });
    $("button").click(function(){
        if (animationComplete)
            $(".background").animate({
                height: 200,
                width: 200
            }, 10000, function(){
                animationComplete = false;
            });
        else
            alert("Please wait till the animation is complete!");
    });
});

HTML

<div class="background"></div>
<button>Click me!</button>​

CSS

.background {background: red;}

フィドル: http: //jsfiddle.net/KAryP/

ここであなたのコードをいじってください:http://jsfiddle.net/smilburn/Dxxmh/94/

于 2012-11-06T09:17:50.297 に答える
1

コードatmをテストすることはできませんが、要素がクリック関数内でアニメーション化されていないかどうかを確認する必要があります

if(!$('selector:animated')){


}
于 2012-11-06T09:18:25.557 に答える