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

MrPoma 08.02.2010 15:01

Код AS3:

package{
        import flash.events.Event;
 
        public class LOLEvent extends Event{
                public static const LOL:String = 'lol';
 
                private var _lol:String;
                public function get lol():Stirng{
                        return this._lol;
                }
 
                public function LOLEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, lol:String=''){
                        super(type, bubbles, cancelable);
                        this._lol = lol;
                }
 
                public override function clone():Event{
                        return new LOLEvent(super.type, super.bubbles, super.cancelable, this._lol);
                }
        }
}

Код AS3:

super.addEventListener(LOLEvent.LOL, this.handlerLOL);
super.dispatchEvent(new LOLEvent(LOLEvent.LOL, false, false, 'ha-ha-ha'));
private function handlerLOL(event:LOLEvent):void{
        trace(event.lol);
}


uglan 08.02.2010 15:22

Сейчас попробую)

Добавлено через 55 минут
хм...класс работает, спасибо)
Но как мне его использовать в качестве реагирования на клик и наведение/отведение мышки?

zuxul 08.02.2010 17:33

В качестве реагирования на клик и наведение/отведение мышки нужно использовать функцию принимающую параметр MouseEvent
Код AS3:

function lolFunction (e:MouseEvent):void {...}

Если повесить эту функцию на несколько объектов, то нужно использовать e.target и e.currentTarget (Вам уже об этом говорили, но Вы это игнорируете)

wvxvw 08.02.2010 17:49

Когда срабатывает колбек то ситуации в которой ваша переменная объявленная в классе слушателе или в классе диспатчере недоступна просто не может быть потому что обе эти области видимости вам будут извесны в колбеке, первая - this, вторая - Event#target / Event#currentTarget - вы просто не там ищите. А передать дополнительные параметры в функцию у которой сигнатура это не позволяет не возможно никак, более того, это протовоестесственно и абсолютно противоречит здравому смыслу.

uglan 08.02.2010 18:26

Цитата:

В качестве реагирования на клик и наведение/отведение мышки нужно использовать функцию принимающую параметр MouseEvent
Смысл тогда писать свой ивент? Если все равно используется стандартный MouseEvent? Я чот запутался. Как я получу текстовую переменную пользуясь этим.

Цитата:

Если повесить эту функцию на несколько объектов, то нужно использовать e.target и e.currentTarget (Вам уже об этом говорили, но Вы это игнорируете)
Попробовал currentTarget - результат тот же. Что я делаю не так?

Цитата:

А передать дополнительные параметры в функцию у которой сигнатура это не позволяет не возможно никак, более того, это протовоестесственно и абсолютно противоречит здравому смыслу.
Не вижу тут ничего противоречивого. Есть куча объектов есть функция которая должна их обработать по одному единственному параметру который передается с помощью отлова события CLICK. Не ужели нет простого способа реализовать это?

wvxvw 08.02.2010 19:07

Цитата:

Сообщение от uglan (Сообщение 884920)
Не вижу тут ничего противоречивого. Есть куча объектов есть функция которая должна их обработать по одному единственному параметру который передается с помощью отлова события CLICK. Не ужели нет простого способа реализовать это?

Противоестественно то, что функции задан тип: Event->void, задан не вами, а API которые вы изменить не можете. Т.е. это все равно, что вы бы жаловались на то, что переменной булевого типа не получается присвоить строку. Естественно не получится. А по поводу ответа - прочитайте еще раз предыдущее сообщение, там он как бы уже присутствует.

uglan 09.02.2010 12:18

Большое спасибо! Я уже сказал что не понял как мне воспользоваться этими советами и было бы здорово если ответ был бы немного доступнее. Я не претендую на профи в cs3. А ваш совет все равно что отправить меня читать хелп по as3, там ответ есть, я не сомневаюсь. Для чего тогда этот форум?

Wolsh 09.02.2010 13:06

Обстановка накаляется?))) Давайте-ка все выдохнем.
uglan, дело в том что Вы обрабатываете не просто вообще событие, а совершенно конкретное событие наведения курсора на объект. Вы подписались на него. Именно на него. При наступлении именно конкретно этого события создается и рассылается совершенно конкретный Объект События. Этот самый Объект События является ЕДИНСТВЕННЫМ и предопределенным параметром, передаваемым в функцию-обработчик ЭТОГО КОНКРЕТНОГО события. Ваш обработчик не должен принимать в качестве параметра ничего, кроме объекта события именно того Класса, на который он подписан. В данном случае это MouseEvent, и событие Мыши никак не предполагает передачу сообщений - это мышь, а не окно чата. Вы используете стандартное событие, и не пытайтесь его перестроить под свое видение - оно идеально для тех целей, для которых создано. О наведении мыши на объект оно рассказывает абсолютно все подробности. Но Вам хочется совершенно другого - Вам не нужны параметры мыши, Вам нужны параметры объекта. Он - в переменной target.
Вот теперь думаем. Раз Вы не можете завести нужное поле msg:String у этих объектов (их Класс не динамический), то наверное стоит воспользоваться утилитой Dictionary, позволяющей "привязать" к любому Объекту какое-то значение или ссылку.
Код AS3:

private var _planeMessages:Dictionary = new Dictionary();
_planeMessages[plane1] = "я первый план";
_planeMessages[plane2] = "я второй план";
_planeMessages[plane3] = "я третий план";

И далее, в обработчике, получая ссылку на объект из target, мы обращаемся к нашему справочнику и получаем привязанное к нему свойство
Код AS3:

function test_msg ( event:MouseEvent ):void {
        trace( _planeMessages[event.target] );
}


uglan 09.02.2010 13:14

Вау!) Спасибо. Вот теперь действительно понятная и полезная информация.

Попробовал — все работает как надо))) СПАСИБО!

SchSvetlana 28.06.2012 21:53

Wolsh, спасибо, очень понятно написал, попробовала пример сделать, такая же проблема была. Получилось все в лучшем виде. Респект тебе и уважуха :)


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

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