Показать сообщение отдельно
Старый 17.03.2011, 00:35
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 5  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Код AS3:
// Загружающая флешка
package 
{
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
 
    public class TestProject extends Sprite 
    {
        private static const SWF_URL:String = "Temporary.swf";
        // Создадим переменную типа MovieClip для хранения
        // ссылки на загруженную флешку. Сделаем вид, что мы
        // не знаем каков ее главный класс.
        private var _loadedSWF:MovieClip;
        private var _loader:Loader;
 
        public function TestProject():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(event:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // Начинаем загрузку флешки
            _loader = new Loader();
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleteHandler);
            _loader.load(new URLRequest(SWF_URL));
        }
 
        private function loaderCompleteHandler(event:Event):void 
        {
            // Сохраняем ссылку на загруженное.
            _loadedSWF = _loader.content as MovieClip;
            // Подписываемся на прослушку событий.
            _loadedSWF.addEventListener(Event.COMPLETE, childCompleteHandler);
            // Добавляем клип в список отображения. Это спровоцирует
            // рассылку им события, которое мы готовы перехватить.
            this.addChild(_loadedSWF);
        }
 
        /**
         * Слушатель детских заявлений.
         * @param	event
         */
        private function childCompleteHandler(event:Event):void
        {
            trace("Master: what do you want from me?");
            _loadedSWF.setColor(0xABCDEF);
        }
    }
}
 
 
// Загружаемая флешка
package 
{
    import flash.display.Graphics;
    import flash.display.MovieClip;
    import flash.display.Shape;
    import flash.events.Event;
 
    public class Temporary extends MovieClip 
    {
        private var _circle:Shape;
        public function Temporary():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(event:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // В данном случае используется существующее событие
            // Event.COMPLETE. Разумеется можно определить любое свое.
            // Событие рассылается сразу после добавления экземпляра
            // Temporary в список отображения.
            dispatchEvent(new Event(Event.COMPLETE));
        }
 
        /**
         * Этот метод будет вызываться из родительского клипа.
         * @param	value   Цвет кружка
         */
        public function setColor(value:uint):void 
        {
            _circle = new Shape();
            var g:Graphics = _circle.graphics;
            g.beginFill(value);
            g.drawCircle(50, 50, 50);
            g.endFill();
            this.addChild(_circle);
            trace("Temporary: you colored me, my Master!");
        }
    }
}
В данном случае мы наследуем класс Temporary от MovieClip, что позволяет впоследствии обращаться к методам клипа через оператор ".". Если мы попробуем унаследоваться от Sprite, во время выполнения вылезет ошибка:
Цитата:
TestProject.as(51): col: 24 Error: Call to a possibly undefined method setColor through a reference with static type flash.display:Sprite.
Ключевое слово - "static". С MovieClip подобного не происходит, потому что это динамический класс. Хоть в хелпе по классу MovieClip нет метода setColor, дебагер не кричит, а честно пытается найти у загруженного клипа обозначенное динамическое свойство (метод). В чем ему сопутствует удача.
В случае наследования от Sprite выйти из ситуации можно, обратившись к методу следующим образом:
Код AS3:
_loadedSWF["setColor"](0xABCDEF);
Прошу более опытных товарищей поправить меня, если я где-то ошибся.

Добавлено через 9 минут
Разумеется, у ребенка при таком подходе найдется не одно только желание COMPLETE. У него их будет много:
- Папа, хочу конфету!
- На тебе конфету.
- Хочу шариков!
- На тебе шариков.
- Папа, а сколько у тебя детей? И дай мне ссылку на сокет!
- Вместе с тобой - 43. А ссылку не дам, сокет детям не игрушка.