0

我成功加载单个图像并使用 addChild() 创建它。现在我正在尝试使用 forEach 循环将多个图像加载到一个精灵“容器”中,增加每个图像的 X 值,以便它们连续显示。图像加载器被引用到 XML 文档中的链接。如果我测试运行此代码,则在加载图像时会弹出此错误,并且我尝试 removeChild() loadBar 动画。

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()

这是AS3:

private function loadBG():void {
    var artGrab:Number = 0;
    var artX:Number = 0;
    for each (var albumData:XML in mainXML.artist[artistID].album) {
        imgURL = new URLRequest(mainXML.artist[artistID].album[artGrab].art);
        imgLdr = new Loader();

        //if you're loading a bigger image or need a preloader
        imgLdr.contentLoaderInfo.addEventListener(Event.COMPLETE,onBGLoaded);
        imgLdr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoading); 
        //add loader animation "All Loader"
        ldrAnim = new AllLoader();
        albumContainer.addChild(ldrAnim);
        ldrAnim.x = artX;
        ldrAnim.y = 200; 
        imgLdr.load(imgURL);
        artGrab++;
        artX + 481;
        ldrAnim.x + 481;
    }
}

private function onLoading(evt:ProgressEvent):void {
    var bytesToLoad:Number = imgLdr.contentLoaderInfo.bytesTotal;
    var numberLoaded:Number = imgLdr.contentLoaderInfo.bytesLoaded;
    ldrAnim.progBar.scaleX = numberLoaded / bytesToLoad;
    var loadedPercent = Math.round(numberLoaded / bytesToLoad * 100);
    ldrAnim.progPercent.text = loadedPercent + " %";
    trace("Loading..." + loadedPercent + "%");
}

private function onBGLoaded(evt:Event):void {
    trace("image loaded!");
    //image setup
    addChildAt(imgLdr,0);
    //now that its 100% loaded, you can resize it , etc.
    removeChild(ldrAnim);

    //use cross multiplying of fractions to maintain aspect ratio
    var origW = imgLdr.contentLoaderInfo.width;
    var origH = imgLdr.contentLoaderInfo.height;
    trace("orig width: "+ origW + "orig height: " + origH);
    //set new width
    imgLdr.width = 481;
    var newH:Number = 481 * origH / origW;
    imgLdr.height = newH;

    //may wish to do positioning AFTER resizing
    imgLdr.x = stage.stageWidth / 2 - imgLdr.width / 2;
    imgLdr.x = 0;
    imgLdr.y = 0;
    imgLdr.width = 480;
    imgLdr.height = 480;
    imgLdr.alpha = 1;   
    imgLdr.z = 0;
}

祝福您阅读了这一切,我不明白是什么导致了这个错误,所以感谢您的评论!

4

2 回答 2

1

您需要为您的加载程序设置一组动画,以便与加载程序本身保持一致,然后当另一个ProgressEvent.PROGRESS事件到达时,查询数组以获取event.target索引,获取相应的动画并调整它,一旦放置就停止依赖单值全局变量一个监听器到多个不同的对象!

var animations:Vector.<AllLoader>;
var loaders:Vector.<LoaderInfo>;
private function loadBG():void {
    var artGrab:int=0;
    var artX:int=0;
    animations=new Vector.<AllLoader>();
    loaders=new Vector.<LoaderInfo>;
    for each (var albumData:XML in mainXML.artist[artistID].album) {
        imgURL = new URLRequest(mainXML.artist[artistID].album[artGrab].art);
        imgLdr = new Loader();
        //if you're loading a bigger image or need a preloader
        imgLdr.contentLoaderInfo.addEventListener(Event.COMPLETE,onBGLoaded);
        imgLdr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoading); 
        //add loader animation "All Loader"
        ldrAnim = new AllLoader();
        albumContainer.addChild(ldrAnim);
        anomations.push(ldrAnim)
        loaders.push(imgLdr.contentLoaderInfo); // fill the arrays
        ldrAnim.x = artX;
        ldrAnim.y=200; 
        imgLdr.load(imgURL);
        artGrab++;
        artX+=481;
    }
}

private function onLoading(evt:ProgressEvent):void{
    var bytesToLoad:Number=evt.target.bytesTotal;
    var numberLoaded:Number=evt.target.bytesLoaded; // note it now refers to target of event
    var index:int=loaders.indexOf(evt.target); // should be valid
    var ldrAnim:AllLoader=animations[index]; // grab corresponding animation
    ldrAnim.progBar.scaleX = numberLoaded/bytesToLoad;
    var loadedPercent=Math.round(numberLoaded/bytesToLoad*100);
    ldrAnim.progPercent.text = loadedPercent +" %";
    trace("Loading..."+loadedPercent +"%");
}

onBGLoaded作为一个教训,你自己对你的函数做同样的把戏。请注意,您必须imgLdr从事件中正确检索值。

于 2013-03-25T04:14:30.453 回答
1

发生的事情是您已经多次填充变量,每次都ldrAnim创建一个新变量。AllLoader当您调用 时removeChild(),第一次可以正常工作(有点——它将删除您创建的最后一个,无论它是否与加载的图像匹配)。当你removeChild()再次调用时,你调用的是你刚刚删除的同一个对象(它不再是你调用它的对象的子对象)。

解决此问题的一种方法是使用 aDictionary并将每个AllLoader与该Loader图像相关联。当事件触发时,您可以根据事件的属性COMPLETE查找并删除它。Alloader

另一种解决方案是编写一个包装 anAllLoader和 a的 Class,Loader然后在 Loader 完成加载时自行处理两者之间的转换。

这可能看起来像这样:

公共类 LoadSwitcher 扩展 Sprite{
   受保护的变量加载器:加载器;
   受保护的 var allLoader:AllLoader;
   公共功能负载开关(网址){
       极好的();
       装载机=新装载机();
       var request:URLRequest = new URLRequest(url);
       loader.contentLoaderInfo.addEventListener(Event.COMPLETE, switchLoaders);
       allLoader = new AllLoader(loader);//假设 AllLoader 现在具有监视加载程序完成百分比的逻辑
       loader.load(请求);
       addChild(allLoader);
   }
   受保护的功能 switchLoaders(e:Event):void {
      removeChild(allLoader);
      addChild(加载器);
   }
}

然后只需为您的每一张专辑创建和定位其中之一。

于 2013-03-25T02:33:51.447 回答