+ Reply to Thread
Results 1 to 2 of 2

Trucco del giorno - DisplayObjectContainer.removeChildAt

This is a discussion on Trucco del giorno - DisplayObjectContainer.removeChildAt within the Articoli e tutorials forums, part of the Flash Italiano category; Dopo aver analizzato i metodi target e currentTarget , ecco un nuovo articolo della serie Trucco del Giorno. Una nuova ...

  1. #1
    Administrator Living At The FlepStudio! Flep is on a distinguished road
    Join Date
    Jul 2007
    Posts
    5,762
    Rep Power
    11

    Trucco del giorno - DisplayObjectContainer.removeChildAt

    Dopo aver analizzato i metodi target e currentTarget, ecco un nuovo articolo della serie Trucco del Giorno.
    Una nuova cosa scoperta in fase di sviluppo:
    Actionscript 3.0 non dispone di un metodo che permetta di rimuovere tutte le MovieClip all' interno di un altra MovieClip.
    Per fare ciò abbiamo bisogno di un ciclo for ( oppure while,come preferite ) usando la proprietà numChildren.

    Vediamo come fare...

    Ogni volta che rimuoviamo una MovieClip, se il depth di questa MovieClip occupava l' ultimo depth più alto oppure era l' unica MovieClip presente, allora il problema non sorge e la MovieClip viene rimossa completamente.
    Supponiamo ora di avere un numero imprecisato di MovieClip all' interno di un' altra MovieClip che funge da contenitore. Se la MovieClip che rimuoviamo ( all' interno dellaMovieClip contenitore ) non è la più alta, allora la MovieClip con depth maggiore a quella rimossa prende automaticamente il depth della MovieClip rimossa.

    Facciamo un paio di esempi concreti.


    Il seguente esempio è quello che NON dobbiamo fare:
    creo un FLA, da codice creo una MovieClip contenitore al cui interno, tramite un ciclo for, creo un numero random di MovieClip circolari.
    Code:
    var n:Number=Math.round(Math.random()*50);
    var container_mc:MovieClip=new MovieClip();
    addChild(container_mc);
    
    for(var i:int=0;i < n;i++)
    {
    	var clip:MovieClip=new MovieClip();
    	var xx:Number=Math.random()*stage.stageWidth;
    	var yy:Number=Math.random()*stage.stageHeight;
    	var radius:Number=Math.random()*40;
    	clip.graphics.beginFill(0xFF0066,1);
    	clip.graphics.drawCircle(xx,yy,radius);
    	container_mc.addChild(clip);
    }
    ora, tramite un bottone, voglio rimuovere tutte le MovieClip all' interno di container_mc:
    Code:
    rimuovi_btn.addEventListener(MouseEvent.CLICK,removeClips);
    
    function removeClips(event:MouseEvent):void
    {
    	for(var i:int=0;i < container_mc.numChildren;i++)
    	{
    		container_mc.removeChildAt(i);
    	}
    }
    come posiamo vedere, d' istinto ci verrebbe di utilizzare un semplice ciclo for con iterazione crescente e massima iterazione il numero delle MovieClip all'interno di container_mc dato dalla proprietà numChildren. Ma questo codice, seguendo quello che ho scritto all' inizio e cioè che rimuovendo una movieClip quella che gli sta sopra prende il suo depth e analizzando il ciclo, è errato in quanto:
    quando parte il ciclo, la variabile ' i ' ha valore 0. Viene rimossa la MovieClip a depth 0. La MovieClip che era a depth 1 prende il depth 0 appunto della MovieClip rimossa.
    Prossima iterazione del ciclo: la ' i ' ha valore 1, la MovieClip a depth 1 viene rimossa e la MovieClip a depth 2 prende il suo posto ecc ecc...
    E' ovvio che ad esempio abbiamo una MovieClip che era stata creata al depth 1 che ( rimuovendo quella a depth zero ) ora si trova a depth zero, non può più essere rimossa in quanto il ciclo non tornerà più a iterazione zero. Infatti cliccando sul bottone del seguente SWF possiamo notare che non tutte le MovieClip vengono rimosse:










    In sostanza, il ciclo che ci serve per rimuovere correttamente tutte le MovieClip con un singolo click sul bottone è il seguente:
    Code:
    rimuovi_btn.addEventListener(MouseEvent.CLICK,removeClips);
    
    function removeClips(event:MouseEvent):void
    {
    	for(var i:int=container_mc.numChildren-1;i >= 0;i--)
    	{
    		container_mc.removeChildAt(i);
    	}
    }
    corretto
    Impostiamo come valore iniziale della prima iterazione: numChildren-1 ( questo perchè Flash vede come un Array le MovieClip inserite dentro a container_mc e tutti sappiamo che un indice di Array con valore della lunghezza dello stesso Array non esiste per cui dobbiamo utilizzare il -1 ).
    Come massima iterazione impostiamo zero e decremetiamo la ' i '.

    infatti, se clicchiamo ora il bottone dell' SWF, le MovieClip vengono romosse interamente:










    Stay tuned !

  2. #2
    tia
    tia is offline
    Junior Member Settled In tia is on a distinguished road
    Join Date
    Jan 1970
    Posts
    25
    Rep Power
    0

    Exclamation Re: Trucco del giorno - DisplayObjectContainer.removeChildAt

    Ciao a tutti...
    Ecco un'altro problema che mi sta facendo impazzire..
    vi mostro due funzioni appartenenti alla Document class
    Code:
    private function msg_iniz():void {
    	var cont_mex_iniz:MovieClip = new MovieClip();
    	addChild(cont_mex_iniz);
    	var init_txt:TextField=getTextField(-1,false);
    	init_txt.text='Attendere...';
    	init_txt.width=init_txt.textWidth+10;
    	init_txt.x=(stage.stageWidth-init_txt.width)/2;
    	init_txt.y=(stage.stageHeight-init_txt.height)/2;
    	cont_mex_iniz.addChild(init_txt);
    }
    
    public function mouseIsDown(event:Event):void {
    	removeChild(cont_mex_iniz);
    }
    Quando compilo mi da questo messaggio di errore:
    Code:
    1120: Access of undefined property cont_mex_iniz.
    Cioè il mio problema è che non riesco a eliminare "cont_mex_iniz"

    Inizialmente non creavo "cont_mex_iniz" ma aggiungevo init_txt direttamente allo stage con
    Code:
    addChild(init_txt);
    Ma non riuscivo in nessun modo ad eliminarlo..allora ho provato a superare il problema eliminando un MovieClip che lo contenesse...ma niente da fare..

    Come si fa per eliminare un TextField aggiunto con addChild ?
    E di conseguenza vale anche per i movieClip?

+ Reply to Thread

Similar Threads

  1. Trucco del giorno - MovieClip.mouseChildren
    By Flep in forum Articoli e tutorials
    Replies: 3
    Last Post: 18-04-11, 16:41
  2. mouseEnabled di Flash CS3 - trucco del giorno
    By Flep in forum Articoli e tutorials
    Replies: 3
    Last Post: 05-04-11, 15:47
  3. this.root - trucco del giorno
    By Flep in forum Articoli e tutorials
    Replies: 9
    Last Post: 12-06-10, 09:32
  4. Trucco del giorno - istanza fantasma
    By Flep in forum Articoli e tutorials
    Replies: 1
    Last Post: 16-04-09, 08:24
  5. Trucco del giorno - MovieClip.dropTarget
    By Flep in forum Articoli e tutorials
    Replies: 4
    Last Post: 04-03-09, 12:54

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts