Ссылки на мувиклипы не работают в обратном вызове onLoadComplete - PullRequest
0 голосов
/ 09 марта 2010

Я загружаю кучу изображений в мой флэш-фильм AS2, и я столкнулся с некоторой странностью.

Грубо говоря, мой код выглядит так:

function doTheLoading()
{
    m_imageClips = [];

    for (var i:Number = 0; i < 3; i++) 
    {
        var imageUrl:String = "http://server/" + i + ".jpg";

        var mc :MovieClip = m_mc.createEmptyMovieClip("name"+i, i + 1);

        m_imageClips.push( mc );

        var mcLoader:MovieClipLoader = new MovieClipLoader();
        mcLoader.addListener(this);
        mcLoader.loadClip(imageUrl, mc);
    }

    myDebug("array1: "+m_imageClips);
}


function onLoadComplete(mc:MovieClip)
{
    myDebug("array2: " + m_imageClips );
    myDebug("type: " + typeof(m_imageClips[0]) );

    for (var i:Number = 0; i < m_imageClips.length; i++) 
    {
        if (mc == m_imageClips[i]) 
        {
            /* This line is never reached. */
        }
    }
}

И вывод выглядит примерно так:

array1: mc.0.jpg, mc.1.jpg, mc.2.jpg
array2: ,,
type: movieclip
array2: ,,
type: movieclip
array2: ,,
type: movieclip

Итак, мой вопрос: почему содержимое моего массива изменяется при вызове onLoadComplete? Если массив находится вне области видимости, то почему я по-прежнему могу видеть длину массива и определять тип содержимого?

1 Ответ

0 голосов
/ 10 марта 2010

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


Кстати, ответ Росса предполагает, что есть проблема с областью видимости, но она немного сложнее ...

Неверно утверждать, что m_imageClips выходит за рамки: если вы не объявили m_imageClips (с оператором var), прежде чем присвоить ему значение [], тогда он будет объявлен автоматически.

Многие языки программирования требуют переменные, которые будут объявлены перед данными могут быть депонированы в них; Неспособность Это может привести к ошибке. ActionScript не такой строгий. Если мы присвоить значение переменной, которая делает не существует, переводчик создаст новая переменная для нас. - (Колин Мук, Actionscript the Definition Guide)

В этом случае он будет объявлен в рамках основной временной шкалы, поэтому он будет доступен как для функций doTheLoading(), так и onLoadComplete(). Следовательно, код работает так, как вы его показали.

Это также означает, что если вы хотите использовать решение Росса (с оператором return и т. Д.), Вам нужно объявить m_imageClips как локальное по отношению к doTheLoading() с помощью varm_imageClips = []; внутри этой функции. Хотя это может привести к удвоению, так как вы окажетесь в одном месте ...

...