Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于冲突检测的函数始终返回true_Javascript_Collision Detection - Fatal编程技术网

Javascript 用于冲突检测的函数始终返回true

Javascript 用于冲突检测的函数始终返回true,javascript,collision-detection,Javascript,Collision Detection,我可能遗漏了一些非常简单的东西,但我不明白为什么这个函数总是返回true并记录这两个对象,即使它们彼此不靠近。 我的代码: var collideRect=function(obj1, obj2){ var x1=obj1.x,y1=obj1.y,x2=obj2.x, y2=obj2.y; var b1=obj1.breadth,h1=obj1.height; var b2=obj2.breadth,h2=obj2.height; var xCollide, yColli

我可能遗漏了一些非常简单的东西,但我不明白为什么这个函数总是返回true并记录这两个对象,即使它们彼此不靠近。 我的代码:

var collideRect=function(obj1, obj2){
   var x1=obj1.x,y1=obj1.y,x2=obj2.x, y2=obj2.y;
   var b1=obj1.breadth,h1=obj1.height;
   var b2=obj2.breadth,h2=obj2.height;
   var xCollide, yCollide;
// determine if the x values are closer than half the breadth of each rectangle to each other
   if(x1+b1/2>x2-b2/2||x1-b1/2<x2+b2/2){xCollide=true};
// determine if the y values are closer than half their heights from one another 
   if(y1+h1/2>y2-h2/2||y1-h1/2<y2+h2/2){yCollide=true};
   if(xCollide&&yCollide){
    console.log(JSON.stringify(obj1)+".   "+JSON.stringify(obj2)) ;
    return true;
   }; 
}
var collideRect=函数(obj1、obj2){
变量x1=obj1.x,y1=obj1.y,x2=obj2.x,y2=obj2.y;
变量b1=obj1.宽度,h1=obj1.高度;
变量b2=obj2.宽度,h2=obj2.高度;
变量xCollide,yCollide;
//确定x值之间的距离是否小于每个矩形宽度的一半

if(x1+b1/2>x2-b2/2 | | x1-b1/2y2-h2/2 | | y1-h1/2您的if语句不正确。有关调整后的算法和基本控制台断言,请参阅下文

基本上,你需要检测任何边之间是否没有空间。如果没有空间,你就知道发生了碰撞

细分如下:

第一步

检查矩形1的左边缘

如果矩形1的左边缘小于矩形2的右边缘(x2+b2),则矩形1的左侧和矩形2的右侧可能存在交点

第二步

检查矩形1的右侧

如果矩形1的右侧大于矩形2的左侧,则矩形1在矩形2的左侧与矩形2相交。我们使用&&检测这两种情况,以确保发生碰撞

我们对两个矩形的y坐标进行完全相同的检查,以检测矩形是否在y平面上相交

var collideRect=函数(obj1、obj2){
var冲突=假;
var x1=obj1.x,
y1=obj1.y,
x2=obj2.x,
y2=obj2.y;
var b1=obj1.1宽度,
h1=obj1.1高度;
var b2=obj2.1宽度,
h2=obj2.1高度;
var xCollide,
乙酰胺;
//如果rect1的左边缘是rect2的左边缘加上它的
//rect1的宽度和左边缘加上rect1的宽度大于
//在rect2的左边,我们有一个x坐标碰撞。
//如果任一条件集为false,则矩形不会重叠。
如果(x1x2){
xCollide=true;
}
//与x检查相同,但在y平面上
如果(y1y2){
yCollide=true;
}
if(xCollide&&yCollide){
log(JSON.stringify(obj1)+“+JSON.stringify(obj2));
碰撞=真;
}
返回碰撞;
}
//试验
变量rect1={
x:5,
y:5,
宽度:50,
身高:50
};
变量rect2={
x:20,
y:10,
宽度:10,
身高:10
};
断言(CollizeRect(rect1,rect2)==true);//冲突
变量rect3={
x:55,
y:55,
宽度:50,
身高:50
};
变量rect4={
x:20,
y:10,
宽度:10,
身高:10
};

assert(collideRect(rect3,rect4)==false);//无冲突
此问题太不清楚且无法验证。请参阅:为了帮助尝试解决问题,可能是那些if语句。还记得数学中的PEMDAS/BODMAS吗?例如,在if语句中,x1+b1/2将执行b1/2+x1,因为没有括号。除法在加法之前。运算顺序是fineDeckerz,我相信我已经发布了所有需要的信息,如果您需要更多信息,请详细说明,我会发布it@user7951676我们无法从您发布的内容中猜出我们需要什么。您的问题不清楚,您要求我们猜您的问题是什么。可能是您试图除以零,可能是操作顺序,也可能是t你所使用的OR语句总是计算为真,因为你说如果(条件1大于条件2或条件1小于条件2,xcollide=true。请选择。如果矩形大小相等,您能解释为什么这样做吗?我理解,但是为什么它适用于不同大小的矩形。检查坐标位置并使用每个矩形的宽度和高度作为偏移。如果ese数字集相交(位于同一范围内)它检测到碰撞。我会用更好的解释更新答案。谢谢,我现在理解得更清楚了,出于兴趣,是否有许多其他基本算法用于检测其他形状或不同角度形状之间的合并?是的,您使用的方法称为轴对齐边界框。还有圆碰撞和这是分离轴定理。看看一些基础知识。你也可以通过使用逐位数学对像素进行XORing来进行基于精灵的碰撞,尽管只对灰度有用。对不起,我刚刚得到的结果是错误的:{“x”:35,“y”:38.39000000000001,“vx”:0,“vy”:-0.6599999999997,“ay”:0.005,“高度”:10,“宽度”:10,“生命”:1,“目标”:“向上”}{“x”:35.799999909,“y”:86,“宽度”:15,“高度”:10,“生命”:1,“id:“enemy139”},canvas.js:32 collideRect()