2012-03-24 4 views
1

У вас есть вопрос для всех вас! Я пытаюсь создать навигационную систему для своего сайта, где каждый элемент nav загружается как внешний .swf. Благодаря another user на этом сайте я смог получить эту функциональность. Проблема в том, что я хочу добавить preloader для этих внешних swfs.AS3 - Добавление внешнего предварительного загрузчика .swf при использовании нулевого загрузчика

Код я работаю так:

var loadedSWF:Loader = null; 

/** 
* Loads an SWF and adds it to container once complete 
* @param file The URL to the SWF to load 
* @param container The container to add the SWF to 
*/ 
function loadSWF(file:String, container:MovieClip=null):void 
{ 
    if(container == null) container = MovieClip(root); 

    // removes the previously loaded SWF 
    if(loadedSWF != null) 
    { 
     if(loadedSWF.parent) loadedSWF.parent.removeChild(loadedSWF); 
    } 

    var req:URLRequest = new URLRequest(file); 
    loadedSWF = new Loader(); 
    loadedSWF.load(req); 

    addChild(loadedSWF); 
} 



menu_mc.test_btn.addEventListener(MouseEvent.CLICK, _click); 
function _click(e:MouseEvent):void 
{ 
    loadSWF("testmovie.swf"); 
    loadedSWF.x = 0; 
    loadedSWF.y = 125; 
    var otherindex = getChildIndex(Border); 
    setChildIndex(loadedSWF, otherindex + 1); 
} 

До сих пор все, что я пытался потерпел неудачу. Я могу заставить прелоадер работать, если я не использую нулевой загрузчик, но когда я это делаю, я не уверен, как заставить его удалять активы, используемые при загрузке другого .swf - все просто стеки и болота вниз по сайту , Если я попытаюсь собрать предварительный загрузчик, прикрепленный к вышеуказанному коду, я получаю ошибки, потому что я делаю вызовы на нулевой объект. Извините, что я новичок, я только начал обнимать голову вокруг вспышки. Я ценю любую помощь!

Edit: Вот быстрый взгляд на мою несколько перемешаны версию, которая включает в себя прелоадер, но не работает в связи с нулевым загрузчиком:

var loadedSWF:Loader = null; 

/** 
* Loads an SWF and adds it to container once complete 
* @param file The URL to the SWF to load 
* @param container The container to add the SWF to 
*/ 
function loadSWF(file:String, container:MovieClip=null):void 
{ 
    if(container == null) container = MovieClip(root); 

    // removes the previously loaded SWF 
    if(loadedSWF != null) 
    { 
     if(loadedSWF.parent) loadedSWF.parent.removeChild(loadedSWF); 
    } 

    loadedSWF.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler); 
    loadedSWF.contentLoaderInfo.addEventListener(Event.COMPLETE, loadProdComplete); 
    var req:URLRequest = new URLRequest(file); 
    loadedSWF = new Loader(); 
    loadedSWF.load(req); 

    function loadProdComplete(e:Event):void { 
    trace("swf file loaded"); 
    //remove the preloader from container clip 
      removeChild(preLoader); 

      // add the loaded swf to container clip 
    addChild(loadedSWF);  

    currentSWF = MovieClip(loadedSWF.content); 
    currentSWF.gotoAndPlay(1); 

    currentSWF.addEventListener(Event.ENTER_FRAME , checkLastFrame); 

function checkLastFrame(e:Event):void { 

if (currentSWF.currentFrame == currentSWF.totalFrames) { 
    currentSWF.stop(); 
    // trace("stopped");  
    } 

    } 

} 

var preLoader:loader = new loader(); 

//position the loading bar 
preLoader.x = 155; 
preLoader.y = 185; 

addChild(preLoader); 

function onProgressHandler(event:ProgressEvent){ 

var dataAmountLoaded:Number=event.bytesLoaded/event.bytesTotal*100; 
preLoader.bar.scaleX = dataAmountLoaded/100; 
preLoader.lpc.text= int(dataAmountLoaded)+"%"; 

trace(preLoader.bar.scaleX); 

    } 

} 

