2016-09-16 19 views
10

Załadowałem wiele zdjęć i używam do tego tablicy.AS3: Jak uzyskać adres URL dynamicznego modułu ładującego z programu LoaderInfo w funkcji nasłuchiwania zdarzeń?

loader[i].load(new URLRequest(picture[i])); 
funkcja

My Event Listener jest włączona tak:

loader[i].contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); 

Moja onComplete obsługi zdarzeń pokazuje to:

trace(e.target); //OUTPUT: [object LoaderInfo] 

Szukałem na właściwości w loaderInfo które mogłyby zidentyfikować ładowarka zainicjował program nasłuchujący (wartość "i"), tak aby można go było umieścić w każdym z nich, na przykład:

bitmapDataArr[i] = e.target.content.bitmapData; 
bmVisArr[i] = new Bitmap(bitmapDataArr[i]); 

Nie można jednak określić, które "i" zainicjowało określone wystąpienie detektora.

Wszelkie pomysły? Próbowałem nadać nazwę LoaderInfo bezskutecznie. Nadal nie mogę wydobyć nieznośnego, mało rozpoznawalnego numeru.

EDIT seans pętla dla ładowarek i funkcji onComplete:

for (i = 0; i < 10; i++) { 
    loader[i] = new Loader(); 
    loader[i].contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete, false, 0, true);   
    loader[i].load(new URLRequest(letter[i])); 
} 

private function onComplete(e:Event):void { 
    trace("e.target",e.target); //OUTPUT: e.target [object LoaderInfo] 
    var LI:LoaderInfo = e.target as LoaderInfo; 
    var eNum:int = (????); 
    bitmapDataArr[eNum] = e.target.content.bitmapData; 
    bmVisArr[eNum] = new Bitmap(bitmapDataArr[eNum]); 
} 
+0

Czy rozważałeś stworzenie niestandardowej klasy opartej na 'URLLoader' i zapisałeś tam informacje? –

+0

@PetrHrehorovsky Nigdy nie stworzyłem niestandardowej klasy, nie wiedziałbym, od czego zacząć ... Mówisz, że nie mogę * uzyskać numeru "i" z loaderInfo? – Chowzen

+1

Źródłem problemu jest dystrybucja połączonych obiektów między kilkoma tablicami. – null

Odpowiedz

8

Będziesz jakoś trzeba wnieść i wartość onComplete funkcji. Na przykład w kontekście this lub za pośrednictwem argumentu.

P.S .: Łatwiej użyć słabego ref. Słowniki zamiast usuwania właściwości, chociaż nie wiem zbyt wiele o AS3.

Oto przykład, który pokazuje również jak usunąć detektory zdarzeń (w tym ich funkcji zwrotnych):

/* An object containing callback 
* functions used along with event listeners. 
*/ 
const callbacks: Object = {}; 


/* This function will re-declare and hoist i 
* in itself. */ 
private function loop(i: uint): void { 
    loader[i] = new Loader; 

    const wrapped = 
    callbacks[i] = function wrapper(...args) { 
     // Pass all arguments (respectively event and i) 
     onComplete.apply(null, args); 

     // Function#apply(thisContext, arguments) 
     // Rest exp. isn't implemented yet, else we could just do: 
     // onComplete(...args); 
    }; 

    loader[i].contentLoaderInfo 
     .addEventListener(Event.COMPLETE, wrapped, false, 
      0, true); 

    loader[i].load(new URLRequest(letter[i])); 
}; 

for (var i: uint = 0; i < 10; ++i) loop(i); 

private function onComplete(e: Event, i: uint): void { 
    const loaderInfo: LoaderInfo = e.target as LoaderInfo; 

    bitmapDataArr[i] = e.target 
     .content.bitmapData; 

    bmVisArr[i] = new Bitmap(bitmapDataArr[i]); 

    loader[i].contentLoaderInfo 
     .removeEventListener(
      Event.COMPLETE, callbacks[i] 
     ); 

    // Deletes the property that stores 
    // the function inside callbacks 
    delete callbacks[i]; 
} 
+1

Słyszałem funkcje wbudowane, ponieważ słuchacze nie są dobrym pomysłem. Jak możesz ponownie usunąć tego słuchacza? W jaki sposób obiekt Loader będzie zbierał śmieci, jeśli nie możesz? – null

+0

