Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Неколько простых вопросов по Event. (http://www.flasher.ru/forum/showthread.php?t=131214)

niil 15.10.2009 12:15

Неколько простых вопросов по Event.
 
Доброго времени суток. В AC3 я совсем нуб.

Подскажите как мне отловить событие скрытие элемента типа MovieClip - то есть visible = false через addEventListener. Как устанавливать прослушиватель я разобрался, но вот на какое событие вешать выполнение функции не могу найти.

И еще подскажите как в выполняемую функцию передавать кроме Event собственные параметры (переменные). Желательно просто кусов кода с addEventListener.

И еще.
Насчет собственных эвентов. Есть MovieClip с именем mp1, на 60 фрейме прописываю:

this.dispatchEvent(new Event("myAlertEvent"));

В первом фрейме Scene1 ставлю прослушку кодом:
this.mp1.addEventListener("myAlertEvent , f_AlertFunc);

Событие не срабатывает, думаю все несколько сложнее. Помогите начинающему, можно ссылками на мануалы или примером кода.

Заранее огромное спасибо.

Gal4enochek 15.10.2009 13:00

Цитата:

как мне отловить событие скрытие элемента типа MovieClip - то есть visible = false через addEventListener. Как устанавливать прослушиватель я разобрался, но вот на какое событие вешать выполнение функции не могу найти.
Не знаю, моет то не самый простой способ, но например так:
1) Для клипа, который должен оповещать у своем скрытии, написать класс унаследованнй от MovieClip.
2) В нем переопределить set visible и рассылать свое собственное событие
Код AS3:

public override function set visible(value:Boolean):void{
        super.visible = value;
        if (value) dispatchEvent(new Event("SHOW"))
        else dispatchEvent(new Event("HIDE"))
}

3) где необходимо подписаться на ваши события этого мувика

Добавлено через 6 минут
Цитата:

как в выполняемую функцию передавать кроме Event собственные параметры
- написать собственнй класс события унаследованный от Event, который будет иметь еще одно поле с данными

Чо каксается вашего примера, то у меня все работает. может вы что-то не правильно описали?

niil 15.10.2009 13:47

Разобрался с dispatchEvent и с событием скрытия MovieClip через все тот же dispatchEvent.

- написать собственнй класс события унаследованный от Event, который будет иметь еще одно поле с данными

Можно поподробнее как создавать наследников класса в AC3 и потом работать с ними

Gal4enochek 15.10.2009 14:36

Код AS3:

import flash.events.Event;
 
        public class CustomEvent extends Event
        {       
                public static const                SOMETHING_HAPPEND        : String = "some";
 
                private var _data                                                : Object;       
 
                public function CustomEvent(type:String, data:Object=null, bubbles:Boolean=false, cancelable:Boolean=false)
                {
                        super(type, bubbles, cancelable);
                        _data = data;
                }
 
                public function get data():Object{
                        return _data;
                }
 
        }

ну где-то там отсылайе событие
Код AS3:

 object.dispatchEvent(new CustomEvent(CustomEvent.SOMETHING_HAPPEND, {message :"hi", value:5}));

вешаете листнер на ваше событие
а в листенере так будет
Код AS3:

function myEventHandler(event :CustomEvent):void{
  trace(event.data.message);
  trace(event.data.value);
}

в общем как-то так
Почитайте про пользовательские события.

niil 15.10.2009 15:08

Про пользовательские события я уже разобрался, но все равно огромное спасибо. Сейчас более интресует возможность отсылать в функцию вызываемую addEventListener
при событии "complete" в объекте типа URLLoader кроме стандартного Event, собственные переменные.
Поясню. Есть URLLoader загружающий в цикле картинки в определенные MovieClipы (Pan_1, Pan_2, Pan_3, Pan_"Type1", где переменная Type1 берется из mysql базы). На данный момент он не работает - картинки не выводятся на MovieClip.

Код AS3:

  for (var j = 1; j < RecArr.length; j++){
  var CurF:Array = RecArr[j].split("%|%");
  var Type1:String = CurF[0].toString();
  var Type1:String = CurF[1].toString()
  Pan = getChildByName('Pan_' + Type1);
  var ImgLoader:Loader = new Loader();
  var UrlRequest:URLRequest = new URLRequest('/menu/mi_' + Type1 + '_' + Type2 + '.png');
  ImgLoader.load(UrlRequest);
  ImgLoader.addEventListener(Event.COMPLETE, f_ILoad); //- вот сюда надо бы еще отпрвлять ссылку на объект Pan
}

Далее обрабатываю получение картинки (не отлвливаю ошибки несуществования картинки, будем считать, что они точно существуют)

Код AS3:

function f_ILoad(e:Event){ //- сюда должна также приходить ссылка на объект вставки DestPan
  var Image: Bitmap = (Bitmap)(e.target.content); // создаем контейнер типа Bitmap, возможно в данном случае нужен другой, т.к. формат картинки PNG
  Image.x = 20;
  Image.y = 40;
  //DestPan.addChild(Image);               
}

Если несложно подкорректируйте код! Зранее спасибо!

Gal4enochek 15.10.2009 15:11

Оформите код тегами AS3

niil 15.10.2009 15:16

Цитата:

Сообщение от Gal4enochek (Сообщение 858091)
Оформите код тегами AS3

Сделал.

Gal4enochek 15.10.2009 15:37

Ну как вариант:
написать свой класс MyLoader наследник от Loader, который будет делать то же самое, только будет иметь дополнительное поле dest_clip - клип,в который аттачится картинка будет. Тогда в листенере можно будет его достать как
Код AS3:

(e.target as MyLoader).dest_clip

Если есть другие варианты, проще, то будет самой интересно узнать :)

niil 15.10.2009 16:04

Вполне разумно. Вопрос: расширение классов осуществляется только через подключаемый as файл, в котором может быть например такое:
Код AS3:

package {
import flash.net.URLLoader;
 
        public class URLLoaderEx extends URLLoader
        {       
                public var CompName:String = new String;
        }
}

Или все же можно корректно расширить класс прямо в скрипте фрейма?
Для расширения компонента URLLoader на переменную CompName типа String - этого достаточно?

Gal4enochek 15.10.2009 16:41

Нужно отдельный файл с классом создавать. Да и вообще предпочтительнее код в классах писать, а не в кадрах.

Цитата:

Для расширения компонента URLLoader на переменную CompName типа String - этого достаточно?
Это уже на ваше усмотрение, что вы хотите дополнительно сохранять, можно строку, можно ссылку на клип или что-о еще. Как нужно для задачи.


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

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