使用JavaScript进行整理检测

时间:2017-07-23 14:19:25

标签: javascript collision-detection

我正在尝试实施碰撞检测算法,但它无法正常工作 我有一个名为sprite的对象数组 物体具有x和y中心点以及半径或宽度和高度属性。 我的函数如果碰撞就从数组中删除对象。 当我运行它时,所有对象都被删除了。 我该如何解决? 我的代码:

function colision() {
  for (var i = 0; i < sprites.length; ++i) {
    for (var j = 0; j < sprites.length; j++) {
      if (i == j) {
        j++
      }
      var spr1 = sprites[i],
        spr2 = sprites[j]

      if (spr1.shape == "circle" && spr2.shape == "circle") {
        if (spr1.r + spr2.r >= Math.sqrt((spr1.x - spr2.x) ** 2 + (spr1.y - spr2.y) ** 2)) {
          spr2.noise.stop();
          sprites.splice(j, 1);
          spr1.noise.stop();
          sprites.splice(i, 1);
          --i
          continue;
        }
      } else if (spr1.shape == "rect" && spr2.shape == "rect") {
        spr2.noise.stop();
        sprites.splice(j, 1)
        spr1.noise.stop();
        sprites.splice(i, 1)
          --i
        continue;
      }
      if (spr1.shape == "circle" && spr2.shape == "rect") {
        var gradient = Math.abs((spr1.y - spr2.y) / ((spr1.x - spr2.x) || 0.00000001))
        var point = {}
        if (spr1.x > spr2.x && spr1.y > spr2.y) {
          point.x = spr1.x - spr1.r / gradient;
          point.y = spr1.y - spr1.r / gradient;
          if (point.x < (spr2.x + spr2.w / 2) && point.y < (spr2.y + spr.h / 2)) {
            spr2.noise.stop();
            sprites.splice(j, 1);
            spr1.noise.stop();
            sprites.splice(i, 1);
            --i;
            continue;
          };
        }
        if (spr1.x < spr2.x && spr1.y > spr2.y) {
          point.x = spr1.x + spr1.r / gradient;
          point.y = spr1.y - spr1.r / gradient;
          if (point.x > (spr2.x - spr2.w / 2) && point.y < (spr2.y + spr.h / 2)) {
            spr2.noise.stop();
            sprites.splice(j, 1);
            spr1.noise.stop();
            sprites.splice(i, 1);
            --i;
            continue;
          };
        } else if (spr1.x < spr2.x && spr1.y < spr2.y) {
          point.x = spr1.x + spr1.r / gradient;
          point.y = spr1.y + spr1.r / gradient;
          if (point.x > (spr2.x - spr.w / 2) && point.y > (spr2.y - spr2.h / 2)) {
            spr2.noise.stop();
            sprites.splice(j, 1);
            spr1.noise.stop();
            sprites.splice(i, 1);
            --i;
            continue;
          };
        } else if (spr1.x > spr2.x && spr1.y < spr2.y) {
          point.x = spr1.x - spr1.r / gradient;
          point.y = spr1.y + spr1.r / gradient;
          if (point.x < (spr2.x + spr.w / 2) && point.y > (spr2.y - spr.h / 2)) {
            spr2.noise.stop();
            sprites.splice(j, 1);
            spr1.noise.stop();
            sprites.splice(i, 1);
            --i;
            continue;
          };
        }
      }
    }
  }
}

0 个答案:

没有答案