Paralleles Laden von Bildern in einer einzelnen Klasseninstanz mit AS3
-
27-10-2019 - |
Frage
Mein Problem tritt auf, wenn ich versuche, mehrere Bilder in einer Klasse in AS3 zu laden.
Mein Code sieht ungefähr so aus:
// Load image 1
var ldr1:Loader = new Loader();
ldr1.contentLoaderInfo.addEventListener(Event.COMPLETE, complete1);
ldr1.load(new URLRequest("img1.jpg"));
// Load image 2
var ldr2:Loader = new Loader();
ldr2.contentLoaderInfo.addEventListener(Event.COMPLETE, complete2);
ldr2.load(new URLRequest("img2.jpg"));
// Load image 3
var ldr3:Loader = new Loader();
ldr3.contentLoaderInfo.addEventListener(Event.COMPLETE, complete3);
ldr3.load(new URLRequest("img3.jpg"))
Mein Problem dabei ist, dass jede vollständige Methode das gleiche Bild erhält.Manchmal erhalten sie alle img1.jpg
, manchmal erhalten sie alle img3.jpg
…
Ich habe keine Ahnung, warum dies geschieht.
Ich bin dankbar für jede Hilfe, die Sie mir geben können.
Dies ist der genaue Code, den ich verwendet habe:
Klasse CuboidBookView
public function addBackMaterial(url:String):void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBMComplete);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function (e:IOErrorEvent):void {});
loader.load(new URLRequest(url));
}
private function onBMComplete(e:Event):void {
var bmp:Bitmap = Bitmap(LoaderInfo(e.target).content);
backMaterial = new BitmapMaterial(bmp.bitmapData);
hidden = false;
}
public function addFrontCoverMaterial(url:String):void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onFCMComplete);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function (e:IOErrorEvent):void {});
loader.load(new URLRequest(url));
}
private function onFCMComplete(e:Event):void {
var bmp:Bitmap = Bitmap(LoaderInfo(e.target).content);
frontCoverMaterial = new BitmapMaterial(bmp.bitmapData);
}
public function addRearCoverMaterial(url:String):void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onRCMComplete);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function (e:IOErrorEvent):void {});
loader.load(new URLRequest(url));
}
private function onRCMComplete(e:Event):void {
var bmp:Bitmap = Bitmap(LoaderInfo(e.target).content);
rearCoverMaterial = new BitmapMaterial(bmp.bitmapData);
}
Diese Methoden werden in einer anderen Klasse aufgerufen:
CuboidBookView(book.view).addBackMaterial("../res/books/" + b.file + "_back.jpg");
CuboidBookView(book.view).addFrontCoverMaterial("../res/books/" + b.file + "_front.jpg");
CuboidBookView(book.view).addRearCoverMaterial("../res/books/" + b.file + "_rear.jpg");
Bearbeiten: Ich dachte, das würde helfen, aber es hatte das gleiche Ergebnis:
public function addMaterials(name:String):void {
// Load background image
var ldr1:Loader = new Loader();
ldr1.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void {
var bm:Bitmap = e.currentTarget.content as Bitmap;
backMaterial = new BitmapMaterial(bm.bitmapData);
hidden = false;
});
ldr1.load(new URLRequest("../res/books/" + name + "_back.jpg"));
// Load front cover
var ldr2:Loader = new Loader();
ldr2.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void {
var fcm:Bitmap = e.currentTarget.content as Bitmap;
frontCoverMaterial = new BitmapMaterial(fcm.bitmapData);
});
ldr2.load(new URLRequest("../res/books/" + name + "_front.jpg"));
// Load rear cover
var ldr3:Loader = new Loader();
ldr3.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void {
var rcm:Bitmap = e.currentTarget.content as Bitmap;
rearCoverMaterial = new BitmapMaterial(rcm.bitmapData);
});
ldr3.load(new URLRequest("../res/books/" + name + "_rear.jpg"))
}
Jetzt haben die verschiedenen Bitmaps und Loader unterschiedliche Namen und werden innerhalb desselben Methodenaufrufs aufgerufen.Die Ereignishandler sind jetzt inline.
Ich kann nicht herausfinden, wo der Fehler liegt.
Lösung 2
Es gab wirklich ein Problem mit der Implementierung des Cube in Away3d.Einige Rückrufe wurden nicht gespeichert.
Ich habe eine Lösung gefunden, um die gesamte Klasse neu zu implementieren.
Andere Tipps
Wie sehen Ihre Methoden complete1 (), complete2 () und complete3 () aus?
Ich würde die Bitmap folgendermaßen vom Loader speichern.
private function complete1(e:Event):void
{
var image:Bitmap = e.currentTarget.content as Bitmap;
}
Verwenden Sie dann diese Bitmap, um Ihr Bild zu rendern.
Offensichtlich wird für jede Bitmap eine andere Variable verwendet.Normalerweise habe ich ein Wörterbuch mit BitmapData, das ich nach dem Laden speichere.
Wenn der von Ihnen gepostete Code genau dem entspricht, den Sie in Ihrem Programm haben, sollte dies gut funktionieren.