Выгрузка загрузчика с ActionScript 3 - PullRequest
1 голос
/ 14 декабря 2010

Привет и большое спасибо за внимание.Я потратил слишком много времени на борьбу.

Приведенный ниже код загружает слайд-шоу из четырех изображений вместе с миниатюрами для этих изображений.Это работает нормально.

Я добавил кнопку с именем invis_button, которая при нажатии должна удалить 3 загрузчика, которые составляют слайд-шоу, используя команду removeChild для каждого загрузчика.

Но это проблема, в слайд-шоу участвуют 3 загрузчика.Команда removeChild успешно удаляет один из загрузчиков (с именем «loader3»), но не два других («container3» и «thumbLoader3»).Он возвращает сообщение об ошибке «Доступ к неопределенному свойству thumbLoader3» или «Контейнер3».

Может кто-нибудь сказать мне, почему это так?Или еще лучше, как заставить эту кнопку (invis_button) выгружать весь слайд-шоу.

var images3:Array = ["ad_bona1.jpg", "ad_bona2.jpg", "ad_darkhawk1.jpg", "ad_darkhawk2.jpg"];

var thumbX3:Number = -375;
var thumbY3:Number = 220;

var loader3:Loader = new Loader();
loader3.load(new URLRequest("assets/ad_bona1.jpg"));
addChild(loader3);
loader3.alpha = 0;

loadThumbs3();

function loadThumbs3():void
{
var thumbLoader3:Loader;
var container3:Sprite = new Sprite();
addChild(container3);
container3.buttonMode = true;
for(var i3:uint = 0; i3 < images3.length; i3++)
{
thumbLoader3 = new Loader();
thumbLoader3.load(new URLRequest("assets/thumbs/" + images3[i3]));
thumbLoader3.x = thumbX3;
thumbLoader3.y = thumbY3;
thumbX3 += 85;
container3.addChild(thumbLoader3);
thumbLoader3.addEventListener(MouseEvent.CLICK, thumbClicked3);
}
}
function thumbClicked3(event:MouseEvent):void
{
var path3:String = event.currentTarget.contentLoaderInfo.url;
path3 = path3.substr(path3.lastIndexOf("/") + 1);
loader3.load(new URLRequest("assets/" + path3));
}


///PROBLEM BELOW, button removes only "loader3" and not the other two for some reason

invis_button.addEventListener(MouseEvent.CLICK, unload_loaders);

function unload_loaders(event:MouseEvent):void{
    removeChild(loader3);
    removeChild(thumbLoader3);
    removeChild(container3);
 }

1 Ответ

2 голосов
/ 14 декабря 2010

Не уверен, что это вся причина того, что вы наблюдаете ... но для начала, "thumbloader3" и "container3" локально ограничены методом loadThumbs3 (), что означает, что как только вы закончите выполнение функции,Дескрипторы Flash к этим объектам потеряны (не говоря уже о том, что они находятся в совершенно другой области видимости) ... попробуйте создать свойства уровня класса для этих двух объектов.Как только это будет сделано, вы сможете успешно удалить их со стадии позже.

Я надеюсь, что вы также правильно уничтожаете свои объекты, и ради краткости вы просто решили опустить этот код выше.

Я отредактировал код, который вы имели выше, и поместил свойства в нужную область.(несколько копий thumbLoader3 теперь собираются внутри вектора (специализированного массива), чтобы их можно было правильно адресовать, когда придет время их уничтожать)

Я также написал вам правильный метод уничтожения.;)

Я не пробовал его на своей машине, но попробую и посмотрим, как он работает.

var images3:Array = ["ad_bona1.jpg", "ad_bona2.jpg", "ad_darkhawk1.jpg", "ad_darkhawk2.jpg"];

var thumbX3:Number = -375;
var thumbY3:Number = 220;

// begin new instance properties..
// created a new property, allowing you to group (and hold on to) the multiple thumbLoaders
var thumbLoader3Vector:Vector.<Loader> = new Vector.<Loader>();
var container3:Sprite;
// end new instance properties

var loader3:Loader = new Loader();

loader3.load(new URLRequest("assets/ad_bona1.jpg"));
addChild(loader3);
loader3.alpha = 0;

loadThumbs3();

function loadThumbs3():void
{

    // this is where container3 used to be declared

    container3 = new Sprite();
    addChild(container3);
    container3.buttonMode = true;
    for(var i3:uint = 0; i3 < images3.length; i3++)
    {
        var tPtr:int = thumbLoader3Vector.length;
        thumbLoader3Vector.push(new Loader());
        // this is where thumbLoader3 used to be declared & instantiated

        thumbLoader3Vector[tPtr].load(new URLRequest("assets/thumbs/" + images3[i3]));
        thumbLoader3Vector[tPtr].x = thumbX3;
        thumbLoader3Vector[tPtr].y = thumbY3;
        thumbX3 += 85;
        container3.addChild(thumbLoader3Vector[tPtr]);
        thumbLoader3Vector[tPtr].addEventListener(MouseEvent.CLICK, thumbClicked3);

    }
}
function thumbClicked3(event:MouseEvent):void
{
    var path3:String = event.currentTarget.contentLoaderInfo.url;
    path3 = path3.substr(path3.lastIndexOf("/") + 1);
    loader3.load(new URLRequest("assets/" + path3));
}


///PROBLEM BELOW, button removes only "loader3" and not the other two for some reason

invis_button.addEventListener(MouseEvent.CLICK, unload_loaders);

function unload_loaders(event:MouseEvent):void{

    // since the thumbLoader3 Loaders are children of container3 in the display list, we need to remove them first
    for(var $i:uint = 0;$i<thumbLoader3Vector.length;$i++)
    {
        removeChild(thumbLoader3Vector[$i]);
        // also make sure you remove the listener, so that the object will be picked up by garbage collection
        thumbLoader3Vector[$i].removeEventListener(MouseEvent.CLICK, thumbClicked3);
    }
    // and then just set the entire vector to null
    thumbLoader3Vector = null;

    // remove the loader3 object & set it to null
    removeChild(loader3);
    loader3 = null;

    // remove the container3 object & set it to null
    removeChild(container3);
    container3 = null;
 }
...