Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ActionScript 2.0 ЛР.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.88 Mб
Скачать

Трассировка растровых рисунков

Для того, чтобы точно учесть форму островов, необходимо преобразовать растровый (точечный) рисунок в векторный, то есть выполнить трассировку. При этом программа выделяет области одинакового (или близкого) цвета и превращает их в векторные заливки.

  1. Перейдите двойным щелчком в режим редактирования клипа map. Выберите команду меню ModifyBitmapTrace Bitmap... и преобразуйте рисунок в векторную форму при следующих параметрах:

Параметры означают следующее:

  • Color Threshold (цветовой порог, от 1 до 500) — предельная разница в цвете, когда цвет пикселей считается одинаковым; если уменьшать этот параметр, рисунок становится точнее, но занимает больше места в памяти;

  • Minimum Areaминимальная область, от 1 до 1000 пикселей, которая используется при выборе цвета пикселя;

  • Curve Fit (соответствие кривых) — определяет, насколько гладкими будут границы заливок; самый точный вариант — Pixels (с точностью до пикселя);

  • Corner Threshold — определяет, будут ли сглаживаться острые углы; возможные значения: Many Corners (много углов), Normal (что-то среднее) и Few corners (мало углов).

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

Точки вдоль границы

Сейчас проверка выполняется только для одной точки — центра круга. Поэтому точка может немного «залезать» на сушу. Чтобы исправить ситуацию, мы будем проверять 8 точек, равномерно распределенных по границе круга:

На рисунке в скобках для каждой точки указаны ее координаты относительно центра (смещения dx и dy). Учитывается, что на экране ось Y направлена вниз.

Для того, чтобы можно использовать цикл для перебора точек, их смещения предварительно записаны в два массива. Радиус круга r определяется как половина ширины клипа.

  1. Добавьте в обработчик load два массива координат точек для проверки:

r = _width / 2;

dx = [0, 0.707*r, r, 0.707*r, 0, -0.707*r, -r, -0.707*r];

dy = [r, 0.707*r, 0, -0.707*r, -r, -0.707*r, 0, 0.707*r];

  1. и измените функцию check таким образом:

function check() {

for (i=0; i<8; i++)

if ( _root.map.hitTest(_x+dx[i], _y+dy[i], true) ) {

_x = _xOld;

_y = _yOld;

break;

}

}

  1. Сохраните фильм ЛР6_2.fla и проверьте его работу.

Теперь точка возвращается в предыдущее положение, если хотя бы одна точка оказалась в активной области карты. Оператор break (выход из цикла) служит для того, чтобы не проверять остальные точки, если одно пересечение уже найдено.

Сложная фигура и клип Два подхода

Теперь рассмотрим самый сложный случай — столкновение двух фигур неправильной формы. Нужно сразу сказать, что универсального решения этой задачи не существует, нет такой функции, которая могла бы определять, пересекаются ли два клипа с учетом формы фигур. Если два основных подхода:

  • обе фигуры разбиваются на более простые, для которых легко определить факт пересечения (прямоугольники, круги);

  • границы одной из фигур хранятся в виде набора точек, при проверке определяется, попадает ли хотя бы одна из них в область второго клипа.

В следующем примере мы будем использовать второй способ. Машинка управляется клавишами-стрелками, задача — доехать до финиша. При касании камней слышится звук удара.

  1. Откройте файл stones.fla и проверьте его работу. Сохраните его в своей папке

Машину управляется клавишами-стрелками (соответствующий код уже добавлен к клипу), однако никакой реакции на столкновение с камнями и выход на финиш мы не видим.

По границам камней стоят значки — красные точки. Это символы типа Точка из библиотеки, которые определяют возможные точки столкновения машины с камнем.

  1. Двойным щелчком войдите в режим редактирования четвертого камня, вокруг которого нет точек. Перетащите из библиотеки на сцену клип Точка и расставьте точки по границе камня (для копирования клипа перетаскивайте его при нажатой клавише Alt).

Теперь нужно при очередном перемещении машины как-то узнать координаты этих точек. Для этого при создании клипа-камня мы построим массив, состоящий из ссылок на клипы-точки, которые являются «детьми» (дочерними объектами) для камня.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]