![]() |
|
||||||||||
|
|||||
|
Цитата:
|
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
Цитата:
Цитата:
|
|
|||||
|
Akopalipsis, понимаете писать можно в кадрах, китайскими иероглифами с использованием глобальных перемененных. Всё конечно же зависит от задачи которая ложиться на разработчика, нельзя взять и сказать вот это универсальное решение на все случаи жизни. В своей практике я стараюсь использовать объект stage как только возможно редко, можно сказать вообще единожды, при инициализации приложений и основываясь на правиле - Можно использовать DO/DOC вместо stage используем и только тогда когда без этого не обойтись - используем stage. ( Как пример события ввода из клавиатуры )
__________________
return this... |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
То все рано ответ будут тот же. Вешать слушателя на стейдж, а там по интерфейсу делить по типам. И так и получится, что на стейдж вешать слушателей более приемлемо, чем добавлять на неё обьекты. |
|
|||||
|
Ваши вопросы и утверждения изначально неправильные, я именно это отметил.
Нельзя сказать "вешать слушателей более приемлемо, чем добавлять на неё обьекты" - это две совершенно разные, не связанные друг с другом операции. Я перефразировал чтобы вы сами в этом убедились, и потом сказали мне, что Цитата:
Цитата:
Это две совершенно разные операции, из них нельзя выбрать более приемлимую и менее премлимую) Вы можете и добавить объект на стейдж и добавить слушатель на стейдж, и программа будет работать. От того, что вы добавите объект непосредственно на stage ничего принципиально не изменится. Последний раз редактировалось KumoKairo; 03.10.2013 в 15:49. |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
И извиняюсь за настырность, самому не приятно! |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Да бывает. Иногда так хочется услышать четкий ответ от доверяемого источника, что сам перестаешь думать вообще.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 290
|
KumoKairo, Похоже, я нашел способ как проще применить вашу идею, без введения Sprite субкласса, используя только свойство .name объектов. Хотя, он наверное более избыточен, но как именно применить ваш способ к группе экземпляров разных классов, я не сообразил.
AlexCooper, к сожалению, мое понимание того, что такое интерфейсы и как они работают, еще не превышает наверное и 10% от полного. Поэтому, я не знаю как адаптировать вашу идею к данному примеру. Короче говоря, получилось так. Основной документ класс: package { import flash.display.*; import flash.events.*; import flash.text.*; public class Main extends Sprite { //--- Экземпляр класса инфо-панели ---// private var _panelPlacer:Panel_placer; //--- Экземпляр класса добавляемых объектов ---// private var _objectPlacer:Object_placer; public function Main() { _objectPlacer = new Object_placer(); addChild(_objectPlacer); _panelPlacer = new Panel_placer(); addChild(_panelPlacer); //--- Вешаем слушатели на стэйдж ---// stage.addEventListener(MouseEvent.MOUSE_OVER, showInfo); stage.addEventListener(MouseEvent.MOUSE_OUT, resetInfo); } private function showInfo(e:MouseEvent) { trace("Класс: ", String(e.target), "; Экземпляр = ", String(e.target.name)); switch(String(e.target)) { case "[object TextField]" : if(String(e.target.name) == "info_texter") { _panelPlacer._infoPanel.info_texter.text = "Инфо-область"; } else { _panelPlacer._infoPanel.info_texter.text = "Текст: " + String(e.target.name); } break; case "[object Sprite]" : _panelPlacer._infoPanel.info_texter.text = "Квадрат: " + String(e.target.name); break; case "[object Info_panel]" : _panelPlacer._infoPanel.info_texter.text = "Панель: " + String(e.target.name); break; case "[object Circle]" : _panelPlacer._infoPanel.info_texter.text = "Эллипс: " + String(e.target.name); break; case "[object Object_placer]" : _panelPlacer._infoPanel.info_texter.text = "Шэйп: " + String(e.target.name) + " без спрайта"; break; } } private function resetInfo(e:MouseEvent) { _panelPlacer._infoPanel.info_texter.text = "..."; } } } package { import flash.display.*; import flash.events.*; import flash.text.*; public class Object_placer extends Sprite { public var _objectPlacer:Object_placer; //--- Произвольные объекты на экране ---// private var _someTextfield:TextField; private var _someSquare:Shape; private var _someTriangle:Shape; private var _shapeSprite:Sprite; private var _someCircle:Circle; public function Object_placer() { //--- Размещаем текстфилд ---// _someTextfield = new TextField(); _someTextfield.text = "<<< НАВЕДИ КУРСОР НА ОБЪЕКТ >>>"; _someTextfield.autoSize = TextFieldAutoSize.LEFT; _someTextfield.background = true, _someTextfield.backgroundColor = 0xFFCC00; _someTextfield.border = true, _someTextfield.borderColor = 0xFF9900; _someTextfield.x = 200, _someTextfield.y = 50; _someTextfield.name = "гласящий " + _someTextfield.text; addChild(_someTextfield); //--- Размещаем спрайт квадрата ---// _someSquare = new Shape(); _shapeSprite = new Sprite(); _shapeSprite.x = 280, _shapeSprite.y = 200; _someSquare.graphics.lineStyle(1); _someSquare.graphics.beginFill(0x00CCFF, 1); _someSquare.graphics.drawRect(0, 0, 75, 50); _shapeSprite.addChild(_someSquare); _shapeSprite.name = "Голубой такой"; addChild(_shapeSprite); //--- Размещаем шейп треугольника ---// _someTriangle = new Shape( ); _someTriangle.graphics.lineStyle(1); _someTriangle.graphics.moveTo(100, 200); _someTriangle.graphics.beginFill(0xFF00CC, 1); _someTriangle.graphics.lineTo(200, 200); _someTriangle.graphics.lineTo(150, 250); _someTriangle.graphics.lineTo(100, 200); _someTriangle.graphics.endFill( ); _someTriangle.name = "Фиолетовый"; addChild(_someTriangle); //--- Размещаем круг ---// _someCircle = new Circle(); _someCircle.x = 450, _someCircle.y = 200; _someCircle.name = "Желтый, из Library"; addChild(_someCircle); } } } Видимо, такой подход кривоват, а идея со switch, наверное, весьма избыточна. Также остаются некоторые слабо прояснённые моменты: - Непонятно, как работать с безспрайтными Шейпами. Если я присваиваю такому шейпу свойство .name то оно не проявляется, и все-равно он автоматом получает instanceN. - Непонятно, как выцеплять пустоту : ) Пришлось обойтись отдельным событием MOUSE_OUT. - Лучше ли применять события ROLL_OVER и ROLL_OUT в сравнении с MOUSE_OVER и MOUSE_OUT. |
|
|||||
|
[+4 06.05.14]
|
Писал как то давно для одного проекта. ВОт вам на скорую руку
package ru.stickery.views { import com.greensock.TweenMax; import com.in4core.text.DisplayText; import flash.display.Sprite; import flash.events.MouseEvent; import flash.text.TextField; /** * ... * @author in4core progression lab */ public final class PopupHelp { static private var _view:Sprite; private static var _holder:Sprite = new Sprite(); public function PopupHelp() { } public static function addView(view:Sprite):void { _view = view; } public static function showHelp(text:String):void { if(_view.contains(_holder)) _view.removeChild(_holder); _view.addChild(_holder); _holder.stage.removeEventListener(MouseEvent.MOUSE_MOVE , onMouseMove); _holder.graphics.clear(); if (_holder.numChildren) _holder.removeChildAt(0); const t:TextField = DisplayText.addField("Verdana_11pt_st" , 11 , true); t.text = text; t.textColor = 0xFFFFFF; _holder.graphics.beginFill(0, 0.85); _holder.graphics.drawRoundRect(0, 0, t.width + 10 , t.height + 20 , 8); _holder.graphics.endFill(); _holder.addChild(t); t.x = _holder.width / 2 - t.width / 2; t.y = _holder.height / 2 - t.height / 2; _holder.alpha = 0; TweenMax.to(_holder , 0.5 , { alpha:1 } ); _holder.stage.addEventListener(MouseEvent.MOUSE_MOVE , onMouseMove); } static private function onMouseMove(e:MouseEvent):void { _holder.x = e.stageX + 30; _holder.y = e.stageY ; } static public function hideHelp():void { if(_view.contains(_holder)) _view.removeChild(_holder); } } } package ru.stickery.controllers { import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.events.Event; import flash.events.MouseEvent; import flash.utils.Dictionary; import flash.utils.setTimeout; import ru.stickery.views.PopupHelp; /** * ... * @author in4core progression lab */ public class PopupHelpMessages { private static var _hash:Dictionary = new Dictionary(true); public static const notifications:Array = [ ["Приветствие!","Приветсвуем Вас в приложении печати ArtPrint Office!\n\nЕсли у Вас возникли вопросы в течении работы, Вы можете обратится к администратору сайта, воспользовавшись секцией \"контакты\"."], ["Измерения", "Все размеры холста, фотографий, текста определяются в сантиметрах. Поэтому, когда Вы добавляется фотографию, она уменьшается пропорционально, переводя свои размеры из пикселей в сантиметры.\n\nДля справки : \n1 px = 0.026458333 cm\n1 cm = 37.795275591 px."], ["Изображения высокого качества. DPI", "Загружая фотографию с компьютера помните, что большинство экранных изображений имеют разрешение 72 DPI, такое качество пагубно скажется на итоговой печати, поэтому желательно загружать фотографии по качеству 300 DPI.\n\nЕсли Вы загрузили фотографию с вашего компьютера, пожалуйста позаботьтесь о том, чтобы оригинальная копия вашей фотографии никуда не потерялась. После оформления заказа, администратор потребует выслать (email) ему оригинальную копию вашей фотографии."], ["Координаты и клавиатура", "Координаты фотографий в результате сжатия или изменения размеров могут иметь неточные значения, поэтому в некоторых случаях центровка оказывается слегка неточной. В этом случае Вам помогут стрелочки на клавиатуре (влево, вправо, вверх, вниз) для подгонки координат к желаемым.\n\nДля удаления объекта с холста Вы можете также воспользоваться кнопкой Delete на своей клавиатуре."], ["Приступая к работе" , "Благодарим Вас, что выбрали Нас, мы не подведем!\n\nПри возникновении проблем в работе приложения незамедлительно отправьте email в отдел тех поддержки "mailto:tech@artprint.ru">tech@artprint.ru\n\nНажмите кнопку \"Начать!\", чтобы начать работу с приложением."] ] public static const helpMessages:Array = [ //menu "Растянуть по вертикали" , //0 "Растянуть по горизонтали" , //1 "Центровать" , //2 "Растянуть на весь экран", //3 "Установить слой на верхний уровень" , //4 "Установить слой на уровень ниже" , //5 "Включить режим наложения Multiply" , //6 "Отменить последнее действие\n ( поворот, размеры, положение )", //7 "Удалить слой" , //8 "Увеличить масштаб просмотра", //9 "Уменьшить масштаб просмотра" , //10 "Показать/скрыть сетку", //11 // bottom "Выбрать размер стены/холста", //12 "Установить ширину", //13 "Установить высоту", //14 "Выбрать фотографию с диска компьютера", //15 "Выбрать фотографию из платной библиотеки Fotolia", //16 "", //17 "Для передвижения текста зажмите клавишу ctrl" // 18 ] public static const textCrutch:String = "Для передвижения текста зажмите клавишу ctrl"; public static function setHelp(source:DisplayObjectContainer , helpIndex:int , delay:int = 0):void { _hash[source] = [helpIndex , delay]; source.addEventListener(MouseEvent.MOUSE_OVER , showHelp); if (source.stage) source.stage.addEventListener(MouseEvent.MOUSE_OVER , hideHelp); else source.addEventListener(Event.ADDED_TO_STAGE , onAdded); } static private function onAdded(e:Event):void { e.currentTarget.removeEventListener(Event.ADDED_TO_STAGE, onAdded); e.currentTarget.stage.addEventListener(MouseEvent.MOUSE_OVER , hideHelp); } static private function hideHelp(e:MouseEvent):void { PopupHelp.hideHelp(); } static private function showHelp(e:MouseEvent):void { for (var i:* in _hash) { if ( i == e.currentTarget) { setTimeout( PopupHelp.showHelp , _hash[i][1] , helpMessages[_hash[i][0]]); break; } } } } }
__________________
Марк Tween |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:06. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|