Попробуйте это:
collisionCheck: function(bArray){
for(var i=0,len=bArray.length; i<len; ++i){
for(var j=0,len2=bArray[i].length; j<len2; ++j){
if(!bArray[i][j].getType()) continue;
var x = bArray[i][j].getX(), y = bArray[i][j].getY();
var x2 = x+blockSize, y2 = y+blockSize;
var overlapping = (x2>this.x) && (x<(this.x+this.width)) && (y2>this.y) && (y<(this.y+this.height));
if (overlapping) this.x = 0; // I don't know why you'd do this, but it's what you have
}
}
// Should this function return anything?
}
Чтобы ответить на ваш вопрос о том, почему ваша текущая логика неверна, давайте сосредоточимся на одной проблеме. Ваша логика говорит в основном, что есть столкновение, если:
(YourLeftEdgeIsPastMyLeftEdge AND YourLeftEdgeIsNotPastMyRightEdge)
OR
((Нечто И Нечто) И (Нечто И Нечто))
OR
(Нечто И Нечто)
Средняя линия объясняется тем, что &&
имеет более высокий приоритет , чем ||
, в результате чего две средние строки вашего состояния объединяются.
Глядя на это, мы видим, что столкновение может быть успешным, если проверять только горизонтальное расположение двух предметов, что явно является ошибкой.
В моем ответе логика заключается в том, что два объекта не перекрываются, если:
- A. Правый край одного находится слева от левого края другого, ИЛИ
- B. Левый край одного находится справа от правого края другого, ИЛИ
- C. Нижний край одного находится над верхним краем другого, ИЛИ
- D. Верхний край одного находится ниже нижнего края другого.
Законы Де Моргана говорят, что !(A || B || C || D)
совпадает с (!A && !B && !C && !D)
, и поэтому мы можем сказать, что два объекта do перекрываются, если:
- A. Правый край одного находится к правому от левого края другого, И
- B. Левый край одного находится к левому правого края другого, И
- C. Нижний край одного ниже верхнего края другого, И
- D. Верхний край одного выше нижнего края другого.
И это приводит к коду, который я поставил:
(x2>this.x) && (x<(this.x+this.width)) && (y2>this.y) && (y<(this.y+this.height))