Pull to refresh

Comments 10

Ваше условие неверно:
if ((obj1.x+obj1.width > obj2.width )&&(obj1.x < obj2.x + obj2.width)) XColl=true;
if ((obj1.y+obj1.height > obj2.height )&&(obj1.y < obj2.y + obj2.height)) YColl=true;

Например, попробуйте такой случай:
var obj1 = {x:10, y:10, width:10, height: 10};
var obj2 = {x:0, y:0, width:100, height: 100};

Лучше написать так:
if ((obj1.x + obj1.width >= obj2.x) && (obj1.x <= obj2.x + obj2.width)) XColl = true;
if ((obj1.y + obj1.height >= obj2.y) && (obj1.y <= obj2.y + obj2.height)) YColl = true;
Спасибо исправил! Извиняюсь что заметил не сразу. В моем примере я искал столкновение квадратов, а там я использовал другой принцип нахождения пересечения.

  //…
  var X=X1-X2;
  var Y=Y1-Y2;
  var GIP=WIDTH1+WIDTH2;
  if (X*X + Y*Y <= GIP*GIP)
  {
     return true;
  }
  //…
можно проще, в одну строку

return
((obj1.x + obj1.width >= obj2.x) && (obj1.x <= obj2.x + obj2.width)
&&
((obj1.y + obj1.height >= obj2.y) && (obj1.y <= obj2.y + obj2.height));
Кстати, по теме. Здесь лежит неплохая статья с кучей полезных функций на тему столкновений и прочего :-)
У меня вопрос к автору
Как решается задача про пересечение прямоугольников ( можно проще — кругов ), когда один из них — неподвижен, а второй движется со скоростью, при которой за один такт вычислений он перемещается дальше, чем максимальный его размер ( размер метр на метр, скорость 10 м/такт, например )
Ваш вопрос это шаг к разработке физическому движку проекта. Смысл моей статьи был в том, что не всегда есть необходимость в таких движках. Поэтому в рамках статьи я не могу ответить на ваш вопрос. И если честно, физикой в играх я не занимался и ближайшее время не планирую, т.к. на мой взгляд грех — создавать что то слишком «навороченное» на HTML5.
Самый простой способ — просто разбить вычисления на количество шагов (расстояние / радиус).
Способ быстрый — взять вектор движения каждого угла прямоугольника. Далее — проверить пересечения векторов движения и линий неподвижного прямоугольника. В случае с кругом — взять вектор движения центра круга, получить от него два равноудаленных (на расстояние радиуса) вектора с одинаковой длиной. Затем от неподвижного круга получить отрезок-диаметр круга, направленный перпендикулярно вектору движения первого круга. После точно так же проверяются пересечения линий (только уже не восьми, а трех).
Извиняюсь, если где-то чего-то неправильно написал (и буду рад, если меня поправят), но мне почему-то кажется это именно так :-)
По поводу неподвижности второго объекта — я слегка упростил.
Думаю проще объяснить задачу на примере.

Есть космический корабль, движущийся со скоростью несколько десятков километров в секунду при линейных размерах 10 метров. Также есть астероид, дрейфующий со скоростью несколько метров в секунду.

Задача — проверить, не столкнётся ли корабль с астероидом
Тогда проще взять описанные окружности объектов и проверить сначала их — взять векторы движения по бокам окружностей, продлить их в обе стороны на расстояние радиуса, а затем проверить все векторы на наличие пересечений. Если таковые имеют место быть, рассмотреть ситуацию в месте пересечения (либо между местами пересечения) более подробно, в том числе разбивая вычисления на более мелкие отрезки. Имхо, как-то так.
перемещение некоторых объектов заменяется фогурами. допустим пуля вполне может быть заменена отрезком, в универсальном случае заменяем ориентированным боундинг боксом или цилиндром, который включает в себя начальное и конечное положение объекта. определяются пары объектов которые могли взаимодействовать и время возможного взаимодействия, находим минимальное — это первый шаг симуляции. дальше перерасчитываем скорости провзаимодействовавших объектов и повторяем с момента получения бокса или цилиндра движения. и так до тех пор пока не получим конечную точку симуляции.
но так редко делают в играх для всех объектов, так как миры довольно разрежены и объекты сталкиваются реже чем раз за тик, но попадание пуль/ракет определяется таким образом ибо двигаются они слишком быстро.
Sign up to leave a comment.

Articles