用于colision检测的功能始终返回true

时间:2017-09-06 09:36:00

标签: javascript collision-detection

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

var ul = $("ul.ul-to-fix");

if(ul.find("li").length>{max_possible_rows)){
    if(!ul.hasClass("width-calculated")){
        ul.width(ul.find("li").eq(0).width()*ul.css("columns"));
        ul.addClass("width-calculated");
     }
}

这些值都不是0。该函数将每个对象带到属性: 宽度, 高度, X, 年。 这些都是正数。我检查了每个陈述的操作顺序,它们都很好。

1 个答案:

答案 0 :(得分:1)

您的if语句不正确。请参阅下面的调整算法和基本控制台断言。

基本上你需要检测任何边缘之间是否没有空格。如果没有空间,则表示发生了碰撞。

细分如下:

步骤1。

检查rectangle1的左边缘。

如果rectangle1的左边缘小于rectangle2(x2 + b2)的右边缘,则可能是rectangle1的左边和rectangle2的右边的交点。

第二步。

检查rectangle1的右侧。

如果rectangle1的右侧大于rectangle2的左侧,则rectangle1与rectangle2左侧的rectangle2相交。我们使用&&&&和确保发生碰撞。

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

var collideRect = function (obj1, obj2) {
	var collision = false;

	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;
        // if left edge of rect1 is left of the left edge of rect2 plus its 
        // width AND left edge of rect1 plus rect1's width is greater than 
        // the left edge of rect2, we have an x-coordinate collision.
        // if either set of conditions is false, the rects don't overlap.
	if (x1 < x2 + b2 && x1 + b1 > x2) {
		xCollide = true;
	}
    // same as the x check but on the y plane
	if (y1 < y2 + h2 && h1 + y1 > y2) {
		yCollide = true;
	}

	if (xCollide && yCollide) {
		console.log(JSON.stringify(obj1) + ".   " + JSON.stringify(obj2));
		collision = true;
	}
	return collision;
}

// test
var rect1 = {
	x: 5,
	y: 5,
	breadth: 50,
	height: 50
};
var rect2 = {
	x: 20,
	y: 10,
	breadth: 10,
	height: 10
};

console.assert(collideRect(rect1, rect2) === true); // collision

var rect3 = {
	x: 55,
	y: 55,
	breadth: 50,
	height: 50
};
var rect4 = {
	x: 20,
	y: 10,
	breadth: 10,
	height: 10
};

console.assert(collideRect(rect3, rect4) === false); // no collision