Опубликован: 07.11.2006 | Доступ: свободный | Студентов: 3398 / 338 | Оценка: 3.94 / 3.71 | Длительность: 37:11:00
Лекция 8:

Обнаружение коллизий

Обнаружение коллизий по принципу "фильм-фильм" по расстоянию

Это последний метод обнаружения коллизий, который мы рассмотрим. Он полностью подходит для идеально круглых объектов, хотя можно немного схитрить и применить его к тем объектам, которые имеют более-менее округлую форму.

Ранее мы говорили о том, что если два объекта находятся примерно на одной позиции, можно считать, что они находятся в состоянии столкновения. Иными словами, расстояние между двумя объектами равно нулю. Создадим два круглых фильма и будем вычислять расстояние между ними. Для этого мы применим теорему Пифагора. Теорема гласит, что сумма квадратов двух меньших сторон прямоугольного треугольника равна квадрату большей стороны треугольника. Смотрите.


Я пометил стороны буквами x, y и d. Теорема Пифагора гласит.

x2 + y2 = d2

Т.е.:

x*x + y*y = d*d

Теперь, если провести некоторые элементарные алгебраические преобразования, получим следующее.

d = Math.sqrt (x*x + y*y);

Это значит, что если возвести в квадрат обе стороны, сложить их и затем извлечь квадратный корень, получим длину гипотенузы. Теперь немного изменим наш рисунок, и вам все станет ясно.


На рисунке показано, что dx - это расстояние по оси x между mc1_mc и mc2_mc. dy - это расстояние по оси y, а dist - это среднее расстояние между ними. Зная все это, можно интерпретировать данные выводы следующим образом с помощью обычного кода.

dx = mc2_mc._x-mc1_mc._x;
  dy = mc2_mc._y-mc1_mc._y;
  dist = Math.sqrt (dx*dx+dy*dy);

Это еще одна шпаргалка для вас. Запишите эти выражения, они вам пригодятся.

Ранее я говорил, что когда расстояние между двумя фильмами обращается в ноль, объекты сталкиваются. Однако вспомните последнее упражнение с игрой в пинг-понг, где нужно было учитывать размер шарика. Теперь нам нужно брать в расчет размеры обоих фильмов. В нашем случае на данном этапе расстояние между фильмами в 0 пикселей означало бы полное совмещение центров двух шариков, и только в этом случае было бы зарегистрировано столкновение. Это уж слишком!

В последний раз мы просто брали радиус шарика для определения его состояния столкновения. Здесь мы сделаем то же самое, однако вычислим радиус одного шарика и прибавим к нему радиус другого. Если расстояние между шариками будет меньше, чем эта величина, будет регистрироваться столкновение. Красота этого метода состоит в том, что не имеет значения размер фильмов, так как мы будем определять радиусы динамически.


Приведем код для выяснения того, произошло столкновение или нет.

dx=mc2_mc._x-mc1_mc._x;
  dy=mc2_mc._y-mc1_mc._y;
  dist=Math.sqrt(dx*dx+dy*dy);
  if (dist<mc1_mc._width/2 + mc2_mc._width/2){
    // you have a hit!
  }

То, что будет происходить после обнаружения столкновения - уже другая история. Так и хочется создать файл с некоторым количеством сфер, летающих и сталкивающихся друг с другом. Изучив материал до этого момента, становится понятно, что нужно научиться обращать скорости x или y, а это и будет главным "фокусом". К сожалению, все не так просто. Мы рассмотрим некоторые из таких моментов в следующей лекции. А сейчас просто создадим небольшой файл в качестве примера, чтобы вы сами убедились в реальности применения рассмотренного материала.

Это будет еще одна небольшая игра, что-то наподобие Atari's Asteroids, однако вы можете превратить эту игру во все, что придет вам в голову.

Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

объект созданый мной упорно не желает оставлять след(единственное что добился, так это то что шарик резво гоняется за курсором) функция duplicateMovieClip остаётся не активной, т.е. следа от объекта не остаётся, но если я тоже самый код вбиваю в учебный файл всё работает, не могу понять где я ошибаюсь и почему в документе созданном заново, не работает код начиная от функции duplicateMovieClip?