2010-12-14 7 views
1

Hallo und vielen Dank für das Betrachten. Ich habe zu viele Stunden gekämpft.Entladen eines Loader mit Actionscript 3

Der folgende Code lädt eine Diashow mit vier Bildern sowie Miniaturansichten für diese Bilder. Es funktioniert gut.

Ich habe eine Schaltfläche namens "invis_button" hinzugefügt, die beim Drücken die 3 Loader entfernen soll, die die Diashow bilden, mit dem Befehl removeChild für jeden Loader.

Aber das ist das Problem, es gibt 3 Lader in der Slide-Show beteiligt. Der Befehl removeChild löscht erfolgreich einen der Loader ("loader3" genannt), aber nicht die beiden anderen ("container3" und "thumbLoader3"). Es wird ein Fehler zurückgegeben, der besagt "Zugriff der undefinierten Eigenschaft thumbLoader3" oder "Container3".

Kann mir jemand sagen, warum das ist? Oder noch besser, wie man den Button (invis_button) erstellt, um die gesamte Slideshow zu entladen.

var images3:Array = ["ad_bona1.jpg", "ad_bona2.jpg", "ad_darkhawk1.jpg", "ad_darkhawk2.jpg"]; 

var thumbX3:Number = -375; 
var thumbY3:Number = 220; 

var loader3:Loader = new Loader(); 
loader3.load(new URLRequest("assets/ad_bona1.jpg")); 
addChild(loader3); 
loader3.alpha = 0; 

loadThumbs3(); 

function loadThumbs3():void 
{ 
var thumbLoader3:Loader; 
var container3:Sprite = new Sprite(); 
addChild(container3); 
container3.buttonMode = true; 
for(var i3:uint = 0; i3 < images3.length; i3++) 
{ 
thumbLoader3 = new Loader(); 
thumbLoader3.load(new URLRequest("assets/thumbs/" + images3[i3])); 
thumbLoader3.x = thumbX3; 
thumbLoader3.y = thumbY3; 
thumbX3 += 85; 
container3.addChild(thumbLoader3); 
thumbLoader3.addEventListener(MouseEvent.CLICK, thumbClicked3); 
} 
} 
function thumbClicked3(event:MouseEvent):void 
{ 
var path3:String = event.currentTarget.contentLoaderInfo.url; 
path3 = path3.substr(path3.lastIndexOf("/") + 1); 
loader3.load(new URLRequest("assets/" + path3)); 
} 


///PROBLEM BELOW, button removes only "loader3" and not the other two for some reason 

invis_button.addEventListener(MouseEvent.CLICK, unload_loaders); 

function unload_loaders(event:MouseEvent):void{ 
    removeChild(loader3); 
    removeChild(thumbLoader3); 
    removeChild(container3); 
} 

Antwort

2

Nicht sicher, ob dies der gesamte Grund ist, was Sie beobachten ... aber für den Anfang „thumbloader3“ und „container3“ werden lokal auf dem loadThumbs3() -Methode scoped, was bedeutet, wenn Sie fertig sind Beim Ausführen der Funktion gehen Flash-Handles zu diesen Objekten verloren (ganz zu schweigen davon, dass sie sich in einem völlig anderen Bereich befinden) ... versuchen Sie, Eigenschaften auf Klassenebene für diese beiden zu erstellen. Sobald dies erledigt ist, sollten Sie in der Lage sein, sie später erfolgreich von der Bühne zu entfernen.

Ich hoffe, dass Sie auch Ihre Objekte ordnungsgemäß zerstören, und der Kürze wegen haben Sie nur diesen Code oben weggelassen.

Ich habe den Code bearbeitet, den Sie oben hatten & setzen Sie die Eigenschaften in den richtigen Bereich. (Die Mehrfachkopien von thumbLoader3 werden jetzt innerhalb eines Vektors (spezialisiertes Feld) gesammelt, damit sie richtig adressiert werden können, wenn es Zeit ist, sie zu zerstören)

Ich schrieb Ihnen auch eine korrekte Zerstörungsmethode. ;)

Ich habe es nicht auf meiner eigenen Maschine versucht, aber gebe ihm einen Dreh & sehen, wie es geht.

var images3:Array = ["ad_bona1.jpg", "ad_bona2.jpg", "ad_darkhawk1.jpg", "ad_darkhawk2.jpg"]; 

var thumbX3:Number = -375; 
var thumbY3:Number = 220; 

// begin new instance properties.. 
// created a new property, allowing you to group (and hold on to) the multiple thumbLoaders 
var thumbLoader3Vector:Vector.<Loader> = new Vector.<Loader>(); 
var container3:Sprite; 
// end new instance properties 

var loader3:Loader = new Loader(); 

loader3.load(new URLRequest("assets/ad_bona1.jpg")); 
addChild(loader3); 
loader3.alpha = 0; 

loadThumbs3(); 

function loadThumbs3():void 
{ 

    // this is where container3 used to be declared 

    container3 = new Sprite(); 
    addChild(container3); 
    container3.buttonMode = true; 
    for(var i3:uint = 0; i3 < images3.length; i3++) 
    { 
     var tPtr:int = thumbLoader3Vector.length; 
     thumbLoader3Vector.push(new Loader()); 
     // this is where thumbLoader3 used to be declared & instantiated 

     thumbLoader3Vector[tPtr].load(new URLRequest("assets/thumbs/" + images3[i3])); 
     thumbLoader3Vector[tPtr].x = thumbX3; 
     thumbLoader3Vector[tPtr].y = thumbY3; 
     thumbX3 += 85; 
     container3.addChild(thumbLoader3Vector[tPtr]); 
     thumbLoader3Vector[tPtr].addEventListener(MouseEvent.CLICK, thumbClicked3); 

    } 
} 
function thumbClicked3(event:MouseEvent):void 
{ 
    var path3:String = event.currentTarget.contentLoaderInfo.url; 
    path3 = path3.substr(path3.lastIndexOf("/") + 1); 
    loader3.load(new URLRequest("assets/" + path3)); 
} 


///PROBLEM BELOW, button removes only "loader3" and not the other two for some reason 

invis_button.addEventListener(MouseEvent.CLICK, unload_loaders); 

function unload_loaders(event:MouseEvent):void{ 

    // since the thumbLoader3 Loaders are children of container3 in the display list, we need to remove them first 
    for(var $i:uint = 0;$i<thumbLoader3Vector.length;$i++) 
    { 
     removeChild(thumbLoader3Vector[$i]); 
     // also make sure you remove the listener, so that the object will be picked up by garbage collection 
     thumbLoader3Vector[$i].removeEventListener(MouseEvent.CLICK, thumbClicked3); 
    } 
    // and then just set the entire vector to null 
    thumbLoader3Vector = null; 

    // remove the loader3 object & set it to null 
    removeChild(loader3); 
    loader3 = null; 

    // remove the container3 object & set it to null 
    removeChild(container3); 
    container3 = null; 
} 
+0

Ich kann Ihnen nicht sagen, wie sehr ich die Antwort schätze. Ich bin ziemlich neu in As3, gibt es einen Code, den ich verwenden kann, um eine Eigenschaft auf Klassenebene für diese Objekte zu erstellen? – Steve

+0

hat meinen obigen Beitrag bearbeitet, um eine modifizierte Version des von Ihnen bereitgestellten Codes zu enthalten – greatdecay