Flash CS3 - Flash CS4

Free tutorials and scripts for all.
Actionscript 3.0

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 CS3 e Actionscript 3.0 category; Dopo aver analizzato i metodi target e currentTarget , ecco un nuovo articolo della serie Trucco del Giorno. Una nuova cosa ...


Go Back   Forum Flash CS3 Flash CS4 > Flash CS3 e Actionscript 3.0 > Articoli e tutorials

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 21-09-07, 09:50
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,486
Rep Power: 6
Flep is on a distinguished road
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 !
__________________

 


I recommend: Essential Actionscript 3.0

- Non rispondo ai messaggi privati con domande tecniche. Apri una discussione sul forum !
- I do not reply technicians pvt messages. Open a thread !
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #2 (permalink)  
Old 08-06-08, 17:43
tia tia is offline
Junior Member
 
Join Date: Jan 1970
Posts: 21
Rep Power: 0
tia is on a distinguished road
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?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

Reply

Bookmarks

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is On
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump

Similar Threads

Thread Thread Starter Forum Replies Last Post
this.root - trucco del giorno Flep Articoli e tutorials 8 10-10-08 16:43
Trucco del giorno - MovieClip.dropTarget Flep Articoli e tutorials 3 04-09-08 10:37
mouseEnabled di Flash CS3 - trucco del giorno Flep Articoli e tutorials 2 16-01-08 07:30
Trucco del giorno - MovieClip.mouseChildren Flep Articoli e tutorials 0 21-09-07 10:46
Trucco del giorno - istanza fantasma Flep Articoli e tutorials 0 20-09-07 15:24


All times are GMT. The time now is 11:41.


Powered by vBulletin versione 3.7.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0 RC4
Forum SiteMap


FlepStudio
by Filippo Lughi
P.IVA 03605860406