как удалить загруженный извне swf кнопкой закрытия

У меня есть скрипт 3D-карусели. Когда один из экземпляров щелкнут, он загрузит внешний swf (с close_btn в нем) в качестве своего содержимого. Все работает нормально... проблема в том, как удалить внешнее загрузил swf с помощью close_btn... это мой код на моей основной временной шкале:

var centerX:Number = stage.stageWidth / 2;
var centerY:Number = stage.stageHeight / 2;
var radiusX:Number = 180;
var radiusY:Number = 50;
var speed:Number = 0.1;
var minSpeed:Number = -0.15;
var maxSpeed:Number = 0.15;
var rangeSpeed:Number = maxSpeed - minSpeed;
var minY:Number = centerY - radiusY;
var maxY:Number = centerY + radiusY;
var rangeY:Number = maxY - minY;
var minScale:Number = 0.5;
var maxScale:Number = 1.2;
var rangeScale:Number = maxScale - minScale;
var my_loader:Loader = new Loader();
var itemArray:Array =[perkhidmatan, misi, tentang, members];
var fileNames : Array = ["perkhidmatan.swf", "misi.swf", "tentang.swf","members.swf",];


var canvas:MovieClip = new MovieClip();
addChild(canvas);

for (var i:Number = 0; i < itemArray.length; i++)
{
canvas.addChild(itemArray[i]);
itemArray[i].buttonMode = true;
itemArray[i].addEventListener(MouseEvent.CLICK, goToURL);
itemArray[i].itemAngle = Math.PI * 2 / itemArray.length * i;
itemArray[i].addEventListener(Event.ENTER_FRAME, animate);
}

function goToURL(e:MouseEvent):void {
for (var i:int = 0; i < itemArray.length; i++) {
if (e.currentTarget == itemArray[i]) {
    my_loader.load(new URLRequest(fileNames[i]));
    trace(fileNames[i]);
    trace(my_loader);
    addChild(my_loader);
    itemArray[i].mouseEnabled = false;
    itemArray[i].alpha = 0.5;
} else {
    itemArray[i].mouseEnabled = true;
    itemArray[i].alpha = 1;
}
}
}

function animate(e:Event):void
{
speed = mouseX / stage.stageWidth * rangeSpeed + minSpeed;
e.currentTarget.x = Math.cos(e.currentTarget.itemAngle) * radiusX + centerX;
e.currentTarget.y = Math.sin(e.currentTarget.itemAngle) * radiusY + centerY;
e.currentTarget.itemAngle += speed;
itemArray.sortOn("y");




for(var i:Number = 0; i < itemArray.length; i++)
{
canvas.setChildIndex(itemArray[i], i);
var pct:Number = (itemArray[i].y - minY) / rangeY;
var scale:Number = pct * rangeScale + minScale;
itemArray[i].scaleX = itemArray[i].scaleY = scale;
}
}

person saddle35    schedule 26.12.2013    source источник
comment
Что вы имеете в виду под словом удалить? Выгрузить или убрать со сцены?   -  person Fygo    schedule 26.12.2013
comment
в чем разница между ними?.. я просто хочу удалить загруженный swf со сцены   -  person saddle35    schedule 26.12.2013


Ответы (1)


Хорошо, похоже, вы хотите добавить прослушиватель кликов к объекту отображения внутри загруженного SWF-файла, который при нажатии удалит загруженный SWF-файл со сцены.

Итак, вот что я бы сделал:

function goToURL(e:MouseEvent):void {
    for (var i:int = 0; i < itemArray.length; i++) {
        if (e.currentTarget == itemArray[i]) {
            my_loader.contentLoaderInfo.addEventListener( Event.COMPLETE. onLoaderComplete );
            my_loader.load(new URLRequest(fileNames[i]));
            trace(fileNames[i]);
            trace(my_loader);
            //addChild(my_loader); //do not add the loader to this display object
            itemArray[i].mouseEnabled = false;
            itemArray[i].alpha = 0.5;
        } else {
            itemArray[i].mouseEnabled = true;
            itemArray[i].alpha = 1;
        }
    }
}

function onLoaderComplete( e:Event ):void {
    //set a variable called _loadedSwf as type MovieClip at the top
    _loadedSwf = e.target.content;
    _loadedSwf.close_btn.addEventListener( MouseEvent.CLICK, removeLoadedSwf );
    addChild( _loadedSwf );
}