@null Prostym sposobem na usunięcie detektora jest zadeklarowanie funkcji wewnątrz owiniętej funkcji w pętli, a następnie przekazanie jej jako odniesienia w argumentach 'onComplete'. Myślę, że lepiej byłoby mieć obiekt z tymi owiniętymi funkcjami, więc kiedy usuniemy każdego detektora, możemy usunąć funkcje owinięte za pomocą operatora 'delete' – Hydro

+0

@ null Ostatnie pytanie zależy od tego, czy operacja używa obiektu modułu ładującego.On/ona nie pokazał swojego kodu w ogóle – Hydro

4

Od opublikowania na to pytanie, byłem wykorzystując następujące klasy. Przyjmuje liczbę całkowitą (liczba obrazów do załadowania) i daje publiczny dostęp do tablicy Sprites w tablicy "ShapeArr".

Każda właściwość nazwy duszka pochodzi od jej nazwy URL. (name: "pic1" z załadowanego adresu URL "assets/pic1.png")

Miałem problemy z całą koncepcją/implementacją funkcji inline i zamiast tego stosowałem to podejście.

package { 
import flash.display.BitmapData; 
import flash.display.Bitmap; 
import flash.display.Loader; 
import flash.net.URLRequest; 
import flash.display.Sprite; 
import flash.events.Event; 

public class MultipleImageLoader extends Sprite { 
    {private var pic:Array = [ 
     "assets/pic1.png", "assets/pic2.png", "assets/pic3.png", "assets/pic4.png", 
    ]} 

    private var loader:Array = []; 

    public var ShapeArr:Array = []; 
    public var bitmapDataArr:Array = []; 
    public var bmVisArr:Array = [];  
    private var shapeText:Array = [];  
    private var picArray:Array = []; 

    private var count:int = 0; 
    private var loaderCounter:int = 0; 
    private var numPicsToLoad:int; 
    private var a:String; 
    public var loaded:Boolean = false; 

    public function MultipleImageLoader(numPics:int):void { 
     numPicsToLoad = numPics; 
     loaded = false; 

     init(); 
    } 

    private function init(e:Event = null):void { 
     if (hasEventListener(Event.ADDED_TO_STAGE)) { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
     } 
     picArray = new Array; 
     for (var i:int = 0; i < numPicsToLoad; i++) { 
      picArray.push(i); 
     } 
     initiateLoaders(); 
    } 

    private function initiateLoaders():void{ 
     loader[loaderCounter] = new Loader; 
     loader[loaderCounter].contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete, false, 0, true); 

     a = pic[picArray[loaderCounter]]; 
     //trace("shapecolor load:", a); 
     shapeText[loaderCounter] = (a.substr(16, a.length - 20)); 
     loader[loaderCounter].load(new URLRequest(a)); 
    } 

    private function onComplete(e:Event):void { 
     //trace("sssssssssssssssssssssssssshapecolor"); 
     bitmapDataArr[loaderCounter] = e.target.content.bitmapData; 
     bmVisArr[loaderCounter] = new Bitmap(bitmapDataArr[loaderCounter]); 
     bmVisArr[loaderCounter].scaleX = .1; 
     bmVisArr[loaderCounter].scaleY = .1; 
     bmVisArr[loaderCounter].x =-bmVisArr[loaderCounter].width/2; 
     bmVisArr[loaderCounter].y =-bmVisArr[loaderCounter].height/2; 

     ShapeArr[loaderCounter] = new Sprite(); 
     ShapeArr[loaderCounter].name = a.substr(7,4); 

     trace("Name",loaderCounter,ShapeArr[loaderCounter].name); 

     ShapeArr[loaderCounter].addChild(bmVisArr[loaderCounter]); 
     loader[loaderCounter].contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete); 
     if (loaderCounter <numPicsToLoad-1) { 
      loaderCounter += 1; 
      initiateLoaders(); 
     } 
     //trace("gonna count",count); 
     counting(); 
     count += 1; 
    } 

    private function counting():void { 
     trace("tile count", count,numPicsToLoad); 
     if (count < numPicsToLoad-1) { 
      return; 
     } 
     else{ 
      removeEventListener(Event.ENTER_FRAME, counting); 
      loaded = true; 
      count = 0; 
      trace("All Images LOADED"); 
     } 
    } 
}//end Class 
}//end Package 
Powiązane problemy