2010-12-14 140 views
1

您好,非常感谢您的关注。我花了很多时间挣扎。使用actionscript 3卸载加载程序

下面的代码加载了四张图片的幻灯片,以及这些图片的缩略图。它工作正常。

我已经添加了一个名为“invis_button”的按钮,当按下它时,应该删除组成幻灯片的3个加载程序,对每个加载程序使用removeChild命令。

但这就是问题所在,幻灯片放映中涉及到3个加载器。 removeChild命令成功移除了其中一个加载器(名为“loader3”),但未成功移除其他两个(“container3”和“thumbLoader3”)。它返回一个错误,指出“访问未定义的属性thumbLoader3”或“Container3”。

有人可以告诉我这是为什么吗?或者更好的是,如何让该按钮(invis_button)卸载整个幻灯片。

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

回答

2

不知道这背后是你观察一下整个原因......但是对于初学者来说,“thumbloader3”和“container3”的本地范围的loadThumbs3()方法,这意味着一旦你完成执行这个函数,那些Flash对这些对象的句柄就会丢失(更不用说在一个完全不同的范围内)......尝试为这两个类创建类级属性。一旦完成,你应该能够在以后成功地将它们从舞台上移除。

我希望你也正确地销毁你的对象,为了简洁起见,你只是选择忽略上面的代码。

我编辑了上面的代码&将属性放入适当的范围。 (thumbLoader3的多个副本现在被收集到一个向量(专用阵列)中,以便它们可以在需要时予以妥善处理以消除它们)

我也给你写了一个适当的销毁方法。 ;)

我还没有在我自己的机器上试过,但给它一个旋转&看看它是怎么回事。

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

不能告诉你我多么感激回应。我对as3相当陌生,有没有可用于为这些对象创建类级属性的代码? – Steve 2010-12-14 21:23:22

+0

编辑我的帖子上面,包括您提供的代码的修改版本 – greatdecay 2010-12-14 21:47:32