Форум 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=109412)

Greenish 13.03.2008 22:52

Объясните пожалуйста почему не работает следующий код?
Код:

package {
        import flash.display.*;
        import flash.events.*;
        public class Main extends Sprite {
                public function Main () {
                        var mon=new Sprite();
                        mon.addEventListener("gotoPos", goto);
                        dispatchEvent(new Event("gotoPos",true,false));
                }
                public function goto() {
                        trace("heaaaa");
                }
        }
}

Не смотрите что создается просто экземпляр Sprite, изначально был класс который наследуется от Sprite. Упростил...

Наверное не совсем понятно... Лучше на примере 2 классов:
1-й класс:
Код:

package {
        import flash.display.*;
        import flash.events.*;
        public class Main extends Sprite {
                public function Main () {
                        var mon=new mySprite();
                        dispatchEvent(new Event("gotoPos"));
                }
        }
}

2-й класс:
Код:

package {
        import flash.display.*;
        import flash.events.*;
        public class mySprite extends Sprite {
                public function mySprite () {
                        addEventListener("gotoPos", goto);
                }
                public function goto() {
                        trace("heaaaa");
                }
        }
}

получится если mon.dispatchEvent(new Event("gotoPos"));
но тогда зачем мне диспатчер нужен? если я знаю мувик. В проекте же я не буду знать его. Экземпляров будет много и надо чтобы все реагировали на событие

etc 14.03.2008 00:22

Определитесь, у кого и на какие события вы подписываетесь.
Потому как вы подписываетесь на события объекта, которые он не ващает.

Greenish 14.03.2008 00:29

ну это я понял. но как же тогда поступить? допустим я не просто создаю var mon=new mySprite();, а в цикле создаю несколько эземпляров. и надо чтобы по определенному событию в классе Main все они отреагировали. Не подскажите как это сделать?

etc 14.03.2008 00:43

В сторону всплывающих событий смотрите.

Greenish 14.03.2008 13:38

Я разобрался. Спасибо товарищу __etc! Для тех кто будет искать подобный ответ покажу на примере как я сделал. Если это не рационально, поправьте
Для того чтобы отовсюду принимать события я сделал класс синглтон от класса EventDispatcher. Например так:
Код:

package {
        import flash.events.EventDispatcher;
        import flash.events.Event;
        public class MyDispatcher extends EventDispatcher {
                private static  var _inst:MyDispatcher;
                private static  var __allowInstantiation:Boolean = false;
                public static var ACTION:String = "action";
                public static function get inst():MyDispatcher {
                        if (!_inst) {
                                __allowInstantiation = true;
                                _inst = new MyDispatcher();
                                __allowInstantiation = false;
                        }
                        return _inst;
                }
                public function MyDispatcher():void {
                        if (!__allowInstantiation) {
                                throw new Error("Вы не можете создавать экземпляры класса при помощи конструктора. Для доступа к экземпляру используйте Singleton.instance.");
                        }
                }
               
                public function doAction(action:String):void {
                        dispatchEvent(new Event(action));
                }
        }
}

Рутовый класс:
Код:

package {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
        public class Main extends Sprite {
                public function Main () {
                        var mon:MySprite=new MySprite();
                        MyDispatcher.inst.addEventListener(MyDispatcher.ACTION, doingSomething);
                        MyDispatcher.inst.doAction(MyDispatcher.ACTION);
                }
                public function doingSomething(event:Event) {
                        trace("event from Main");
                }
        }
}

И класс от спрайта:
Код:

package {
        import flash.display.*;
        import flash.events.*;
        public class MySprite extends Sprite {
                public function MySprite () {
                        MyDispatcher.inst.addEventListener(MyDispatcher.ACTION, doingSomething);
                }
                public function doingSomething(event:Event) {
                        trace("event from MySprite");
                }
        }
}

В итоге в любом классе мы можем подписаться на события, тк MyDispatcher - синглтон.

etc 14.03.2008 15:09

Прочитайте ещё раз про всплывающие события.

Greenish 16.03.2008 23:39

хм. ну вот ваши слова: "....событие от детей поднимается вверх по родителям..." Я так понимаю это и есть всплывающие события. Но мне то надо не от детей к родителям, а в любом классе. Вот мой пример это реализовывает. Я не прав?

точнее принцип то конечно от детей к родителям :) но все таки почему еще раз прочитать я не понимаю..

$mival 16.03.2008 23:44

этк, ссылку в студию

terbooter 17.03.2008 10:21

http://riapriority.com/blogs/constantiner.php?cat=40

etc 17.03.2008 10:33

Цитата:

Сообщение от $mival
этк, ссылку в студию

Ссылку на хелп дать? Я думал, вы её сами знаете.

Greenish, у вас оба класса наследуются от DisplayObject, поэтому почему бы не применить встроенную модель событий? Организовывать некий синглтон, рассылающий события — очень спорное и неэффективное решение.


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

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