загрузка внешних swfs с помощью петли, AS3 - PullRequest
0 голосов
/ 26 июня 2011

Я провел дни, работая над этим кодом, он кажется таким простым, но все же никогда не работает. Все, что я пытаюсь сделать, это сделать цикл автоматически загружать от person0.swf до person4.swf в том же каталоге. Я настроил его так, чтобы я мог изменить одно число, и оно загружается до person[whatever-the-new-number-is].swf

В настоящее время он загружает первый фильм и все. Я также получаю эту ошибку:

"Ошибка типа: ошибка # 1009: невозможно получить доступ к свойству или методу ссылки на пустой объект. в Меню () "

Вот код

package {

import flash.display.*;
import flash.net.URLRequest;
import flash.events.*;

public class Menu extends MovieClip {
    var loaders:Array;
    var loadedCount:uint;
    var person:Array = new Array();
    var filenum:int = 5;

    function Menu() {
        for (var i = 0; i < 4; i++) {
            var loader = new Loader();
            person.push("person" + i + ".swf"); 
            var currentperson = person[i]; 
            var url:URLRequest = new URLRequest(currentperson);
            loader.load(url);
            addChild(loader);
            loader.content.x = i * 240;
        }
    }
}

}

Ответы [ 3 ]

2 голосов
/ 26 июня 2011

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

Если вы закомментируете "loader.content.x = i * 240;" Вы увидите, что все работает нормально.

Итак, что вы можете сделать, это переместить содержимое после того, как загрузчик отправит «завершенное» событие, добавив прослушиватель событий в свойство contentLoaderInfo загрузчика.

Попробуйте это:

private var person:Array = new Array();     
private var itemCount:Number = 0;
private var itemMax:Number = 4;

public function Main():void 
{
    loadSWFs();
}

private function loadSWFs()
{
    person.push("person" + itemCount + ".swf");
    var currentPerson = person[itemCount];
    var url:URLRequest = new URLRequest(currentPerson);
    var loader:Loader = new Loader();
    loader.load(url);
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, moveLoaderChild);
    addChild(loader);
}

private function moveLoaderChild(e)
{
    e.target.content.x = itemCount * 240;
    if (itemCount < itemMax)
    {
        itemCount++;
        loadSWFs();
    }
}
1 голос
/ 26 июня 2011

Я также нашел другое решение, хотя BigLarry немного сложнее.Ошибка исчезла, когда я избавился от .content из предыдущей строки loader.content.x.

Кроме того, сохраняя каждый загрузчик и URLRequest внутри массива, все SWF-файлы отображались на экране вместо одного и того же.один заменяется несколько раз.

package {
    import flash.display.*;
    import flash.net.URLRequest;
    import flash.events.*;

    public class Menu extends MovieClip {
        public function Menu() {
            var loaders:Array = new Array();
            var person:Array = new Array();
            var url:Array = new Array();
            var filenum:int = 5;

            for (var i = 0; i < filenum; i++) {
                loaders.push(new Loader());
                person.push("person" + i + ".swf");  
                url.push(new URLRequest(person[i]));
                loaders[i].load(url[i]);
                addChild(loaders[i]);
                loaders[i].x = i * 240;
            }
        }
    }
}
0 голосов
/ 26 июня 2011

Вы должны использовать LoaderMax от Greensock (создатель TweenLite / TweenMax).

http://www.greensock.com/loadermax/

Это очень удобно, вы просто передаете массив путей к файлам, а он делает все остальное.Ознакомьтесь с демонстрационной версией по приведенной выше ссылке, и вы убедитесь в этом.

...