Сама по себе тема создания своего курсора мыши довольно избита. Но сводится, как правило, к сокрытию «настоящего» курсора ОС и перемещению клипа в координаты мыши.
Мы побеседуем о другом. Как в AS3 заменить «реальный» курсор ОС.
Начиная с версии Flash 10.2 у класса Mouse появились новые методы registerCursor для регистрации нового курсора и unregisterCursor, как не сложно догадаться, для обратной операции.
А так же свойство supportsNativeCursor, позволяющее проверить поддерживает ли ОС на которой выполняется ролик встроенные курсоры.
Внешний вид собственного курсора определяется классом MouseCursorData имеющий три полезных свойства:
data : Vector.<BitmapData> — вектор битмапдат — «кадров» курсора,
frameRate : Number — частота кадров анимации, да, да она может отличаться от frameRate самого ролика,
hotSpot : Point — активная точка курсора (по умолчанию 0, 0).
Преимущества перед «эмулированным курсором» на лицо:
- Не нужно следить «а не перекрыл ли его новый добавленный DisplayObject»
- При изменении масштаба ролика курсор остается не изменным
- Нет артефактов при выводе мыши за пределы ролика
- После клика пользователем правой кнопкой мыши не будет эффекта «двойного курсора»
- ???
- PROFIT
Ну и немного дегтя в бочку с медом, куда ж без него:
- Максимальный размер курсора 32×32 пикселя.
Как вы уже верно заметили, для отображения и анимации курсора нужен вектор битмапдат. Для удобства мы не будем эмбеддить набор картинок, а проведем растеризацию анимированного клипа.
Чтож приступим.
Для начала надо курсор нарисовать, художник из меня мягко скажем не особый, получился вот такой курсор:
(Клик для анимации)
Ну а теперь все вышесказанное в коде с комментариями:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
package { import flash.display.BitmapData; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.ui.Mouse; import flash.ui.MouseCursorData; public class Main extends Sprite { private const MY_CURSOR:String = "MySuperCursor"; //Определяем строковую константу - имя курсора public function Main():void { if (Mouse.supportsNativeCursor) //Проверяем что ОС поддерживает встроенные курсоры { var cursorData:MouseCursorData = new MouseCursorData(); //Создаем новый экземпляр класса "параметров курсора" cursorData.data = getBitmapsVector(new MyCursorClip()); //Определяем вектор битмап. (Подразумеваю, что MyCursorClip это и есть нарисованный ранее курсор) cursorData.frameRate = stage.frameRate; //Определяем частоту кадров. Mouse.registerCursor(MY_CURSOR, cursorData); //Регистрируем курсор Mouse.cursor = MY_CURSOR; //Делаем курсор активным } else //Иначе, если в ОС нет поддержки курсоров, используем старый способ с сокрытием курсора { Mouse.hide(); var mc:MovieClip = new MyCursorClip(); mc.mouseEnabled = false; mc.x = mouseX; mc.y = mouseY; mc.addEventListener(Event.ENTER_FRAME, cursorFrameHandler); addChild(mc); } } /** * Возвращает вектор битмапдат - кадров переданного клипа * @param mc преобразуемый в вектор клип * @return Vector.<BitmapData> вектор битмапдат */ private function getBitmapsVector(mc:MovieClip):Vector.<BitmapData> { var vector:Vector.<BitmapData> = new Vector.<BitmapData>(); for (var i:int = 0; i < mc.totalFrames; i++) { mc.gotoAndStop(i + 1); vector[i] = new BitmapData(32, 32, true, 0x000000); vector[i].draw(mc); } return vector; } /** * Обработчик входа имитирующего курсор клипа в кадр. перемещает его в координаты "реального" курсора * @param e событие */ private function cursorFrameHandler(e:Event):void { e.currentTarget.x = mouseX; e.currentTarget.y = mouseY; } } } |
И пример: