基于JavaScript的冲突检测

基于JavaScript的冲突检测,javascript,collision-detection,Javascript,Collision Detection,我正在尝试实现一个碰撞检测算法,但它不起作用 我有一个叫做精灵的对象数组 对象具有x和y中心点以及半径或宽度和高度属性。 如果对象发生碰撞,“我的函数”将从数组中删除对象。 当我运行它时,所有对象都会被删除。 我该如何解决这个问题? 我的代码: 函数colision(){ 对于(变量i=0;ispr2.x&&spr1.y>spr2.y){ 点x=spr1.x-spr1.r/梯度; 点y=spr1.y-spr1.r/梯度; 如果(x点

我正在尝试实现一个碰撞检测算法,但它不起作用 我有一个叫做精灵的对象数组 对象具有x和y中心点以及半径或宽度和高度属性。 如果对象发生碰撞,“我的函数”将从数组中删除对象。 当我运行它时,所有对象都会被删除。 我该如何解决这个问题? 我的代码:

函数colision(){
对于(变量i=0;i=Math.sqrt((spr1.x-spr2.x)**2+(spr1.y-spr2.y)**2)){
spr2.noise.stop();
雪碧.拼接(j,1);
spr1.noise.stop();
sprites.拼接(i,1);
--我
继续;
}
}else if(spr1.shape==“rect”&&spr2.shape==“rect”){
spr2.noise.stop();
精灵.拼接(j,1)
spr1.noise.stop();
精灵.拼接(i,1)
--我
继续;
}
if(spr1.shape==“圆形”和spr2.shape==“矩形”){
var gradient=Math.abs((spr1.y-spr2.y)/(spr1.x-spr2.x)| | 0.00000001))
变量点={}
如果(spr1.x>spr2.x&&spr1.y>spr2.y){
点x=spr1.x-spr1.r/梯度;
点y=spr1.y-spr1.r/梯度;
如果(x点<(spr2.x+spr2.w/2)和y点<(spr2.y+spr.h/2)){
spr2.noise.stop();
雪碧.拼接(j,1);
spr1.noise.stop();
sprites.拼接(i,1);
--一,;
继续;
};
}
if(spr1.xspr2.y){
点x=spr1.x+spr1.r/梯度;
点y=spr1.y-spr1.r/梯度;
如果(点x>(spr2.x-spr2.w/2)和点y<(spr2.y+spr.h/2)){
spr2.noise.stop();
雪碧.拼接(j,1);
spr1.noise.stop();
sprites.拼接(i,1);
--一,;
继续;
};
}else if(spr1.x(spr2.x-spr.w/2)和点y>(spr2.y-spr2.h/2)){
spr2.noise.stop();
雪碧.拼接(j,1);
spr1.noise.stop();
sprites.拼接(i,1);
--一,;
继续;
};
}else if(spr1.x>spr2.x&&spr1.y(spr2.y-spr.h/2)){
spr2.noise.stop();
雪碧.拼接(j,1);
spr1.noise.stop();
sprites.拼接(i,1);
--一,;
继续;
};
}
}
}
}
}

尝试在白纸上追踪逻辑我有,我在编写函数之前就这样做了我刚刚注意到一个错误,我没有检测到两个矩形是否发生碰撞,但这不会影响圆圈OK我对它进行了注释,没有检测到任何东西我已将所有continue语句更改为break以完全脱离j循环,但它仍然没有学习
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;
          };
        }
      }
    }
  }
}