В ActionScript 3 появилось событие stage.onMouseLeave. Это означает, что теперь можно забыть о тех темных временах, когда флэш-кодеры путем уловок и ухищрений заставляли flash player определять момент выхода мышки за флэшку.
stage.onMouseLeave
Теперь можно писать так (prof, спасибо за поправки!):
package { import flash.display.Sprite; import flash.display.Stage; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.text.TextField; import flash.events.Event; public class stageOnMouseLeave extends Sprite /*MovieClip*/{ private var textTest:TextField; private var intCount:int=0; public function stageOnMouseLeave(){ stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.showDefaultContextMenu=false; stage.addEventListener(Event.MOUSE_LEAVE, onStageLeave); textTest = new TextField(); addChild(textTest); textTest.text = "Не покидай меня!"; } public function onStageLeave(event:Event):void{ textTest.text = "Ты бросил меня\n"+ ++intCount + " раз."; } } }
Это работающий пример, его можно компилировать из консоли (т.е. просто написав: mxmlc stageOnMouseLeave.as. Вы ведь уже добавили путь к mxmlc, компилятору actionscript3 в переменную окружения patn, как было описано в компиляции flex-приложений из командной строки.)
mxmlc stageOnMouseLeave.as
patn
Результат:
Что это: stage.addEventListener(flash.events.Event.MOUSE_LEAVE... Я имею в виду конкретно вот это: flash.events. Убери, не позорь свою седую голову :) И коммент мой потом тоже убери - дабы мне не опозорить свою :)
Какой уж тут позор, я, как и многие сегодня (хочется в это верить), изучаю новый api предлагаемый нам as3 и что-то естественным образом кешируется в памяти, типа кусков хелпа, што ли ;-)
Не стану убирать ни того, ни другого: данная строка является единственной существенной во всем куске кода ;) Она должна быть самодостаточной, чтобы глядя только на нее, чел узнал как можно больше. Да и сам я пока не держу в голове все хитросплетение структур as3. Мне нравится максимально самодокументируемый код, пусть даже избыточный.
А любители ужимать код сделают это лучше моих скромных попыток уследить за развитием событий ;)
К любителям ужимать код себя ни в коей мере не отношу, и даже буду ругаться, если таковым меня назовут :) Просто лично меня это навело на сомнения, поясню: если я вижу указание полного пути к какому-либо классу, имя которого мне знакомо (ди и не только мне) - значит, тут что-то не так, значит этот Event - это не тот Event, которого я знаю, а какой-то особенный и другой. Присмотрелся - нет, все тот же. А парой строк ниже этот же Event, по уже без указания полного пути. Нестыковочка... Понятно, решать в данном случае не мне, однако имхо или везде одинаково, или никак уж тогда.
Добавлю: данная строка ничего хорошего нам не дает без другой строки: public function onStageLeave(event:Event) {... и следующей за ней. Видимо, в данном случае ты хочешь всем сказать, что в этих строках разные Event-ы, так?
Согласен, нестыковка: профессиональный глаз об указание полного пути внутри методов класса споткнется.
В функции-обработчике (public function onStageLeave(event:Event)) Event как тип данных тот же самый, конечно.
Если это может кого-то ввести в заблужение, то код надо исправить, как ты предлагаешь, а старый оставлю тут истории ради:
package { import flash.display.Sprite; import flash.display.Stage; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.display.TextField; import flash.events.Event; public class stageOnMouseLeave extends Sprite{ private var textTest:TextField; private var intCount:int=0; public function stageOnMouseLeave(){ stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.showDefaultContextMenu=false; stage.addEventListener(Event.MOUSE_LEAVE, onStageLeave); textTest = new TextField(); addChild(textTest); textTest.text = "Не покидай меня!"; } public function onStageLeave(event:Event):void{ textTest.text = "Ты бросил меня\n"+ ++intCount + " раз."; } }
Event.MOUSE_LEAVE
Еще в обработчике явно не хватает той самой обработки аргумента "event", но и не нахожу, чего там обрабатывать, если и event.target и event.currentTarget возвращают одно и то же: [objeсt Stage].
[objeсt Stage]
Хотя, конечно, всегда есть чего обработать, если хорошо копнуть ;)
А вообще я обо многом из этого раньше и не задумывался, а стоило бы уже начать ;№_))
VerifyError: Error #1011: Method stageOnMouseLeave$iinit() contained illegal opcode 97 at offset 20. at stageOnMouseLeave$iinit()
Это скорее всего из-за устаревшей версии Flash Player 8.5.
А у меня другое: "VerifyError: Error #1014: Class flash.display::TextField could not be found. at global$init() "
Это, как я догадываюсь, из-за моей слишком новой версии Flash Player 9 (тольок установленной). Сейчас попробую перекомпильнуть под новую версию.
Круто. Оказывается, в этой версии класс TextField перенесен из пакета flash.display в пакет flash.text (вполне разумно, наверное) А пакет flash.util переименован во flash.utils.
Видно, что парни работают не только над косметическими улучшениями. Я обновил приложение, а здесь сохраню предыдущую версию кода, чтобы было с чем сравнивать:
package { import flash.display.Sprite; import flash.display.Stage; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.display.TextField; import flash.events.Event; public class stageOnMouseLeave extends Sprite /*MovieClip*/{ private var textTest:TextField; private var intCount:int=0; public function stageOnMouseLeave(){ stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.showDefaultContextMenu=false; stage.addEventListener(Event.MOUSE_LEAVE, onStageLeave); textTest = new TextField(); addChild(textTest); textTest.text = "Не покидай меня!"; } public function onStageLeave(event:Event):void{ textTest.text = "Ты бросил меня\n"+ ++intCount + " раз."; } } }
Интересно то, что размер скомпилированного файла уменьшился с 14 Кб до 3 Кб.
VerifyError: Error #1014: Class IBitmapDrawable could not be found.
AS3: переделать переделали...а баго-о-о-в то немеряно. Классы кочуют из пакета в пакет...Я считаю что пока рано на нем что-то серъезное начинать писать...