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

WaldeMar1321 18.11.2015 21:22

Пользовательские слушатели событий.
 
Здравствуйте, есть такой код в инициализации класса "героя":
Код AS3:

this.addEventListener(Event.ADDED_TO_STAGE, Added);
this.addEventListener(cEvents.INDEX_CHANGE, changed);
if (this.hasEventListener(cEvents.INDEX_CHANGE)) trace("have it");//проверка
//.....
private function changed(e:cEvents):void
{
        this.StageIndex = stage.getChildIndex(this);
        trace(this.StageIndex, "changed");//опять проверка (не работает. эта функция не вызывается)=(
}

В файле cEvents.as:
Код AS3:

package utils 
{
        import flash.events.EventDispatcher;
        import flash.events.Event;
        public class cEvents extends Event
        {
                public static var INDEX_CHANGE:String = "INDEX_CHANGE";
 
                public function cEvents(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
                {
                        trace(type);//проверка на досягаемость этого места
                        super(type, bubbles, cancelable) ;
 
                }
        }
}

В момент вызова:
Код AS3:

public function swap(e:MouseEvent):void
{
        stage.swapChildrenAt(2, 3);//пока только два
        dispatchEvent(new cEvents(cEvents.INDEX_CHANGE));
}

trace(type) из cEvents работает как надо при нажатии. Внутри же класса, который вызывает события, ничего не происходит. Может кто-то сталкивался?
Спасибо!

GBee 18.11.2015 21:41

А герой где лежит?
Может стоит добавить пузырьков?

WaldeMar1321 18.11.2015 21:45

Каких пузырьков, как это сделать и что это даст?

GBee 18.11.2015 21:46

Лучше ответить на первый вопрос. Метод swap чей?

caseyryan 18.11.2015 21:47

Тут два варианта.
1) метод swap(e:MouseEvent) вообще не вызывается, потому что нахоидтся не в классе персонажа
2) Подписан не тот экземпляр, который шлет событие

п.с.
вот это:
Код AS3:

trace(type);//проверка на досягаемость этого места

Вообще бред. Естественно этот код сработает, если создать новое событие. Это же конструктор.
Ровно как и вот эта бессмысленная проверка
Код AS3:

this.addEventListener(cEvents.INDEX_CHANGE, changed);
if (this.hasEventListener(cEvents.INDEX_CHANGE)) trace("have it");//проверка

Конечно же слушатель будет, сразу после того как его добавили

WaldeMar1321 18.11.2015 21:48

метод swap находится в Main

Добавлено через 1 минуту
метод swap работает, иначе бы не менялось положение в контейнере отображаемых объектов

caseyryan 18.11.2015 21:50

Цитата:

Сообщение от WaldeMar1321 (Сообщение 1189115)
метод swap находится в Main

Что он там делает? Подписка в этом случае должна происходить не в классе героя, а к классу Main.
Здесь Main шлет событие INDEX_CHANGED. Естественно герой никак не может его услышать.

Если предположить, что герой тоже валяется в Main, и называется hero (к примеру). То, чтобы он услышал это событие, нужно сделать так:
Код AS3:

public function swap(e:MouseEvent):void
{
        stage.swapChildrenAt(2, 3);//пока только два
        hero.dispatchEvent(new cEvents(cEvents.INDEX_CHANGE));
}

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

Либо, другой вариант. В классе героя должна быть ссылка на Main, и подписка слушателя должна быть прикручена к этой ссылке
как-то так
Код AS3:

main.addEventListener(cEvents.INDEX_CHANGE, changed);

Советую почитать в справке как работают события, и погулить тоже. Так же у Колина Мука довольно неплохо описано всё

WaldeMar1321 18.11.2015 21:51

именно эта проверка
Код AS3:

trace(type);//проверка на досягаемость этого места

единственное что показывает что это вообще хоть как-то работает. вызывается каждый раз при нажатии.

Добавлено через 2 минуты
а в чем тогда смысл этих событий (системы событий). Один раз в теле класса прописал, и генерируй их где надо. Везде где есть нужный импорт, они должны прослушиваться.(?!!)

caseyryan 18.11.2015 21:55

Цитата:

Сообщение от WaldeMar1321 (Сообщение 1189118)
именно эта проверка
Код AS3:

trace(type);//проверка на досягаемость этого места

единственное что показывает что это вообще хоть как-то работает. вызывается каждый раз при нажатии.

Добавлено через 2 минуты
а в чем тогда смысл этих событий (системы событий). Один раз в теле класса прописал, и генерируй их где надо. Везде где есть нужный импорт, они должны прослушиваться.(?!!)

События в AS3 очень хорошо продуманы. Я бы сказал, одна из лучших реализаций событий, которые я встречал.
Здесь на лицо просто полное непонимание.
Еще раз повторю
Цитата:

Советую почитать в справке как работают события, и погулить тоже. Так же у Колина Мука довольно неплохо описано всё

WaldeMar1321 18.11.2015 22:08

Отправить в гугл и я могу. Я два дня ищу решение, и перечитал почти все статьи и мануалы что нашел, в основном на офф сайте адоб. Как они описывали, так я и сделал. Может кто-то еще сможет помочь. Я обращаюсь сюда в крайнем случае.


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

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