0

for ループで画像をロードする複数のローダーを作成しています。次に、これらの画像を新しい MoveClip に配置します。

必要に応じて removeChild(flagHolder); を実行します。ローダーにロードされたフラグのすべてのイメージを保持します。 これにより、削除しようとしている親ムービー クリップにロードされたすべての myLoaders が削除されるのでしょうか?

これは電話アプリ用であるため、リソースを消費しないことを願っています。

質問する必要はないので、コードを下に投稿するのは気が進まないのですが、とにかく投稿します。少し面倒です。as3でもっと効率的になることを願っています。すべてのリソースが使い果たされないようにする必要があるので、この分野でスクリプトがひどくないことを願っています。

import flash.display.MovieClip;

var daCol:int; 
var daRow:int;
var daPosition:int;
var daPage:int;
var daWidth:int;
var daHeight:int;
var daTotalFlags:int;
var daTotalPages:int;


var daFlag:Array = [];
var daFlagText:Array = [];
var pages:Array = [];

// Movie Clips
var newBox:MovieClip = new MovieClip;


// Make new Movie clip to hold the flags
var flagHolder = new MovieClip();
flagHolder.name = "flagHolder";


for (var a:uint = 0; a < DirArray.length; a++)
{
    //trace(DirArray[a]);


    var Flag = new languageFlag();
    Flag.name = DirArray[a];
    daFlag.push(Flag);
    /// Important for adding flag to display
    //flagHolder.addChild(Flag);
    Flag.width = 160;
    //Flag.scaleX = 1.5;
    //Flag.scaleY = 1.5;
    daHeight = Flag.height;
    daWidth = Flag.width;

    daCol =  Math.floor(stage.stageWidth / Flag.width);
    daRow = Math.floor(stage.stageHeight / Flag.height)-1;



    trace("Flag Width: " + Flag.width);
    //Flag.x = Flag.width * a;
    theFlag = new Loader();
    theFlag.load(new URLRequest("Languages/"+DirArray[a]+"/Flag.png"));
    theFlag.name = DirArray[a];
    Flag.addChild(theFlag);
    //daFlagText = 
    Flag.btext.text = DirArray[a];
    theFlag.addEventListener(MouseEvent.CLICK, flagClick);


}

BG.addEventListener(MouseEvent.CLICK, fl_MouseClickHandler_2);

function fl_MouseClickHandler_2(event:MouseEvent):void
    {
    /// CALLS FUNCTIONS FOR FLAGS
    displayFlags();
    displayFlagButtons();   
    }



function displayFlags()
    {
    flagMoveIn();
    var theRow = 0;
    var C = 0;
    var goUp:int;
    var spaceHeight:int = 33;
    daHeight = daHeight + 20;


    /// DISPLAYS FLAG HOLDER
    addChild(flagHolder);

    /// Sets position of Flags in pages to start at zero
    daPosition = 33;

    daTotalFlags = daRow * daCol;
    daTotalPages =  daFlag.length/daTotalFlags;
    trace("DA TOTAL PAGES: " + daTotalPages);
    //////////////////////
    /////////////////////
    for(var p = 0; daTotalPages >= p; p++)
    {

        var screenPage:MovieClip = new MovieClip();
        pages.push(screenPage)

            for (var F:uint = 0; F <= daRow-1; F++)
                {


                    if(daFlag[F])
                    {

                        for(C = theRow; C < theRow+daCol; C++)
                        {




                            if(daFlag[goUp])
                            {

                            screenPage.addChild(daFlag[goUp]);
                            daFlag[goUp].y = daHeight * F;
                            daFlag[goUp].x = daFlag[goUp].width * C;

                            }
                            goUp++;

                        }

                    }

                }
    daPosition = daPosition + stage.stageWidth; 
    //--- End of work For Loop
    flagHolder.addChild(screenPage);
    } // End of Pages loop


    spaceFlags();
    }// End of Display Flags



/// This function orders the pages correctly and spaces them right 
/// and adds buttons to the pages at bottom
function spaceFlags(){


    for( var i = 0; pages.length > i; i++)
    {
    pages[i].scaleX = .9;
    pages[i].scaleY = .9;

    }


    newBox.addChild(pages[0]);

    for( var a = 0; pages.length > a; a++)
    {
    pages[a].x = stage.stageWidth/2 - newBox.width/2 + stage.stageWidth * a;

    }


    flagHolder.addChild(newBox);
}


    var flagButton:MovieClip;
    var flagArray:Array = new Array;
    var flagDisplayButtons:MovieClip = new MovieClip();
    function displayFlagButtons()
{




    for( var i = 0; pages.length > i; i++)
    {
        var flagButton:MovieClip = new roundButton();
        flagButton.x = (flagButton.width + 10) * i;
        flagButton.y = stage.stageHeight - flagButton.height;
        addChild(flagButton);
        flagButton.alpha = .3;

        flagDisplayButtons.addChild(flagButton);
        flagArray.push(flagDisplayButtons.getChildAt(i) as roundButton);
    }
    addChild(flagDisplayButtons);

    // Works
    flagDisplayButtons.x = stage.stageWidth/2 - flagDisplayButtons.width/2;




}
4

1 に答える 1

1
while ( movieclip.numChildren > 0 ) {
    if ( movieclip.getChildAt( 0 ) is Loader ) {
        // if you get an error for null objects here, add in a similar conditional for "is Bitmap"
        ( ( movieclip.getChildAt( 0 ) as Loader ).content as Bitmap ).bitmapData.dispose();
    }
    movieclip.removeChildAt( 0 );
}

そのループは、ムービークリップの各子を通過して削除し (明らかに、コードに合わせて名前を変更します)、dispose()任意のLoader. BitmapData.dispose()次回の実行時にガベージ コレクションがデータを収集できるようにします (これを強制する方法はなく、システムがメモリを処理する方法のために、変更を確認するのは困難です)。

もちろん、必要に応じてループを変更できますが、これにより、メモリから各ローダーをアンロードするために必要な作業の概要がわかるはずです。

于 2013-05-03T17:04:43.710 に答える