javascript - 单击 Canvas 中的对象时出现奇怪的错误?

标签 javascript html canvas

我的脚本中出现了一个奇怪的错误。我在 Canvas 上有 3 个球,我可以点击其中的任何一个来选择。

如果我在选择一个球后单击另一个球,则会选择新球。每次选择一个新球时,所选球的数组都会重置。到目前为止一切顺利。

我想做的是在单击 Canvas 内的空白区域时重置所选球的数组。

但这只适用于 1 个球(底部的球,数组中的索引 #2)。 但是,如果我打开警报以查看点击了哪个球,则所有球都会记录点击。 由于弹出警报窗口并且脚本卡住,我可以看到其他球也被短暂选中。

我做了this jsFiddle给你看。当你第一次加载 fiddle 时,错误的代码被注释掉了,取消注释它会看到它。

要查找的代码段是:

function selectBall(){
var mX = mouseX;
var mY = mouseY;
    for(i=0;i<balls.length;i++){
        if(balls[i].select(mX, mY)){
            ball.length = 0;
            ball.push(balls[i]);

            /* Uncomment this to see that click actually happens.
            alert('Ball ' + i + ' clicked');
            */

        }

        /* Uncomment this to get the bug.
        else {
            ball.length = 0;                    
        }
       */
    }
}

当同一行代码在 if 语句中重置数组时,为什么我会得到这个错误,但在 else 语句中却没有?

我该如何解决?

最佳答案

您正在为每个未点击的球放置球列表。这是不正确的。如果没有点击任何球,您要做的只是重置球列表。这可以通过以下方式解决。

function selectBall(){
  var mX = mouseX;
  var mY = mouseY;
  var isClick = false;
  for(i=0;i<balls.length;i++){
    if(balls[i].select(mX, mY)){
        isClick = true;
        ball.length = 0;
        ball.push(balls[i]);
        break;
    }
  }
  if (!isClick)
  { 
    ball.length = 0;
  }
}

您可以看到我添加了一个简单的标志来确定是否选择了任何球。如果没有,那么我将重置阵列。否则,我不会重置阵列。

关于javascript - 单击 Canvas 中的对象时出现奇怪的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9949183/

相关文章:

javascript - CreateJS:无法使补间工作

javascript - html Canvas 中的关键灵敏度

javascript - 将按高排序和低排序结合到一个函数中进行 react

javascript - localStorage - 获取 key 容器名称

javascript - 有没有一种简单的方法可以使用 API 数据更新 CSV?

html - 为什么 flex 元素不缩小过去的内容大小?

JavaScript 表单验证错误

html - 无法修复响应式修复的两侧 div

html - 标签分为两行时的垂直对齐标签和复选框

javascript - 如何判断在Canvas中未成形的对象内部被点击?