Нужна помощь с простым алгоритмом обнаружения столкновений - PullRequest
1 голос
/ 23 января 2011

Хорошо, мой простой алгоритм обнаружения столкновений не работает.Он всегда активируется (если только у игрока нет столкновений на его равнинах x и / или y).

Хорошо, вот код:

collisionCheck: function(bArray){
    for(var i = 0; i < bArray.length; i++){
        for(var j = 0; j < bArray[i].length; j++){
            if(bArray[i][j].getType() != 0){
                if((bArray[i][j].getX() > this.x && bArray[i][j].getX() < this.x + this.width) ||
                    (bArray[i][j].getX() + blockSize > this.x && bArray[i][j].getX() + blockSize < this.x + this.width) &&
                    (bArray[i][j].getY() > this.y && bArray[i][j].getY() < this.y + this.height) || 
                    (bArray[i][j].getY() + blockSize > this.y && bArray[i][j].getY() + blockSize < this.y + this.height)){
                    this.x = 0;
                }
            }
        }
    }
}

Узнайте, почемуактивировать, когда это не должно?

Ответы [ 2 ]

2 голосов
/ 23 января 2011

Попробуйте это:

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))

0 голосов
/ 23 января 2011
function spritecollision(x1,y1,w1,h1,x2,y2,w2,h2){
    if(x2<(x1+w1)&&(x2+w2)>x1&&y2<(y1+h1)&&(y2+h2)>y1)return 1;
}

Итак, если вы хотите, чтобы он всегда активировал ИСКЛЮЧИТЬ во время столкновения, используйте !spritecollision.

Источник: http://nextgengame.webs.com/fun.htm

РЕДАКТИРОВАТЬ: Это лучший ответ. Это прекрасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...