javascript - 如何重置已设置为禁用以重新启动游戏的可拖动对象?

标签 javascript jquery css jquery-ui

使用 Edge Animate。 我有一个带有计时器的游戏。 用户必须在一定时间内拖放n个对象。 如果用户没有时间,我想重置所有内容。 当它们在放置事件中放置在正确的位置时,我禁用可拖动。

ui.draggable.draggable('disable');

但是,当我重置所有元素时,在控制台中我得到了臭名昭著的信息:

**Error: cannot call methods on draggable prior to initialization; attempted to call method 'enable'**

基本上如果我不添加

 sym.$(".set" + set).draggable( "enable" );

然后可拖动对象被禁用。

但是如果我不禁用它们,那么跟踪答案和分数会导致很多问题。

知道如何防止这种情况吗?

是否有一些解决方法或者我重置错误?或者我需要重新

for (j = 0; j < logs1.length; j++) {
  sym.$(logs1[j]).addClass('logs1' + j);
  sym.$('.logs1' + j).draggable({
    zIndex: 1000,
    axis: "y",
    revert: function(obj) {
      if (obj === false) {
        sym.getSymbol("beaver").stop("stop3");
        return true;
      } else {
        return false;
      }
    },
    start: function(event, ui) {
      sym.$("water").show();
      startPos = $(this).offset().top;
      sym.getSymbol("beaver").stop("stop1");
    }
  });
  sym.$('.logs1' + j).droppable({
    drop: function(ui, event) {
      $(this).css({
        'top': startPos
      });
    }
  });
  sym.$(droppable[j]).droppable({
    accept: ".logs1" + j,
    drop: dropEvent
  });
}
K = 0;

function dropEvent(event, ui) {
  $(this).css({'border': '3px solid lime'});
  logDropFX.play();
  ui.draggable.draggable('disable');
  ui.draggable.position({ of: $(this),
    my: 'left top',
    at: 'left top'
  });
  waterRisingLoop.play();
  sym.getSymbol("beaver").stop("stop2");
  K++;
  sym.$("marker").animate({
    'top': 400 - (50 * K)
  }, 1000);
  var markerPos = sym.$("marker").offset().top;
  console.log("marker level: " + markerPos);
  if (markerPos < 250 || K == 5) {
    clearInterval(timer);
    done = false;
    setTimeout(function() {
      sym.$('levelScreen').animate({
        "top": 0,
        'z-index': 99999
      }, 1000);
      sym.$("level").attr('src', 'images/level1Complete.png');
      sym.$(".set1").hide();
      levelUpFX.play();
    }, 2000);
  }
}

重置代码如下。重做可拖动项似乎是多余的。我尝试过使用和不使用,但仍然收到错误消息。

sym.$("startTimer").bind('click', function() {
 .... // some code before
  sym.$(".set" + set).show();
  for (j = 0; j < logs1.length; j++) {
      sym.$(('.logs' + set) + j).draggable();   // draggables
      sym.$(".set" + set).draggable("enable");  // re-enable
  }
  timer = setInterval(function() {
    if (w <= 180 && w > 0) {
      w = w - 3;
      sym.$("timer").css({
        "width": w
      });
      currentPos = (sym.$("water").offset().top) - 4;
      sym.$("water").animate({
        'top': currentPos
      });
    }
  }, 1000);
});

最佳答案

好的。我找到了解决方案。我在放置事件反馈检查中重新启用了可拖动功能。所以现在我有(简化):

function dropEvent(event, ui) {
  ui.draggable.draggable('disable');
  ui.draggable.position({ of: $(this), my: 'left top',   at: 'left top'  });
  ui.draggable.addClass('done');
  K++;  
  if (markerPos < 250 || K == 5) {
    sym.$('.done').draggable('enable');    
  }
}

关于javascript - 如何重置已设置为禁用以重新启动游戏的可拖动对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46697249/

相关文章:

javascript - 这种做法在 JavaScript 中叫什么?

javascript - 如何在循环运行时强制 Jquery/JS 替换变量?

javascript - 如何在 chart.js 中为条形图绘制基线

jquery - 如何在其他列表的属性中复制列表内容?

javascript - 如何在页面加载后 30 执行 javascript 程序

css float 元素不包含在父div中

javascript - JS 轮播 - 未捕获的语法错误 : Unexpected identifier

javascript - 如何使用 D3 从 Bower 安装 D3 到 Angular 项目

css - 使用 CSS 旋转在相对层次结构中悬停不可靠

javascript - 如何使用jquery删除onclick生成的多个div元素