Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ивентная модель Flash (http://www.flasher.ru/forum/showthread.php?t=137379)

greegreeman 11.03.2010 21:14

ивентная модель Flash
 
Господа, опасаюсь, что затронул тему, на которую мне никто ничего не напишет, кроме как читай книги и т.д. Я хотел бы понять на примере какой-то схемы или абстракции как работает ивентная модель во Flash. Как взаимодействуют диспатчер с листнером, контроллером? Может кто-то решиться на пальцах объяснить или стрелочками показать как это устроено внутри...

Gaen 11.03.2010 21:56

http://help.adobe.com/en_US/ActionSc...0204-7e4f.html вот вам со стрелочками :)

KiL33 12.03.2010 01:06

Вложений: 1
Потратил два часа жизни, получился вот такой примерчик
Вложение 24003

Класс Main

Код AS3:

package {
        import components.CreateWindow;
        import events.CommonEvent;
        import flash.display.Sprite;
        import flash.events.*
        import flash.text.*
 
        public class Main extends Sprite {
                public var createWindow:CreateWindow;
 
                public function Main(){
 
                        init()
                }
 
                private function init():void {
 
                        createWindow = new CreateWindow()
                        addChild(createWindow)
                        //получаем события из CreateWindow
                        createWindow.addEventListener(CommonEvent.DRAG_WINDOW_DOWN, WinDragStart);
                        createWindow.addEventListener(CommonEvent.DRAG_WINDOW_UP, WinDragStop);
                        createWindow.addEventListener(CommonEvent.WINDOW_REMOVE, RemoveWindow);
 
                }
 
                private function WinDragStart(e:CommonEvent):void{
                        trace("Drag_Start")
                        var val:uint = e.t
                        e.target.startDrag()
                        e.target.alpha = Number("0."+val)
                }
 
                private function WinDragStop(e:CommonEvent):void{
                        trace("Drag_Stop")
                        var val:uint = e.t
                        e.target.stopDrag()
                        e.target.alpha = Number(val)
                }
                private function RemoveWindow(e:CommonEvent):void{
                        trace("Remove")
                        removeChild(createWindow);
                }
        }
}

Класс CreateWindow в пакете components

Код AS3:

package components {
 
        import events.CommonEvent;
        import flash.display.Sprite;
        import flash.display.Shape;
        import flash.events.*
 
        public class CreateWindow extends Sprite {
 
                private var container:Sprite;
                private var line:Shape;
                private var line2:Shape;
 
                private var closeWindow:CloseWindow;
 
                public function CreateWindow(){
                closeWindow = new CloseWindow()
                        line = new Shape()
                                line.graphics.lineStyle(2,0xFFFFFF)
                        line.graphics.lineTo(10, 10);
                        line.x = 85
                        line.y = 5
 
////////////line2
 
                        line2 = new Shape()
                                line2.graphics.lineStyle(2,0xFFFFFF)
                        line2.graphics.lineTo(10, 10);
                        line2.rotation = 90
                        line2.x = 95
                        line2.y = 5
 
                        container = new Sprite()
                        container.graphics.beginFill(0xCCFF00);
                                container.graphics.drawRect(0, 0, 100, 100);
                        container.graphics.endFill()
 
                        container.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
                        container.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
                        closeWindow.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownRemove);
 
                        addChild(container)
                        addChild(closeWindow)
                        addChild(line)
                        addChild(line2)
 
                }
                private function mouseDownHandler(e:MouseEvent):void{
                        //диспатчим в main
                        dispatchEvent(new CommonEvent(CommonEvent.DRAG_WINDOW_DOWN, /*параметр прозрачности окна*/5));
                }
                private function mouseUpHandler(e:MouseEvent):void{
                        //диспатчим в main
                        dispatchEvent(new CommonEvent(CommonEvent.DRAG_WINDOW_UP, /*параметр прозрачности окна*/1));
                }
                private function mouseDownRemove(e:MouseEvent):void{
                        //диспатчим в main
                        dispatchEvent(new CommonEvent(CommonEvent.WINDOW_REMOVE, 0));
                }
        }
}


Класс CloseWindow в пакете components

Код AS3:

package components {
 
        import flash.display.Sprite;
        import flash.display.Shape;
 
        public class CloseWindow extends Sprite {
                private var container:Shape;
 
                public function CloseWindow(){
 
                        container = new Shape()
                        container.graphics.beginFill(0x000000);
                                container.graphics.drawRect(80, 0, 20, 20);
                        container.graphics.endFill()
                        addChild(container)
                }
        }
}

Класс CommonEvent в пакете events

Код AS3:

package events{
 
        import flash.events.Event;
 
        public class CommonEvent extends Event{
 
                private var _t:uint;
 
                //храним имена всех событий
                public static const DRAG_WINDOW_DOWN:String = "drag_window_down";
                public static const DRAG_WINDOW_UP:String = "drag_window_up";
                public static const WINDOW_REMOVE:String = "window_remove";
 
                public function CommonEvent(type:String, /*bubbles:Boolean = false, cancelable:Boolean = false,*/ val:uint) {
                        super(type, /*bubbles, cancelable,*/ true, false);
 
                        //параметр прозрачности окна
                        _t = val;
                }
 
                public function get t():uint {
                        return _t;
                }
        }
}


Исходник принципиально не выложил, попробуйте сперва сами разобраться :)
Что не ясно спрашивайте.

Котяра 12.03.2010 10:28

KiL33 :это в ту тему?

на русском: http://help.adobe.com/ru_RU/ActionSc...0204-7e4f.html
а вообще в начале освоения AS3 меня жутко смущали наименования target и currentTarget - никак не мог понять почему это "цель" и " текущая цель".
по нормальной логике целью является объект хранящий листенеры или сам листенер.

По нормальной логике именования объект являющийся инициатором события должен называться sender (в AS3==target) - объект от которого получено событие currentSender (currentTarget)
Может быть адобовцы не захотели чтобы их сравнивали с C# итп. может еще что.. я конечно уже всё давно понял и привык, но для новичков бывает сложновато въехать..
Цитата:

Свойство target имеет ссылку на объект, являющийся целью события. В ряде случаев она дается напрямую (например, при активации микрофона целью объекта события становится объект Microphone). Однако если цель находится в списке отображения, необходимо учесть иерархию списка отображения. Например, если пользователь вводит данные о щелчке мыши в тот момент, когда объекты списка отображения перекрываются, Flash Player и AIR всегда выбирают в качестве цели события объект, который находится дальше всего от рабочей области.
хуже не придумаешь.
Какая цель может быть у события? У события как абстрактного объекта может быть только инициатор (sender) и может быть еще корреспондент вещающий события (currentSender) , который часто и есть инициатор, и отличается от него только в случае всплывающих событий. всё..
слушатель(listener) - вот это по сути цель события, но само событие к ним не привязано. слушатель только слушает у корреспондентов события определённого типа. и принимает их в качестве параметра.

KiL33 12.03.2010 11:52

Cтрелочки, конечно, хорошо, но в коде-то оно нагляднее :)

alexcon314 12.03.2010 16:11

Насколько я понял, в документе http://help.adobe.com/ru_RU/ActionSc...0204-7e4f.html речь идет о том, как рассылает события рантайм плеера (сам плеер). Тогда все довольно логично: рантайм ловит, допустим, клик, порождает эвент-объект и ставит его в очередь на прокачку от стейджа до целевого узла (чилда) и обратно. Сам целевой узел определяется рантаймом в момент щелчка. Энтерфрейм шлется на прямую. В этом смысле все понятно. target, currentTarget - вполне оправдано употребляются в этом контексте. Почему не все шлется на прямую, а прокачивается очередь - тоже понятно, так проще ловить события в одной веток иерархии отображения. Если целевой объект не входит в иерархию отображения, то ивент шлется ему напрямую, (пример - сокет), что тоже логично.
Если мы добавили листенера на клик по целевому узлу, то вместе с целевым узлом, клик получит и листенер. Это логично делать, если листенер сидит в другой ветке иерархии отображаемых объектов или ниже/на том же уровне в той же ветке. Либо если целевой объект не входит в иерархию отображения вообще. Или я что-то попутал?
Пользовательские события порождаются не рантаймом, а кодом, вот тут, пожалуй о целевом объекте речь идти не может. Пользовательский эвент рассылается по списку листенеров, добавленных к объекту-источнику, в очередь прокачки такой эвент совать ни к чему. Или я опять чего-то попутал?

Котяра 12.03.2010 17:33

Может быть в механизме реализации событий это и понятно, но по большому счёту пользователю должно быть наплевать как это реализовано в плеере. для него логичнее что: sender - это клип на который нажали и он отослал событие о нажатии на себя..

etc 12.03.2010 18:59

KiL33, что за классы «СоздатьОкно» и «ЗакрытьОкно»? Давно действие стало классом?

KiL33 12.03.2010 22:21

etc, ты имеешь в виду неправильное именование классов?

ок, пусть CloseWindow будет ButtonClose -- CreateWindow будет NewWindow от этого правда что-то изменится?:)

etc 12.03.2010 22:42

Нет, в данном случае нет. Сущность не может иметь название в виде действия или глагола.


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

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