Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   "Пользовательские события" и "Интерфейсы" на пальцах... (http://www.flasher.ru/forum/showthread.php?t=188553)

PasserBy 03.12.2012 17:35

"Пользовательские события" и "Интерфейсы" на пальцах...
 
"Пользовательские события" и "Интерфейсы" на пальцах может кто нибудь объяснить с простыми примерами и обзором в каких случаях используется обычно.

Читая Колина Мука, не совсем понимаю, что он хочет донести в соответствующих главах. То есть примеры там есть,но не очевидные, к тому же в "Код листингах" многое остается без комментариев. Заранее спасибо.

caseyryan 03.12.2012 17:46

PasserBy, советую не забвивать себе голову интерфейсами данном этапе. Когда я читал эту книжку, мне тоже было не понятно это. Все прийдет со временем. Пока этот момент можно пропустить и разобраться с более понятными вещами.

PasserBy 03.12.2012 17:52

Цитата:

Сообщение от caseyryan (Сообщение 1107652)
PasserBy, советую не забвивать себе голову интерфейсами данном этапе. Когда я читал эту книжку, мне тоже было не понятно это. Все прийдет со временем. Пока этот момент можно пропустить и разобраться с более понятными вещами.

Что касается событий?

Как я понял из форума, классы и события - основа основ AS

DaFive 03.12.2012 17:59

Есть события, которые возникают на стороне FP когда происходит какое-либо действие (клик, завершение загрузки и т.п.). Их вы можете отследить, подписав что либо на эти события (кнопку на клик, лоадер на завершение).
Но, например, вы хотите сделать своё собственное, которого нет в принципе в природе. Допустим когда чья-то бабушка подойдёт к микрофону и громко крикнет "Тагиииил!" - ваша система распознает голос, определит, что он исходит от бабушки и "вручную" создаст своё событие и разошлет его подписчикам:

Код AS3:

dispatchEvent(new Event("GRANDMOTHER_TAGIL_ROAR", true));

А что-то, будучи подписанным на это событие .addEventListener("GRANDMOTHER_TAGIL_ROAR", handler) - в функции handler выполнит соответствующее действие.

PasserBy 03.12.2012 18:04

Цитата:

Сообщение от DaFive (Сообщение 1107657)
Код AS3:

dispatchEvent(new Event("GRANDMOTHER_TAGIL_ROAR", true));

А что-то, будучи подписанным на это событие .addEventListener("GRANDMOTHER_TAGIL_ROAR", handler) - в функции handler выполнит соответствующее действие.

Ох, спасибо! Более понятная форма!...

Скажите пожалуйста, а зачем заморачиваться как в примерах К. Мука?
..например вот, только что написал по его примерам =>

Main
Код AS3:

package  {
        import flash.display.*;
        import flash.events.*;
        import flash.ui.*;
        import flash.utils.Timer;
 
        public class Main extends MovieClip{
        private var timer:Timer;
        private var mama:Array = new Array();
        private var massiveSize:int = 10;
 
                public function Main() {
                        // constructor code
                        var i:int = 0;
                        var _some:Rect = new Rect(40);
                        _some.x = 100;
                        _some.y = 100;
                        addChild(_some);
 
                        _some.addEventListener(AlphaEvent.ALP, killSome); //ВНИМАНИЕ ОБРАТИТЬ СЮДА
                        _some.randColor();
 
                        function killSome(e:AlphaEvent):void{                    //ВНИМАНИЕ ОБРАТИТЬ СЮДА
                                trace("AlphaEvent.ALP was DESTROED");
                                _some.removeEventListener(AlphaEvent.ALP, killSome);
                                _some = null;
                        }
                }
        }
}

Rect
Код AS3:

package  {
        import flash.display.*;
        import flash.events.*;
        import flash.ui.*;
 
        public class Rect extends Sprite {
        private var _graph:Shape;
        private var _size:int = 10;
        private var _color:uint = 0x000000;
        private var _alp:Number = 0.9;
 
                public function Rect(size:int = 10) {
                        // constructor code
                        _size = size;
 
                        _graph = new Shape();
                        _graph.graphics.beginFill(_color, 1);
                        _graph.graphics.drawRect(0, 0, _size, _size);
                        _graph.graphics.endFill();
                        addChild(_graph);
                }
 
                public function randColor():void{
                        _graph.graphics.clear();
 
                        _color = Math.floor(Math.random()*999999);
 
                        _graph.graphics.beginFill(_color, 1);
                        _graph.graphics.drawRect(0, 0, _size, _size);
                        _graph.graphics.endFill();
 
                        _graph.addEventListener(Event.ENTER_FRAME, goAlphaDown);
                }
 
                public function goAlphaDown(e:Event):void{
                        _graph.alpha = _alp;
                        _alp -= 0.02;
                        if( _alp < 0 ){
                                _graph.removeEventListener(Event.ENTER_FRAME, goAlphaDown);
                                trace("Event.ENTER_FRAME was DESTROED");
 
                                //ВНИМАНИЕ ОБРАТИТЬ СЮДА
                                var alpEvent:AlphaEvent = new AlphaEvent(AlphaEvent.ALP, true, true);
                                dispatchEvent( alpEvent );
                                //ВНИМАНИЕ ОБРАТИТЬ СЮДА
                        }
                }
        }
 
}

Alphaevent
Код AS3:

package  {
        import flash.events.Event;
 
        public class AlphaEvent extends Event{
        public static const ALP:String = "alpha";//Константа события альфа
 
                public function AlphaEvent(type:String,
                                                                  bubbles:Boolean = false,
                                                                  cancelable:Boolean = false) {
                        // constructor code
                        super(type, bubbles, cancelable);
                }
 
                public override function clone():Event{
                        return new AlphaEvent(type, bubbles, cancelable);
                }
 
                public override function toString():String{
                        return formatToString("AlphaEvent", "type", "bubbles", "cancelable", "eventPhase");
                }
 
        }
 
}


DaFive 03.12.2012 18:14

Ну всё правильно. Вы можете расширить класс Event, описав своё событие так как вам нужно.
С той же оперы, что и создать мувиклип с квадратом внутри на лету, выполняя все эти graphics.draw и т.п. или создать свой класс, расширяющий мувиклип, в котором это все заранее описано, а потом создать экземпляр этого расширенного класса.

PasserBy 03.12.2012 18:23

Цитата:

Сообщение от DaFive (Сообщение 1107663)
Ну всё правильно. Вы можете расширить класс Event, описав своё событие так как вам нужно.
С той же оперы, что и создать мувиклип с квадратом внутри на лету, выполняя все эти graphics.draw и т.п. или создать свой класс, расширяющий мувиклип, в котором это все заранее описано, а потом создать экземпляр этого расширенного класса.

Эм...попроще объясните пожалуйста =\...( + пример )

DaFive 03.12.2012 18:36

Эм, куда проще? Вам удобно создавать нужные вам объекты каждый раз описывая свойства и логику работы при создании?

Или удобно запихнуть все в один класс, описав все действия в нём, а потом создать экземпляр этого класса, не задумываясь, забыл ли указать какое-либо из свойств? То же и с событиями.

PasserBy 03.12.2012 18:46

Цитата:

Сообщение от DaFive (Сообщение 1107666)
Эм, куда проще? Вам удобно создавать нужные вам объекты каждый раз описывая свойства и логику работы при создании?

Или удобно запихнуть все в один класс, описав все действия в нём, а потом создать экземпляр этого класса, не задумываясь, забыл ли указать какое-либо из свойств? То же и с событиями.

А что делать с удалением "самого себя"?...говорят, что это "неприлично" чтобы это реализовывалось внутри экземпляра, а не родителя

Wolsh 03.12.2012 19:22

PasserBy, пока не поздно, почитайте Правила форума.
У нас не принято создавать "тему имени себя" и спрашивать в ней все, что придет в голову. Многие люди используют Поиск по форуму для нахождения ответов на свои вопросы (для этого, конечно, надо отложить на время веру в свою уникальность), а для эффективного поиска важно, чтобы тема была посвящена одному вопросу и имела правильное название, раскрывающее суть этой темы. Вы уже нарушили это правило, задав два несвязанных вопроса в названии, и теперь задаете третий. Я так понимаю, вопросы, озвученные в названии, уже исчерпаны? Можно закрывать?

По поводу событий. Есть два способа "своих" событий —
1. Использование класса Event. При этом задается только своё "имя" события, то есть строковый тип, как в примере dispatchEvent(new Event("моё_имя_события");
2. Расширение класса Event, то есть создание своего КЛАССА события (как в Вашем примере из Мука).
Расширяя класс, Вы можете добавлять в него собственные свойства любого типа, и тогда сам объект события, который передается в обработчик, сможет содержать/переносить/отдавать какую-то дополнительную информацию (подобно тому, как MouseEvent, расширяя Event, содержит данные о координатах мыши, состоянии служебных клавиш в момент события и т.п. полезные данные).

Добавлено через 6 минут
То есть конкретно "извращаться" как в данном примере нет никакого смысла, поскольку никаких пользовательских данных новый класс события не содержит. С таким же успехом можно было использовать и простой Event, только константу с именем пришлось бы хранить в другом месте.


Часовой пояс GMT +4, время: 03:58.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.