Во многих приложениях, например играх, нужно знать, находится ли заданная точка внутри какого-либо графического элемента. Эта задача - выявление совпадений - решается в разных случаях по-разному. И, как правило, ее зачастую весьма непростое решение ложится на плечи программиста.
В нашем случае, однако, все намного проще. Разработчики Flash предусмотрели особый метод объекта moviec
lip - hitTest. С его помощью вы можете проверять, находится ли заданная точка внутри клипа, или касаются ли друг друга два отдельных клипа.
Метод hitTest имеет два формата вызова. Первый из этих форматов позволяет выяснить совпадение точки и клипа:
>. hitTest (, , ) ;
Как вы уже поняли, первые два параметра задают соответственно горизонтальную и вертикальную координату нужной вам точки. Третий параметр имеет логический тип и позволяет задать, что считать границами клипа: его контур (значение true) или окружающий его прямоугольник (значение
false).
Если заданная точка находится внутри клипа, метод hitTest возвращает true. В противном случае возвращается false. Вы можете использовать это значение в условном выражении или еще где-либо.
Давайте проверим, как работает этот метод. Создадим новый клип, представляющий собой сложную фигуру из множества кривых. Поместим его на рабочий лист и присвоим ему имя hit. После этого присвоим этому клипу
Обработчик события enterFrame:
onClipEvent (enterFrame) {
if (this. hitTest (_root._xmouse, __root._ymouse, true)) {
this._alpha =50;
} else {
this._alpha = 100;
Этот сценарий постоянно будет вызываться и проверять, находится ли курсор мыши над нашей фигурой. Если это так, то фигура делается полупрозрачной, в противном случае - полностью непрозрачной.
Заметьте, что метод hitTest проверяет только "попадание" в саму фигуру, если его третий параметр равен true. Если же его приравнять false, то этот метод станет проверять попадание в воображаемый прямоугольник, описанный вокруг фигуры. Это более грубая проверка
, но, вероятно, она тоже иногда нужна, если разработчики Flash включили ее в свое творение.
Второй формат метода hitTest позволит вам проверить совпадение двух различных клипов, т. е. накладываются они или перекрываются:
. hitTest () ;
В смысле передаваемых параметров здесь все ясно. И возвращаемое значение то же самое.
Имейте в виду, что метод hitTest, записанный во втором формате, проверяет "попадание" не фигуры в фигуру, а воображаемого прямоугольника, описанного вокруг первой фигуры, в воображаемый прямоугольник, описанный вокруг второй фигуры. Следовательно, этот метод ведет себя так, словно несуществующий третий его параметр равен false.
Теперь осталось проверить работу метода. Создайте новый образец-клип со сложной фигурой, поместите его экземпляр на рабочий лист, сделайте его поменьше и назовите cursor. К первому (и единственному) кадру фильма привяжите следующий небольшой сценарий:
_root. cursor. startDrag ( true );
Этот сценарий заставляет клип cursor двигаться за мышью. Немного изменим обработчик события enterFrame для клипа hit:
onClipEvent (enterFrame) {
if ( this. hitTest (_root. cursor )) {
this._alpha = 50;
} else {
this._alpha = 100;
}
}
Как видите, здесь было сделано одно-единственное изменение (выделено полужирным шрифтом). Мы поменяли формат вызова метода hitTest. Теперь можно проверить, как все это работает.
Скачать исходник к данной статье