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