Как правильно применить dispatchevent();

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Аватара пользователя
GrafMine
Сообщения: 24
Зарегистрирован: 11 ноя 2010, 00:05

Как правильно применить dispatchevent();

Сообщение GrafMine »

Есть три файла AS3

Main.as

Код: Выделить всё

package {    import flash.display.*;    import flash.events.*;     public class Main extends Sprite     {        private var _instance:A= new A();        private var money:money  = 10;        public function Main():void         {                      //...            _instance.addEventListener(WidgetEvent.SERVICE_SELECT, settingsHandler);                      }                         //... more code                                  if(bullet.hitTestObject(target)){                target.health -= TURRET_DAMAGE;// - target = A()                                         //...            }                private function settingsHandler(e:WidgetEvent):void {            switch(e.value) {                case 0: {                    money = money +30;                    break;                }            }        }             }}
A.as

Код: Выделить всё

package  {    import flash.display.*;    import flash.events.*;     public class A extends Sprite    {        public var health:int = 10;         public function A()         {                graphics.beginFill(0xFFFFF0);                graphics.drawCircle(12.5,12.5,4);                graphics.endFill();                this.addEventListener(Event.ENTER_FRAME, eFrameEvents);         }        private function eFrameEvents(e:Event):void {            if(health <= 0){                    if (this.parent) {                        moneyUp();                        this.parent.removeChild(this); }                        this.removeEventListener(Event.ENTER_FRAME, eFrameEvents);                          }        }        public function moneyUp():void {            var _e:WidgetEvent = new WidgetEvent(WidgetEvent.SERVICE_SELECT);            _e.value = 0;            dispatchEvent(_e);        }    }}
WidgetEvent.as

Код: Выделить всё

package {    import flash.display.DisplayObject;    import flash.events.Event;        public class WidgetEvent extends Event {        static public const SERVICE_SELECT      :String = 'serviceSelect';        public var value:int;        public function WidgetEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) {             super(type, bubbles, cancelable);        }         public override function clone():Event {            var _e:WidgetEvent = new WidgetEvent(type, bubbles, cancelable);            _e.value = value;            return _e;        }         public override function toString():String {             return formatToString("WidgetEvent", "type", "bubbles", "cancelable", "eventPhase");         }    } }
Суть проблемы в том что не трейсится с Main класса функция settingsHandler, требуюсь в вашей помощи и разъяснении ситуации :)
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Как правильно применить dispatchevent();

Сообщение bodnar »

ну сначала надо проверить вызывается ли moneyUp впринципе, вставь туда трейс
да и вообще все внутренности этого метода оберни в try catch
Аватара пользователя
GrafMine
Сообщения: 24
Зарегистрирован: 11 ноя 2010, 00:05

Re: Как правильно применить dispatchevent();

Сообщение GrafMine »

bodnar писал(а):ну сначала надо проверить вызывается ли moneyUp впринципе, вставь туда трейс
да и вообще все внутренности этого метода оберни в try catch
Да все трейсится кроме той функции что указал в теме.
Очень нужно понять почему так...
если в Main классе написать :

Код: Выделить всё

_instance.moneyUp();// <- так трейсится , но проблема в том что в классе Main эта строка мне не нужна 
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Как правильно применить dispatchevent();

Сообщение bodnar »

Код: Выделить всё

private function eFrameEvents(e:Event):void {             trace(1);            if(health <= 0){                     trace(2);                    if (this.parent) {                            trace(3);                                                     moneyUp();                           this.parent.removeChild(this);                           trace(4);                     }                        this.removeEventListener(Event.ENTER_FRAME, eFrameEvents);                         }        }        public function moneyUp():void {          trace(5);                       var _e:WidgetEvent = new WidgetEvent(WidgetEvent.SERVICE_SELECT);            _e.value = 0;            dispatchEvent(_e);          trace(6);        }
вот так что выведет?
Аватара пользователя
GrafMine
Сообщения: 24
Зарегистрирован: 11 ноя 2010, 00:05

Re: Как правильно применить dispatchevent();

Сообщение GrafMine »

bodnar писал(а):вот так что выведет?
1
2
3
5
6
4
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Как правильно применить dispatchevent();

Сообщение bodnar »

хм...
а если перед
_instance.addEventListener(WidgetEvent.SERVICE_SELECT, settingsHandler);
добавь trace(0);
Аватара пользователя
GrafMine
Сообщения: 24
Зарегистрирован: 11 ноя 2010, 00:05

Re: Как правильно применить dispatchevent();

Сообщение GrafMine »

трейсится,я сам не могу понять в чем проблема :(
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Как правильно применить dispatchevent();

Сообщение bodnar »

начинать закомментировать по очереди все строчки
начни с удаления объекта и далее...
Аватара пользователя
GrafMine
Сообщения: 24
Зарегистрирован: 11 ноя 2010, 00:05

Re: Как правильно применить dispatchevent();

Сообщение GrafMine »

bodnar писал(а):начинать закомментировать по очереди все строчки
начни с удаления объекта и далее...
Я нашел можно так сказать проблему, если:

Код: Выделить всё

 private function eFrameEvents(e:Event):void {          moneyUp();//------ тут функция срабатывает, если поместить в if уже нет, почему так ?             if(health <= 0){                    if (this.parent) {                           this.parent.removeChild(this);                      }                        this.removeEventListener(Event.ENTER_FRAME, eFrameEvents);                         }        } 
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Как правильно применить dispatchevent();

Сообщение bodnar »

это значит что иф не выполняется ... но ты же сказал что трейсы вывели
1
2
3
5
6
4
ты либо наврал, либо куда то не туда их вставил
Ответить