var currentSWF:MovieClip = new MovieClip(); 


menu_mc.test_btn.addEventListener(MouseEvent.CLICK, _click); 
function _click(e:MouseEvent):void 
{ 
    loadSWF("testmovie.swf"); 
    loadedSWF.x = 0; 
    loadedSWF.y = 125; 
    var otherindex = getChildIndex(Border); 
    setChildIndex(loadedSWF, otherindex + 1); 
} 

Edit # 2: Функциональный код, но теперь получаю следующее выводить ошибку, когда я нажимаю кнопку. Swfs загружается и выгружается просто отлично, но если кто-нибудь знает, как я могу его очистить, чтобы избежать ошибки вывода, я хотел бы сделать ее максимально гладкой !:

ArgumentError: Ошибка # 2025: поставляемый DisplayObject должен быть ребенком вызывающего. в flash.display :: DisplayObjectContainer/RemoveChild() на MethodInfo-8()

var container:MovieClip = new MovieClip(); 
var currentSWF:MovieClip = new MovieClip(); 
var swfLoader:Loader = new Loader(); 

function launchSWF(vBox, vFile):void{ 

//vBox.addChild(swfLoader); 
var swfURL:URLRequest = new URLRequest(vFile); 

swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler); 
swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadProdComplete); 

swfLoader.load(swfURL); 

function loadProdComplete(e:Event):void { 
    trace("swf file loaded"); 
    vBox.removeChild(preLoader); 
    vBox.addChild(swfLoader); 

    currentSWF = MovieClip(swfLoader.content); 
    currentSWF.gotoAndPlay(1); 


    currentSWF.addEventListener(Event.ENTER_FRAME , checkLastFrame); 

function checkLastFrame(e:Event):void { 

    if (currentSWF.currentFrame == currentSWF.totalFrames) { 
    currentSWF.stop(); 
    // trace("DONE");  
    } 

    } 

} 

var preLoader:loader = new loader(); 
preLoader.x = 155; 
preLoader.y = 185; 

vBox.addChild(preLoader); 

function onProgressHandler(event:ProgressEvent){ 

var dataAmountLoaded:Number=event.bytesLoaded/event.bytesTotal*100; 
preLoader.bar.scaleX = dataAmountLoaded/100; 
preLoader.lpc.text= int(dataAmountLoaded)+"%"; 

trace(preLoader.bar.scaleX); 

    }  

} 

test_btn.addEventListener(MouseEvent.CLICK, _load); 

function _load(e:Event):void{ 

    swfLoader.unloadAndStop(); 
    var swfFile:String = 'test.swf'; 
    launchSWF(container, swfFile); 
    //put it on stage 
    addChild(container); 
} 

ответ

0

не использовать нуль, просто использовать метод выгрузки класса Loader.

Loader.unload() 
+0

Спасибо, я пытаюсь получить эту работу (документация, кажется, довольно бедными, так что легче для меня, чтобы узнать, выбирая друг от друга функциональных аспектов существующего кода), но до сих пор попытку вставить либо разгрузить или unloadAndStop дали ошибку 1061: вызов возможно неопределенного метода unloadAndStop через ссылку со статическим типом класса, поэтому я даже не могу разобраться в том, как я в конечном итоге завершу оставшуюся часть скрипта вокруг него. Единственная информация, которую я мог найти об этой ошибке, заключалась в том, что мне нужно было запустить Flash 10 или выше, но я уже это делаю. = | – DoomJTHM

+0

привет, вам нужно вызывать разгрузку на экземпляре загрузчика, конечно: loader: Loader = new Loader(); затем позже в скрипте loader.unload(). – mpm

+0

Отлично, еще раз спасибо! Мне удалось получить функциональный код, но теперь я получаю ошибку вывода. Я отредактировал исходное сообщение с кодом, который я использую, и ошибкой, которую я получаю. – DoomJTHM

Смежные вопросы