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

DZHETIGAPA 23.02.2011 23:48

Не диспачится событие
 
Пока окончательно события понять не могу. Как я понял, они диспачатся и передаются вверх. Я создаю класс Region и в нем диспатчу событие. Во CS3 создаю различные фигурки и делаю им расширение классом Region. Мне нужно, чтобы в основном классе вызвалось продиспатченное событие в классе Region.
Код AS3:

package  
{
        import flash.display.*;
        import flash.events.*;
        import fl.motion.Color;
 
        public class Region extends MovieClip
        {
 
                public static const CLICK_REG1:String = "clickreg1";
 
                public function Region():void
                {
                        this.addEventListener(MouseEvent.CLICK, onClick)
                }
 
                private function onClick(e:MouseEvent):void
                {
                        e.target.alpha = 0.5;
                        dispatchEvent(new Event(Region.CLICK_REG1))
                }       
 
        }
 
}
 
package 
{
        import flash.display.*;
        import flash.events.*;
        import fl.motion.Color;
 
        public class Shar extends Region
        {
 
                public function Shar():void
                {
 
                }
 
        }
}
 
package 
{
 
        /**
        * ...
        * @author Stas
        */

        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        Всякий код...
 
 
                        Потом, чтобы вызвать событие, продиспатченное в Region, создаю экземпляр его класса
                        var reg:Region = new Region();
                        reg.addEventListener(Region.CLICK_REG1, onClick);
 
                        Но событие не срабатывает.
 
                }
 
                private function onClick(e:Event):void
                {
                        trace("SOS")
                }
        }
 
}

Объясните пожалуйста, почему событие не срабатывает?

dimarik 24.02.2011 00:06

Вы путаете отношения наследования с деревом дисплей-листа.

DZHETIGAPA 24.02.2011 00:15

А объяснить сможете, пожалуйста. Как работает событие и в чем тут ошибка?

Добавлено через 27 минут
Как мне в таком случае вызвать событие, продиспатченное в Region?

mikhailk 24.02.2011 01:12

У Вас событие наверх диспатчится по клику мыша. Нет события клика мыша внутри региона.

DZHETIGAPA 24.02.2011 01:19

Почему это нет события? Вот событие клика внутри Региона
Код AS3:

public function Region():void 
                {
                        this.addEventListener(MouseEvent.CLICK, onClick)
                }
 
                private function onClick(e:MouseEvent):void
                {
                        e.target.alpha = 0.5;
                        dispatchEvent(new Event(Region.CLICK_REG1))
                }


mikhailk 24.02.2011 01:32

поставьте трейс сразу после e.target.alpha = 0.5;
обработчик события есть, просто оно не возникает

Вот рабочий код, если не ждать события MouseEvent.CLICK:

Код AS3:

package  
{
        import flash.display.*;
        import flash.events.*;
 
        public class Region extends MovieClip
        {
 
                public static const CLICK_REG1:String = "clickreg1";
 
                public function Region():void
                {
                }
 
                public function testEvent():void
                {
                        dispatchEvent(new Event(Region.CLICK_REG1))
                }       
 
        }
 
}
 
 
package
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        var reg:Region = new Region();
                        reg.addEventListener(Region.CLICK_REG1, onClick);
                        reg.testEvent();
                }
 
                private function onClick(e:Event):void
                {
                        trace("SOS")
                }
 
        }
 
}


DZHETIGAPA 24.02.2011 01:51

Цитата:

Сообщение от mikhailk (Сообщение 975704)
поставьте трейс сразу после e.target.alpha = 0.5;
обработчик события есть, просто оно не возникает

Мне надо, чтобы событие диспетчеризировалось в Регионе и шло в главный класс. В главном классе при возникновении события будут происходить определенные действия. ИМЕННО В ГЛАВНОМ КЛАССЕ, а не в самом Регионе.
Цитата:

Вот рабочий код, если не ждать события MouseEvent.CLICK:
Этот код-событие срабатывает сразу при добавлении на сцену главного класса. Мне же надо другое.

Ты меня немного не так понял, наверное. Как работает событие я знаю, но вот с пользовательскими событиями - еще путаюсь.

Так как грамотно организовать код?

mikhailk 24.02.2011 15:09

Если поставить трейс внутрь Region.onclick(), станет очевидно, что Region.onclick() не отрабатывает. Будет отрабатывать, будет и событие диспатчиться.

DZHETIGAPA 26.02.2011 17:56

Честно говоря, я так и не понял, о чем вы. Мне нужно вызвать событие в главном классе, продиспатченное в Регионе. Как это сделать? Вот вопрос!

Уважаемый форумчане, кто может ответить на данный вопрос?

cleptoman 26.02.2011 18:22

mikhailk, я так и не понял почему не должен сработать онКлик в риджионе, если он наследник мувика и есть некая кликабельная область (если есть конечно).

mikhailk 26.02.2011 19:10

все очень просто.

у автора стоит абсолютно рабочий код dispatchEvent(new Event(Region.CLICK_REG1)), который почему-то не работает.

что делает разумный человек?
наверное, он проверяет, а приходит ли управление в это место кода - в данном случае, отрабатывает ли метод onClick в классе Region.

как он это делает?
например, он ставит трейс перед фрагментом кода, который не отрабатывает (что я, собственно, и предложил автору)

почему я считаю, что код рабочий?
потому что я взял код автора, переименовал метод с неработающим dispatchEvent(new Event(Region.CLICK_REG1)), вызвал его напрямую и все отработало (см. приведенный фрагмент кода)

DZHETIGAPA 26.02.2011 19:41

Метод onclick в Регионе срабатывает. В этом проблем нет. Но не вызывается в главном классе.

Я еще раз все переписал и откомпилил.

mikhailk 26.02.2011 20:12

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        var reg:Region = new Region();
                        reg.addEventListener(Region.CLICK_REG1, onClick);
                        addChild(reg);
                }
 
                private function onClick(e:Event):void
                {
                        trace("SOS")
                }
 
        }
 
}
 
package 
{
        import flash.display.*;
        import flash.events.*;
 
        public class Region extends MovieClip
        {
 
                public static const CLICK_REG1:String = "clickreg1";
 
                public function Region():void
                {
                        this.graphics.beginFill(0xff0000);
                        this.graphics.drawRect(100, 100, 200, 200);
                        this.graphics.endFill();
 
                        this.addEventListener(MouseEvent.CLICK, onClick);
                }
 
                public function onClick(e:MouseEvent):void
                {
                        trace("onClick");
                        dispatchEvent(new Event(Region.CLICK_REG1))
                }       
 
        }
 
}


Johny_86 27.02.2011 01:03

Тут проблема в следующем. У тебя главный класс создает экземпляр класса Region. В главном классе ты вешаешь обработчик события. Но ты ведь на сцену не добавляешь Region объект. А в Region ты написал, что как только ПО НЕМУ кликнуть, то диспатчится событие. А как же ты по нему кликнешь, если его нету на сцене? ))) раз его нету на сцене, то кликнуть по нему ты не можешь и поэтому продиспатчить событие ты тоже не можешь. Тебе надо либо добавлять его на сцену в главном классе. Либо диспатчить не по клику, а в конструкторе, например.

Котяра 27.02.2011 16:15

Если диспатчить в конструкторе, то никогда не получится подписаться на событие до его диспетчеризации.
В конструкторе диспатчить события нельзя!

mikhailk 27.02.2011 16:24

можно :)
если слушать не на объекте, а на его родителе и баблинг поставить

но не нужно

Котяра 27.02.2011 16:26

Даже если слушатель на родителе - родитель возникает в момент addChild, что позже конструктора полюбому)

mikhailk 27.02.2011 16:36

да, действительно ))

Нет, все-таки можно.
Надо событие отправить на статическую переменную Main.instance (как пример) и ее же слушать.

Котяра 27.02.2011 20:30

Давайте закончим с бредом.
Цитата:

Надо событие отправить на статическую переменную Main.instance (как пример) и ее же слушать.
Я даже понял, что вы имели в виду, но это совсем не в тему.
правило:
В конструкторе диспатчить события нельзя!

Johny_86 28.02.2011 01:07

Цитата:

Сообщение от Котяра (Сообщение 976583)
Если диспатчить в конструкторе, то никогда не получится подписаться на событие до его диспетчеризации.
В конструкторе диспатчить события нельзя!

Cогласен. Не получится. Только если ставить таймер на диспатч, но это все бред ))) Мы говорили почему у него оно не диспатчится. А не диспатчится потому, что кликать не по чему, чтобы задиспатчить.

Psycho Tiger 28.02.2011 01:31

Цитата:

правило:
В конструкторе диспатчить события нельзя!
Общее правило. Наследник, в принципе, может подписаться в конструкторе на какое-либо событие с приватным хэндлером и нужно его дёрнуть, а исходников класса на руках нет (например, swc).
Но вы меня не слушайте, Котяра верно говорит )

mikhailk 28.02.2011 12:00

Никто не спорит насчет того, допустимо или нет диспатчить событие из конструктора. Нет, естественно.
Но на вопрос, существует ли вообще техническая возможность отправить событие из конструктора, ответ утвердительный. AS3 позволяет отправить событие из ЛЮБОЙ функции.

А так да, обсуждать нечего.


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

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