2010-12-14 6 views
1

Bonjour et merci beaucoup d'avoir regardé ça. J'ai passé trop d'heures à lutter.Décharger un Loader avec actionscript 3

Le code ci-dessous charge un diaporama de quatre images, ainsi que des vignettes pour ces images. Ça fonctionne bien.

J'ai ajouté un bouton appelé "invis_button", qui, lorsqu'il est pressé est censé supprimer les 3 chargeurs qui composent le diaporama, en utilisant la commande removeChild pour chaque chargeur.

Mais c'est le problème, il y a 3 chargeurs impliqués dans le diaporama. La commande removeChild supprime avec succès l'un des chargeurs (nommé "loader3"), mais pas les deux autres ("container3" et "thumbLoader3"). Il renvoie une erreur indiquant "l'accès à la propriété non définie thumbLoader3" ou "Container3".

Quelqu'un peut-il me dire pourquoi? Ou mieux encore, comment faire ce bouton (invis_button) décharger l'ensemble du diaporama.

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); 
} 

Répondre

2

Je ne sais pas si cela est toute la raison derrière ce que vous observez ... mais pour commencer, « thumbloader3 » et « container3 » sont scope localement la méthode loadThumbs3(), ce qui signifie une fois que vous avez terminé l'exécution de la fonction, les poignées de Flash à ces objets sont perdues (pour ne pas mentionner être dans une portée entièrement différente) ... essayez de créer des propriétés au niveau de la classe pour ces deux. Une fois cela fait, vous devriez être en mesure de les retirer avec succès de la scène plus tard.

J'espère que vous détruisez aussi correctement vos objets, et par souci de concision, vous avez simplement choisi d'omettre ce code ci-dessus.

J'ai modifié le code que vous avez précédemment & pour placer les propriétés dans la portée appropriée. (les multiples copies de thumbLoader3 sont maintenant rassemblées à l'intérieur d'un vecteur (tableau spécialisé) afin qu'elles puissent être correctement adressées quand il est temps de les détruire)

Je vous ai également écrit une méthode appropriée de destruction. ;)

Je ne l'ai pas essayé sur ma propre machine, mais donnez-lui un spin & voir comment ça se passe.

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

Je ne peux pas vous dire à quel point j'apprécie la réponse. Je suis assez nouveau pour as3, y at-il un code que je peux utiliser pour créer une propriété de niveau classe pour ces objets? – Steve

+0

a modifié mon message ci-dessus pour inclure une version modifiée du code que vous avez fourni – greatdecay