function removeLoadedSwf( e:MouseEvent ):void {
    removeChild( _loadedSwf );
}

Я не проверял это, но я считаю, что это то, что вы ищете? В любом случае надеюсь, что это поможет вам!

person Bennett Yeates    schedule 26.12.2013
comment
tq @P1on.. но я получаю эту ошибку. Сцена 1, «Действия» слоя, Кадр 1, Строка 76 1119: Доступ к возможно неопределенному свойству close_btn через ссылку со статическим типом flash.display:DisplayObject. - person saddle35; 26.12.2013
comment
Да, я подозревал, что ты можешь. Так что это проблема с тем, где ваша кнопка закрытия находится в иерархии объектов отображения. Это означает, что если ваш close_btn находится на сцене в вашем загруженном swf, вам просто нужно убедиться, что у него есть имя экземпляра (выберите кнопку закрытия и дайте ей имя close_btn, и код, который я вставил, должен работать). В противном случае, если ваша кнопка закрытия находится в другом месте, например, в мувиклипе на сцене, вам нужно будет углубиться в иерархию, поэтому _loaderSwf.someMovieclip.close_btn.addEventListener и т. д. и т. д. Убедитесь, что у close_btn есть имя экземпляра! :) - person Bennett Yeates; 26.12.2013
comment
О, я вижу ошибку, которую вы могли иметь, _loadedSwf набрал для отображения объекта. Если вы установите _loadedSwf в MovieClip, это должно сработать (экранный объект не позволит вам пройти через иерархию, но DisplayObjectContainer позволит). - person Bennett Yeates; 26.12.2013
comment
да. я делал это раньше.. он вернул ошибку, когда я сделал тестовый фильм в своем основном файле.. это не тогда, когда я щелкнул экземпляр, в котором он загружает фильм.. .. мне нужно установить переменную называется close_btn поверх скрипта в моем основном файле? - person saddle35; 26.12.2013
comment
ооо, я забыл сказать тебе .. вместо использования: my_loader.load(новый URLRequest(fileNames[i])); я изменил на это: my_loader.load (новый URLRequest (e.currentTarget.name + .swf)); - person saddle35; 26.12.2013
comment
Ну, это трудно понять, не видя, как настроен ваш fla, содержащий актив close_btn. Но вы говорите, что для _loadedSwf установлено значение MovieClip, и вы выполняете _loadedSwf.close_btn, и это возвращает ошибку нулевой ссылки? Это может звучать так, как будто у вашего close_btn нет имени экземпляра, у его родителя нет имени экземпляра или, возможно, даже у обоих. Чтобы установить имя экземпляра, вам нужно убедиться, что вы выбрали актив на сцене, а затем на вкладке свойств дайте ему имя. - person Bennett Yeates; 26.12.2013
comment
Итак, как я могу поставить свой фла здесь, чтобы вы могли видеть? - person saddle35; 26.12.2013
comment
Вы можете загрузить его куда-нибудь и вставить ссылку на него. - person Bennett Yeates; 26.12.2013
comment
Да и нашел проблему. Во-первых, у вас нет события contentLoaderInfo в вашей функции goToUrl. Тогда другая проблема заключается в том, что ваш актив close_btn существует только в кадре 80 на временной шкале вашего актива. Итак, когда ваш swf загружается, он находится в кадре 0, и мы пытаемся добавить событие в close_btn, которого нет в этом кадре. Я отредактировал ваш .fla со сменой фрейма. dropbox.com/s/m9n79an69sp29ys/stackoverflow_p1on_updated.zip - person Bennett Yeates; 27.12.2013
comment
ты такая помощь p1on ... теперь я понимаю правила управления активом в загруженном swf ... также функция contentLoaderInfo ... должен ли я отметить приведенный выше ответ как правильный ответ? могу ли я добавить вас на fb или skype или что-то? - person saddle35; 27.12.2013
comment
Да, пожалуйста, отметьте это правильно, так как это может быть полезно для кого-то еще, у кого такая же проблема :) Не стесняйтесь, пишите мне по электронной почте (см. Мой профиль для получения дополнительной информации, электронная почта находится на моем веб-сайте). Удачи! - person Bennett Yeates; 27.12.2013