Top Ad unit 728 fff 90

Flash Game Book (7 урок)

Обнаружение столкновений.

 

Что такое столкновение?

Столкновение происходит при условии, когда две различные формы имеют одну или более общих точек.

Например, все окружности, соприкасающиеся краями, такие, как два бильярдных шара, находящиеся один против другого.

 

Есть два основных вида программного обнаружения столкновения:

Использование метода hitTest() объекта MovieClip и

Использование математики для для определения, произошло ли столкновение.

 

Обнаружение с использованием hitTest

Объекты MovieClip во Flash содержат много методов и свойств,

которые помогают в работе с клипами.

Когда клип создан в авторской среде разработки или с помощью кода AS, он наследует все методы и свойства объекта MovieClip.

Эти методы и свойства становятся после этого доступны для экземпляра нового клипа.

 

Использовать Метод hitTest() объекта MovieClip для обнаружения столкновения можно втрех простых сценариях.

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

1. Столкновение клипа с клипом

Тип обнаружения столкновения определяется,

если ограничивающие прямоугольники двух клипов перекрываются.

Фигуры внутри клипов могут соприкасаться, а могут и не соприкачаться между собой,

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

Теперь покопаемся в коде AS.

Поскольку hitTest() является методом объекта MovieClip,

он может быть применен только к клипу (исключая любой другой вид объекта,

такой, как графика или текстовое поле).

myMovieClip.hitTest(target_MovieClip)

звучит это примерно так:

"Пересекаются ли ограничивающий прямоугольник myMovieClip

с ограничивающим прямоугольником target_MovieClip?"

Когда строка выполняется, нам возвращается ответ, true(да) или false(нет).

Рассмотрим на примере.

На нашем первом слое нарисуем объект (в моем примере это шар).

Преобразуем объект в клип (F8) с именем шар.

Создадим новый слой.

На слое нарисуем объект (в моем примере это стена).

Преобразуем объект в клип (F8) с именем стена.

Выберем наш первый слой.

И впишем в него код (Actions-Frame):


xmov=3;

_root.onEnterFrame=function(){

    шар._x+=xmov;

    if (шар.hitTest(стена)){

    trace("Столкновение!");

        }

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

Если столкновение произошло, то мы просто выполняем оператор trace для отображения,

что это случилось.

Оператор trace предназначен для тестирования и отладки.

Отображается он только в режиме тестирования.

 

2. Столкновение клипа с точкой.

Метод hitTest() дает нам возможность определить,

находится ли точка (x,y) в пределах ограничивающего прямоугольника клипа.

Это простейший способ для определения, находится ли курсор мыши над клипом,

без использования кнопок.

myMovieClip.hitTest(x,y)

звучит это примерно так:

"Попадает ли точка с координатами x и y в ограничивающий прямоугольник myMovieClip?"

Когда строка выполняется, нам возвращается ответ, true(да) или false(нет).

 

Рассмотрим на примере.

На нашем первом слое нарисуем объект (в моем примере это шар).

Преобразуем объект в клип (F8) с именем шар.

Войдите в клип, создайте простенькую анимацию

(в моем примере шар просто меняет цвет).

Выберем наш слой.

И впишем в него код (Actions-Frame):

 


_root.onMouseDown=function(){

    mix=_xmouse;

    miy=_ymouse;

    if(шарик.hitTest(mix,miy)){

        шарик.play()}

    }

Строка 1 определяет функцию, которая вызывается, когда нажата клавиша мыши.

Когда это происходит,устанавливаются две переменные - mix и miy,

для сохранения x и y координат положения курсора мыши.

Строка 4 определяет, находится ли курсор мыши в границах прямоугольного клипа шарик.

Строка 5 воспроизводит анимацию, если условие выполнено.

Рассмотрим на более сложном примере.

 

На нашем первом слое нарисуем объект (в моем примере это шар).

Преобразуем объект в клип (F8) с именем шар.

Войдите в клип, создайте простенькую анимацию

(в моем примере шар просто распадается на части).

Выберем наш слой.

И впишем в него код (Actions-Frame):


числоШариков=6;

ширинаЭкрана=700;

высотаЭкрана=700;

шарик._visible=false;

for(var i=0; i<числоШариков; ++i){

var имя="шарик"+i;

_root.attachMovie("шарик", имя, i);

var x=random(ширинаЭкрана);

var y=random(высотаЭкрана);

_root[имя]._x=x;

_root[имя]._y=y;

}

_root.onMouseDown=function(){

mix=_xmouse;

miy=_ymouse;

for(var i=0; i<числоШариков; ++i){

var имя = "шарик"+i;

if(_root[имя].hitTest(mix, miy)){

_root[имя].play();

}

}

}

Строка 1 определяет, сколько воздушных шаров будет создано и размещено в сцене.

Строки 5-12 создают и размещают шары на сцене.

Строки 13-22 содержат цикл, который проверяет столкновение с каждым шаром.

Имена шаров создаются динамически (шарик0, шарик1 ... шарик5).

Оператор _root[имя] эквивалентен записи _root.шарик0.

attachMovie()

С помощью ActionScript можно создать новый экземпляр клипа в сцене, крторый является файлом библиотеки.

По правилам ActionScript для вытаскивания клипа из библиотеки, клип должен быть настроен.

Откройте панель Library (Ctrl+L), найдите клип который хотите сделать доступным, правой кнопкой мыши нажмите на нем и выберите пункт Linkage.

Активируйте Export for Action Script. После этого можно пользоваться оператором:

path.attachMovie(Linkage.identifier, new_instance_name, depth);

например:

_root.attachMovie("shar", "shar1", 2);

О циклах

С помощью циклов мы можем одно и тоже действие выполнять столько раз, сколько вы этого захотите.

Например у вас есть картинки с именами от pict1 до pict30 и вам нужно сделать их не видимыми, можно просто создать цикл


for (var i=1; i<=30; ++i){

var name ="pict"+i;

this [name]._visible=false;

}

В цикле for три параметра.

Первый определяет начальное значение цикла (var i=0)

Второй является условием, которое должно быть выполнено для продолжения цикла (i<=30).

Третий пример увеличивает переменную, чтобы цикл через какое-то время заканчивался (++i).

 

3. Столкновение формы с точкой.

Третий метод использования hitTest(), состоит в том,

чтобы обнаружить столкновение между точкой и содержимым клипа,

не только с ограничивающим прямоугольником.

myMovieClip.hitTest(x, y, true)

Рассмотрим на примере.

На нашем первом слое нарисуем объект (в моем примере это звезда).

Преобразуем объект в клип (F8) с именем звезда.

Выберем наш слой.

И впишем в него код (Actions-Frame):


_root.onMouseDown=function(){

    mix=_xmouse;

    miy=_ymouse;

    if (звезда.hitTest(mix,miy,true)){

        trace("Вы коснулись звезды!");

    }

Заметим что добавился параметр true.

Когда этот параметр установлен в true,

метод hitTest() проверяет на столкновение между точкой и содержимым клипа.

Если этого параметра нет или он установлен в false,

то метод проверяет на столкновение между точкой и ограничивающим прямоугольником клипа.

Скачать 1

Скачать 2

Скачать 3

Скачать 4

All Rights Reserved by ProcessPlus 2014 - 2018

Написать нам

Имя

Email *

Сообщение *