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

zerAlex2 23.12.2013 05:36

Пользовательское событие для родителя
 
Доброго времени суток.
Решил перейти с FlashIDE на FlashDevelop, а за одно отказаться от схем с parent, только вот беда - пользовательские события. Топиков по теме куча, а ясности никакой по теме нет.
Вопрос собственно: можно ли создавать и отслеживать пользовательское событие в экземплярах классов, унаследованных не от Event или EventDispatcher? Это принципиально, т.к. хочу генерить событие из экземпляра класса Away3D, а там своё "наследие".
По сути задача такая: есть 2 класса, один в другом
Код AS3:

package {
 import flash.events.Event;
 import flash.display.Sprite;
 
 import myClassB;
 
  public class myClassA extends Sprite {
 
    var num:Number;
    var myClip:myClassB;
 
      public function myClassA ():void{
        num=0;
        myClip=new myClassB();
        addChild(myClip);
        myClip.addEventListener(Event.VALUE_CHANGED, alert); //Собственно тут хочется прослушать
      }
 
    function alert(e:Event):void{
      trace("Alert");
    }
 
 }
}

Второй класс:
Код AS3:

package {
 import flash.events.Event;
 import flash.display.Sprite
  public class myClassB extends Sprite {
  stetic var numB:Number;
    public function myClassB ():void{
      setNewNumb(1234);
    }
    public function set setNewNumb(n:Number):void {
        numB = n;
        .....dispatchEvent(new Event(Event.VALUE_CHANGED));//Тут как-то нужно генерировать событие
    } 
 
 }
}

Как-то так.
Честно говоря, это не первая попытка освоить события, но единой картины нет, не могу сложить в кучу что к чему. Кстати сказать, обилие вопросов на эту тему свидетельствует, что схема работы событий не понятна очень многим.
Спасибо.

bifidokk 23.12.2013 09:29

Можно завести в классе экземпляр EventDispatcher и работать уже с ним, тогда не придется наследоваться от Event и EventDispatcher или их детей

caseyryan 23.12.2013 09:39

Ну, вообще-то Sprite уже унаследован от EventDispatcher, поэтому проблемы я тут никакой не вижу.
Смотрите документацию -> цепочки наследования классов, если что-то не ясно.

silin 23.12.2013 10:06

для экземплярах классов, унаследованных не от EventDispatcher придется иметь 'на борту' класса свой eventDispatcher и вещать с его помощью, т.е. методы EventDispatcher должны быть продублированы в классе с переадресацией к этому eventDispatcher, типа
Код AS3:

package
{
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.IEventDispatcher;
 
        public class NewClass implements IEventDispatcher
        {
                private var myDispatcher:EventDispatcher
 
                public function NewClass()
                {
                        myDispatcher = new EventDispatcher(this);
                }
 
                public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
                {
                        myDispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
                }
 
                public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
                {
                        myDispatcher.removeEventListener(type, listener, useCapture);
                }
 
                public function dispatchEvent(event:Event):Boolean
                {
                        myDispatcher.dispatchEvent(event)
                }
                // и т.д.
 
        }
 
}

для вашего же примера, этого не надо потому как Sprite наследует EventDispatcher
вы просто пытаетесь слушать до того как подписались на рассылку
Код AS3:

package
{
        import flash.events.Event;
        import flash.display.Sprite
 
        public class myClassB extends Sprite
        {
                static public var numB:Number;
 
                public function myClassB():void
                {
                        setNewNumb(1234);// здесь не выйдет послушать, слушатель еще не добавлен
                }
 
                public function setNewNumb(n:Number):void
                {
 
                        numB = n;
                        dispatchEvent(new Event(Event.CHANGE));
                }
 
        }
}

Код AS3:

package
 
{
        import flash.events.Event;
        import flash.display.Sprite;
 
        import myClassB;
 
        public class myClassA extends Sprite
        {
 
                private var myClip:myClassB;
 
                public function myClassA():void
                {
                        myClip = new myClassB(); // еще не слушаем
                        addChild(myClip);
                        myClip.addEventListener(Event.CHANGE, alert); //Собственно тут хочется прослушать
 
                        myClip.setNewNumb(444); // теперь слушаем
                }
 
                private function alert(e:Event):void
                {
                        trace("Alert, num: ", myClassB.numB);
                }
 
        }
}



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

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