
Код 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. А ссылку не дам, сокет детям не игрушка.