0

単一の画像を読み込んで、addChild() を使用して作成することに成功しました。forEach ループを使用して各画像の X 値を増やし、行に表示されるように、複数の画像をスプライト「コンテナ」にロードしようとしています。イメージローダーは、XML ドキュメント内のリンケージに参照されます。このコードをテスト実行すると、画像がロードされた時点でこのエラーがポップアップし、loadBar アニメーションを removeChild() しようとします。

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

何が起こっているかというと、変数ldrAnimを複数回入力し、AllLoader毎回新しい変数を作成しています。を呼び出すとremoveChild()、これは初めて正常に機能します (一種の -- 読み込まれた画像と一致するかどうかにかかわらず、最後に作成したものを削除します)。もう一度呼び出すremoveChild()と、削除したのと同じオブジェクトに対して呼び出します (これは、呼び出しているオブジェクトの子ではなくなります)。

これを修正する 1 つの方法は、 を使用して、それぞれをそのイメージの にDictionary関連付けることです。イベントが発生したら、イベントのプロパティに基づいて を検索して削除できます。AllLoaderLoaderCOMPLETEAlloader

もう 1 つの解決策は、anAllLoaderと aをラップするクラスを作成Loaderし、ローダーがロードを完了したときに 2 つの間の遷移を処理することです。

それは次のようになります。

public class LoadSwitcher extends Sprite{
   保護された var loader:Loader;
   protected var allLoader:AllLoader;
   public function loadSwitcher(url) {
       素晴らしい();
       ローダー = 新しいローダー();
       var request:URLRequest = 新しい URLRequest(url);
       loader.contentLoaderInfo.addEventListener(Event.COMPLETE, switchLoaders);
       allLoader = new AllLoader(loader);// AllLoader には、% complete のローダーを監視するロジックがあると仮定します
       loader.load(リクエスト);
       addChild(allLoader);
   }
   保護された関数 switchLoaders(e:Event):void {
      removeChild(allLoader);
      addChild(ローダー);
   }
}

次に、アルバムごとにこれらを 1 つ作成して配置します。

于 2013-03-25T02:33:51.447 に答える
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 に答える