В этой статье я расскажу как использовать правую кнопку мыши в своих flash-проектах.
А заодно убрать это ненужное меню по правой кнопке. :]
Так получается, что нативное (от native — родной) событие для правой кнопки мыши существует уже с версии 11.2, давайте попробуем его использовать.
Создаём новый проект, указываем версию выше 11.2, советую указать версию 12 или 13 (я поставил 13).
Замечание: если указать версию 14, то при запуске проекта будем ловить ошибку: [Fault] exception, information=TypeError: Error #2007: Parameter type must be non-null. В строке объявления слушателя события.
Вот как выглядят настройки проекта:
После этого события правой мыши начинают отображаться в автоподстановке:
Объявляем наше событие в инициализации и делаем обработчик:
... private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point stage.addEventListener(MouseEvent.RIGHT_CLICK, onMBRClick); } private function onMBRClick(e:MouseEvent):void { trace("R click"); } ...
Запускаем и правая кнопка успешно работает, показывая нам trace-сообщение.
Теперь давайте сделаем какое-нибудь действие по правой кнопке, чтобы было поинтереснее чем трейс и выглядело более практичнее.
Сделаем по нажатию левой кнопки — создание визуального объекта, а по правой — уничтожение.
Сначала сделаем класс для объекта VisObj, будем наследовать его от Sprite. В его конструкторе сделаем сразу создание графики квадратика со случайным цветом:
package { import flash.display.Shape; import flash.display.Sprite; public class VisObj extends Sprite { public function VisObj(aSizeW: int = 30, aSizeH: int = 30) { super(); var colorBox: uint = generateRndColor(); var box: Shape = new Shape(); box.graphics.beginFill(colorBox); box.graphics.drawRect( -aSizeW / 2, -aSizeH / 2, aSizeW, aSizeH); box.graphics.endFill(); addChild(box); } private function generateRndColor(): uint { return Math.random() * 0xFFFFFF; } public function free():void { if (parent) parent.removeChild(this); removeChildren(); } } }
А так же обратите внимание на метод free(), по нему объект самоуничтожается удаляясь со своего парента. Его мы и будем вызывать по правой кнопке.
В главном классе у нас должно быть 2-е функции обработки кликов (левой и правой кнопок мыши) и создание квадратика я выделил в отдельную функцию addQuad(), для того, чтобы при запуске сразу создать 10 квадратиков в случайных местах:
package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; [Frame(factoryClass="Preloader")] public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); for (var i:int = 0; i < 10; i++) addQuad(Math.random() * stage.stageWidth, Math.random() * stage.stageHeight); stage.addEventListener(MouseEvent.CLICK, onClick); stage.addEventListener(MouseEvent.RIGHT_CLICK, onMBRClick); } private function addQuad(aX:int, aY:int):void { var box: VisObj = new VisObj(); box.x = aX; box.y = aY; addChild(box); } private function onClick(e:MouseEvent):void { addQuad(mouseX, mouseY); } private function onMBRClick(e:MouseEvent):void { if (e.target is VisObj) VisObj(e.target).free(); } } }
Вот и все дела, можете попробовать сами: