Просмотр полной версии : Алгоритмы Пользовательские слушатели событий.
WaldeMar1321
18.11.2015, 21:22
Здравствуйте, есть такой код в инициализации класса "героя":
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:
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) ;
}
}
}
В момент вызова:
public function swap(e:MouseEvent):void
{
stage.swapChildrenAt(2, 3);//пока только два
dispatchEvent(new cEvents(cEvents.INDEX_CHANGE));
}
trace(type) из cEvents работает как надо при нажатии. Внутри же класса, который вызывает события, ничего не происходит. Может кто-то сталкивался?
Спасибо!
А герой где лежит?
Может стоит добавить пузырьков?
WaldeMar1321
18.11.2015, 21:45
Каких пузырьков, как это сделать и что это даст?
Лучше ответить на первый вопрос. Метод swap чей?
caseyryan
18.11.2015, 21:47
Тут два варианта.
1) метод swap(e:MouseEvent) вообще не вызывается, потому что нахоидтся не в классе персонажа
2) Подписан не тот экземпляр, который шлет событие
п.с.
вот это:
trace(type);//проверка на досягаемость этого места
Вообще бред. Естественно этот код сработает, если создать новое событие. Это же конструктор.
Ровно как и вот эта бессмысленная проверка
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
метод swap находится в Main
Что он там делает? Подписка в этом случае должна происходить не в классе героя, а к классу Main.
Здесь Main шлет событие INDEX_CHANGED. Естественно герой никак не может его услышать.
Если предположить, что герой тоже валяется в Main, и называется hero (к примеру). То, чтобы он услышал это событие, нужно сделать так:
public function swap(e:MouseEvent):void
{
stage.swapChildrenAt(2, 3);//пока только два
hero.dispatchEvent(new cEvents(cEvents.INDEX_CHANGE));
}
Но это так же бессмысленно, потому что можно просто вызывать у героя какой-то метод.
Либо, другой вариант. В классе героя должна быть ссылка на Main, и подписка слушателя должна быть прикручена к этой ссылке
как-то так
main.addEventListener(cEvents.INDEX_CHANGE, changed);
Советую почитать в справке как работают события, и погулить тоже. Так же у Колина Мука довольно неплохо описано всё
WaldeMar1321
18.11.2015, 21:51
именно эта проверка
trace(type);//проверка на досягаемость этого места
единственное что показывает что это вообще хоть как-то работает. вызывается каждый раз при нажатии.
Добавлено через 2 минуты
а в чем тогда смысл этих событий (системы событий). Один раз в теле класса прописал, и генерируй их где надо. Везде где есть нужный импорт, они должны прослушиваться.(?!!)
caseyryan
18.11.2015, 21:55
именно эта проверка
trace(type);//проверка на досягаемость этого места
единственное что показывает что это вообще хоть как-то работает. вызывается каждый раз при нажатии.
Добавлено через 2 минуты
а в чем тогда смысл этих событий (системы событий). Один раз в теле класса прописал, и генерируй их где надо. Везде где есть нужный импорт, они должны прослушиваться.(?!!)
События в AS3 очень хорошо продуманы. Я бы сказал, одна из лучших реализаций событий, которые я встречал.
Здесь на лицо просто полное непонимание.
Еще раз повторю
Советую почитать в справке как работают события, и погулить тоже. Так же у Колина Мука довольно неплохо описано всё
WaldeMar1321
18.11.2015, 22:08
Отправить в гугл и я могу. Я два дня ищу решение, и перечитал почти все статьи и мануалы что нашел, в основном на офф сайте адоб. Как они описывали, так я и сделал. Может кто-то еще сможет помочь. Я обращаюсь сюда в крайнем случае.
caseyryan
18.11.2015, 22:16
я уже выше написал в чем проблема
http://www.flasher.ru/forum/showpost.php?p=1189117&postcount=7
Надо бы читать свою же тему, а не пытаться писать в ней сообщения быстрее всех
Bletraut
18.11.2015, 22:20
Видимо плохо читал, всё должно работать. Выложи полный код.
Добавлено через 5 минут
В качестве теста можешь написать в классе героя
public function swap(e:MouseEvent):void
{
stage.swapChildrenAt(2, 3);//пока только два
dispatchEvent(new Event("Test_01"));
}
и подписаться на него,
this.addEventListener("Test_01", changed);
private function changed(e:Event):void
{
trace("WORK!!!");
}
Это 100% рабочий вариант, если не работает, то ты делаешь что-то не так или неправильно объясняешься.
Ваш герой слышит только себя, а ему в этот момент окружающие орут. Прям как ТС :о). Но в вашем случае вообще проще не кричать герою, а напрямую заставить его что-то сделать. Родитель управляет детьми и слушает реакцию детей и опять реагирует на их реакцию.
WaldeMar1321
20.11.2015, 16:33
Я понял что вы хотите мне сказать. очень хреново что события нужно адресовать только конкретному объекту, иначе у меня бы куча объектов отслеживали бы смену своего индекса в контейнере отображения через одну функцию где это происходит. Типа, объекты двигаются по сцене, и есть один "смотритель" который меняет их положение в контейнере относительно статичных объектов. И вызывает пользовательское событие которое слушается всеми этими объектами. Сохранять их индексы внутри самих объектов, нужно для будущего упрощения доступа.
З.Ы. Я только что понял что оказывается на этом форуме есть и другая страница сообщений. случайно глянул в правый нижний угол, и только что прочитал ваши ответы. Нелепо получилось, извините.
caseyryan
20.11.2015, 16:56
очень хреново что события нужно адресовать конкретному объекту
Нет, это не хреново. Это хорошо и правильно. Может просто не сразу понятно
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.