Flash: eliminare tutti i mc attached

Di: alice33 | 26/09/2020 18:25:18
Domanda forse assurda... Esiste un modo per rimuovere qualsiasi mc, -creato in runtime con attachMovie- presente sullo stage? Vorrei fare in modo che, premendo un pulsante, sparisca tutto quello che è stato attachato sulla root, anche se non posso prevedere di quali mc si tratta...

Risposte



Hola!
...a mio avviso potresti servirti di una variabile di tipo "array" per contenere i nomi dei filmati che carichi sulla _root, ogni volta che viene caricato un movie aggiungi il suo nome alla lista (all'array)...
...poi puoi associare al pulsante che deve cancellare tutto uno script che scorra l'array e che per ogni voce rimuova il corrispettivo filmato...
buona giornata!

Di: alispiegate | 26/09/2020 18:25:18


Grazie Alispiegate... però non ho mai usato un array, mi hanno sempre un po' intimorito
Potresti spiegarmi un po' più nei dettagli?
Facciamo che io ho un sacco di mc "frutta" che potrebbero essere attachati. Cosa metto in ciascuno al momento dell'attach?
E come si scrive una funzione che scorra l'array per vedere se è stato caricato?(A rimuovere i singoli mc ho imparato... almeno quello....)
Grazie e buona giornata anche a te!

Di: alice33 | 26/09/2020 18:25:18


Ciao alice,
la soluzione fornita da alispiegate è la migliore soluzione possibile.
Non farti intimorire dagli Array, sono molto comodi...
Prima di suggerirti il codice da usare per il tuo caso specifico approfitto di questo intervento per scrivere due parole in merito agli Array, a beneficio tuo e di tutta la community.
Disponibilità
Gli Array sono disponibili in Flash dalla versione 5, a partire dalla versione 6 sono diventati oggetti nativi del linguaggio ActionScript e per questo sono notevolmente più “performanti”.
Descrizione
Possiamo pensare ad un Array come a una variabile “a più posti”, questo significa che è possibile conservare in un Array innumerevoli valori, questi valori saranno accessibili sia in lettura che in scrittura utilizzando l'indice di memorizzazione della matrice.
Gli indici della matrice partono da ZERO, questo significa che se creiamo un Array con un solo valore al suo interno possiamo accedere a questo valore interrogando l'indice ZERO. Il secondo valore inserito nell'Array avrà indice 1, il terzo indice 2 e così via...
Sarà più chiaro man mano che leggi.
Costruzione
Un Array può essere costruito in tre modi:
1.
var mioArray = new Array();
2.
var mioArray = new Array(10);
3.
var mioArray = new Array("Pippo", "Pluto", "Paperino", "Topolino");
Il primo modo costruisce un Array vuoto, il secondo costruisce un Array definendo il numero di elementi che deve contenere, il terzo modo costruisce un Array e inserisce il contenuto dei vari elementi.
Chiaramente un Array vuoto può essere riempito successivamente, infatti ti parlavo prima degli indici di un Array, ora li vediamo all'opera.
Questo esempio qui sotto costruisce un Array con sette indici vuoti e successivamente inserisce i nomi dei giorni della settimana...
var giorniSettimana = new Array(7);
giorniSettimana[0] = "Lunedì";
giorniSettimana[1] = "Martedì";
giorniSettimana[2] = "Mercoledì";
giorniSettimana[3] = "Giovedì";
giorniSettimana[4] = "Venerdì";
giorniSettimana[5] = "Sabato";
giorniSettimana[6] = "Domenica";
Spesso è necessario aggiungere i valori ad un Array di cui non conosciamo niente, in questo ci viene incontro il metodo push() che serve ad aggiungere un valore ad un array esistente, vediamo come realizzare un Array identico a quello dell'esempio precedente utilizzando questo metodo...
var giorniSettimana = new Array();
giorniSettimana.push("Lunedì");
giorniSettimana.push("Martedì");
giorniSettimana.push("Mercoledì");
giorniSettimana.push("Giovedì");
giorniSettimana.push("Venerdì");
giorniSettimana.push("Sabato");
giorniSettimana.push("Domenica");
Sia nell'esempio qui sopra che in quello precedente abbiamo creato un Array contenente sette valori, numerati da 0 a 6, corrispondenti ai nomi dei giorni della settimana.
Una proprietà degli Array, che useremo per realizzare il tuo lavoro, è “length”, se proviamo a scrivere in fondo allo script dell'esempio precedente questo rigo:
trace(giorniSettimana.lenght);
Avremo ottenuto una riga di output di questo tipo:
7
Questo ci dice infatti che l'array “giorniSettimana” è lungo SETTE.
Abbiamo divagato abbastanza, adesso andiamo a creare lo script per le tue esigenze, intervenendo in tre punti:
1. Su un fotogramma della linea principale, dove dichiareremo un Array vuoto.
2. Sullo script che usa attachMovie, in maniera da inserire dentro l'Array precedentemente creato tutti i movieclip che andiamo creando.
3. Su un pulsante, dove inseriremo un ciclo che scorre l'Array per tutta la lunghezza e esegue un'azione (la cancellazione di un movieclip) per ogni voce dell'Array.
Andiamo con ordine:
da inserire sulla linea principale, su un fotogramma qualunque, precedente o corrispondente alla creazione dei movieClip
var movieArray = new Array();
da inserire subito dopo il comando attachMovie
_root.attachMovie("Symbo", mioNome, _root.getNextHighestDepth());
_root.movieArray.push(mioNome);
Importante: il primo dei due righi qui sopra è solo di esempio, l'ho inserito per indicare che il nome che scegli quando crei il MovieClip deve corrispondere con il valore che inserisci nell'Array().
azione per il pulsante
on (press) {
for (i=0; i<movieArray.length; i++) {
removeMovieClip(_root[movieArray[i]]);
}
}
questo qui sopra è un ciclo for che scorre tutto l'Array ed esegue l'azione removeMovieClip per ogni voce memorizzata
A questo punto gli Array non dovrebbero più farti paura, sono disponibili numerosi metodi molto interessanti, non solo il push(), ma al momento mi sembra superfluo introdurtli tutti.

Di: Professore | 26/09/2020 18:25:18


hola!!!
...vediamo, un array è una variabile adibita a contenere altre variabili (mi perdonino i programmatori per la spiegazione semplicistica!).
...puoi pensare ad un array come ad una lista, ogni voce della lista è una variabile di qualche tipo (di solito però gli array contengono tutte variabili dello stesso tipo!)...
...quindi quello che ci serve è una lista che contenga i nomi dei filmati che andrai a caricare, per dichiarare questa lista facciamo:
MC_caricati = new Array();
dove MC_caricati è il nome dato alla lista.
Ogni volta che permetti all'utente di caricara (attaccare) un movie sullo stage dovremo riempire la lista col nome del movie stesso.
Per rendere agevole l'operazione di "riempimento" della lista ti consiglio di usare una variabile "nome" in cui inserisci il nome del movie e poi passare questa variabile alla funzione che usi per il caricamento, sia essa una attachMovie oppure un loadMovie...
Tipo:
nome = "nome_movie";
oppure nel caso parametrizzi i nomi:
nome = "nome_movie_" + parametro;
Dopo di che effettuiamo andiamo a rimepire effettivamente la lista con l'istruzione:
MC_caricati.push(nome);
Ammettiamo ora che siano stati caricati un po' di filmati, avremo che la lista (l'array) conterrà i nomi dei filmati con l'ordine con cui sono stati inseriti, esempio:
MC_caricati:
"pippo"
"pluto"
"qui"
"quo"
"...e così via"
...non a caso ho disposto i nomi in sequenza e prima di porseguire prendiamo in esame un paio di proprietà degli array, ovvero la loro lunghezza ed il fatto che le variabili contenute in un array siano indicizzate.
La lunghezza dell'array specifica il numero di elementi contenuti, riferendoci alla lista scritta in precedenza avremo che la sua lunghezza è 5, infatti contiene i nomi:
"pippo", "pluto", "qui", "quo", "...e così via"
che sono 5!.
Gli indici invece servono per riferirsi ad ogni singolo membro dell'array (della lista), l'indice nell'array parte da zero ed è sequenziale, quindi sempre riferendoci all'esempio precedente avremo che:
"pippo" ha indice 0
"pluto" ha indice 1
"qui" ha indice 2
"quo" ha indice 3
"...e così via" ha indice 4
se ad esempio volessimo riferirci solo a "qui" potremmo scrivere:
MC_caricati[2];
oppure se volessimo sapere cosa c'è in una specifica posizione ad esempio la 3 e salvare il contenuto in una variabile "contenuto" potremmo scrivere:
contenuto = MC_caricati[3];
e poi andare a vedere il valore di contenuto per sapere che c'è dentro!
Dopo questa breve divagazione ritorniamo al tuo problema, non ci rimane altro da fare ora che scrivere la funzione che scorre l'array ed elimina i movie
il modo migliore per scorrere un array è un ciclo, useremo un ciclo for:
for(i=0; i<MC_caricati.length; i++)
{
da_cancellare = MC_caricati[i];
// aggiungere il codice per la cancellazione del filmato!
}
...commentiamo il codice:
i=0 : benchè di solito questa variabili si inizializza a zero sembra una cosa normale fare lo stesso anche qui, ma se ragioniamo un attimo ci accorgiamo che gli indici degli array partono da zero!
(quindi se avessimo fatto ciclare da i=1 in poi, avremo saltato il primo elemento!)
i<MC_caricati.length : MC_caricati.length è una proprietà degli array e ne indica la lunghezza, poichè a priori non sapremo quanti elementi ci saranno nell'array non possiamo dare un numero preciso di cicli.
(mantenendo l'esempio dell'array precendente avremo che MC_caricati.length ritorna 5, quindi noi è come se facessimo i<5, il che significa anche che cicleremo da 0 a 4 -0, 1, 2, 3, 4- che sono appunto gli indici degli elementi dell'array)
i++ : penso che questa non abbia bisogno di commenti!
da_cancellare = MC_caricati[i] : con questa riga andiamo a leggere il nome del movie contenuto nella lista, sucessiavamente potremo usare questo nome per cancellare il rispettivo filmato.

Di: alispiegate | 26/09/2020 18:25:18


Hola Professore!!!!!!!
...vedo che mi hai bruciato sul tempo in quanto alla risposta!!
...essendo tu un moderatore lascio a te la scelta di tenere o cancelalre il mio post, che è praticamente uguale al tuo!!!!!!!!!
buona serata!

Di: alispiegate | 26/09/2020 18:26:18


Ciao alispiegate,
la mia e la tua spiegazione sono molto simili, ma questo non significa che una delle due sia di troppo.
Non volevo prevaricarti, mi dispiace di essere intervenuto in una tua spiegazione, ma qui non è una gara a chi arriva prima. Questo forum è bello perché vengono cancellati tutti i messaggi Off Topic o le informazioni non esatte. Quando più post rispondono alla stessa domanda non c'è motivo di cancellarne uno: il Forum, e la gente che dedica un po' di tempo ad esso, sono gratificati da tanta partecipazione.
Grazie per il tuo contributo.

Di: Professore | 26/09/2020 18:26:18


hola!
...il fatto che mi ha bruciato sul tempo voleva solo essere una battuta scherzosa e di questo non devi ne dispiacerti ne scusarti!
Era solo riferita al fatto che hai pubblicato mentre stavo scrivendo la risposta!
Come dici tu, questa non è una gara, ma una comunità che cerca di aiutarsi a vicenda mettendo in campo le proprie esperienze su temi ben precisi, flash in questo caso!
un saluto a tutti.

Di: alispiegate | 26/09/2020 18:26:18


SIETE GRANDI!!! Grazie 1000, anzi un 1000000 a tutti e due!! Avere più maestri (o prof... ) è una gran cosa!!Se non si capisce con una spiegazione ce n'è subito un'altra...
Finalmente 'sti array sono meno ostici....!! Credo di aver capito e ho anche già provato ad usarli per creare il mio "cancellino": funziona alla perfezione!
Approfitto ancora della vostra grande disponibilità per fissare alcuni punti: correggetemi se sbaglio
Detto in parole povere e ...profane
L'array è una lista;
con push si inserisce una nuova voce in un array vuoto;
lenght invece indica tutta la "lunghezza" o "capienza" dell'array
Ho visto in qualche fla trovato in rete che c'è la voce split invece di push. A che serve, come e quando si usa?
Grazie per la vostra pazienza e per la disponibilità a condividere conoscenza!

Di: alice33 | 26/09/2020 18:26:18


hola!!!
...purtroppo il metodo "split" non l'ho trovato nella reference (però è anche vero che non sono ancora passato a flash8 :p), dal modo di utilizzo che tu indichi, ovvero inserire un elemento in un array il metodo che più gli si avvicina per nome e funzione è il metodo: "splice"
di cui la signatura riportata è:
myArray.splice(inizio, numeriEliminati, valore0,valore1...valoreN)
...da come ho capito leggendo la reference (purtroppo non ho mai usato tale metodo) questo metodo permette di inserire o eliminare un elemento dell'array in una posizione specifica...
credo che funzioni in uesto modo:
inizio: indica l'indice da cui iniziare ad inserire o cancellare elementi.
numeriEliminati: indica il numero di elementi che devono essere cancellati a partire dall'indice specificato in "inizio" (la reference indica anche che se questo parametro non viene messo vendgono cancellati tutti gli elementi a partire dall'indice specificato e 0 indica la cancellazione di nessun elemento)
valore0,valore1...valoreN: indicano i valori da aggiungere all'array e l'aggiunta parte dall'indice specificato in "inizio", la reference indica che tali parametri sono opzionali.
...come metodo ritengo che possa essere utile per inserire in modo ordinato gli elementi nell'array oppure per cancellare selettivamente gruppi di elementi...
La differenza sostanziale del metodo "splice" con il metodo "push" è che il metodo "push" inserisce i nuovi elementi in coda all'array, quindi all'ulimo posto, in più il metodo push ritorna il nuovo valore di "lenght" cioè la nuova lunghezza della lista.
...spero di esserti stato utile..

Di: alispiegate | 26/09/2020 18:26:18


Ed eccomi di nuovo qua...
Come avevo anticipato i metodi per gli Array sono tantissimi, per questo non li avevo enumerati tutti, ci vorrebbero pagine e pagine.
Spiego quelli che avete nominato...
push() - metodo di un Array.
Aggiunge uno o più valori in fondo a un Array e restituisce la nuova lunghezza, per esempio partiamo con un Array di due elementi:
mioArray = new Array("pippo", "pluto");
possiamo utilizzare push() per aggiungere altri due elementi all'array, in uno dei seguenti modi:
1.
mioArray.push("topolino", "paperino");
2.
unNumero = mioArray.push("topolino", "paperino");
Nel secondo caso abbiamo una variabile (unNumero) che vale 4, cioé le nuova lunghezza dell'Array.
In tutti e due i casi il nostro Array è stato modificato, adesso il suo contenuto è il seguente:
mioArray[0] = "pippo";
mioArray[1] = "pluto";
mioArray[2] = "topolino";
mioArray[3] = "paperino";
splice() - metodo di un Array.
Il metodo Splice serve a eliminare un certo numero di valori dall'interno di un Array, ed eventualmente può aggiungerne.
Prendiamo mioArray dal precedente esempio, ricordiamo che ha quattro stringhe contenute al suo interno. Possiamo usare splice per cancellare uno o più valori, in questo modo:
mioArray.splice(1, 2);
In questo modo abbiamo eliminato due valori a partire da quello con indice 1, il nostro Array
("pippo", "pluto", "topolino", "paperino")
diventa
("pippo", "paperino")
Se avessimo voluto aggiungere dei valori al posto di quelli tolti avremmo potuto scrivere:
mioArray.splice(1, 2, "minnie", "gambadilegno", "paperone");
Il nostro Array
("pippo", "pluto", "topolino", "paperino")
sarebbe diventato
("pippo", "minnie", "gambadilegno", "paperone", "paperino")
Splice non restituisce nessun valore.
split() - metodo di una String.
Il motivo per cui non trovate split nella reference degli Array è che questo è un metodo per le stringhe, il suo risultato è comunque un Array.
Data la seguente stringa:
miaStringa = "cane gatto topo papera gallina";
possiamo ottenere un Array utilizzando il metodo split, in questo modo:
mieiAnimali = miaStringa.split(" ");
quallo che otteniamo è un Array con cinque elementi:
mieiAnimali[0] = "cane";
mieiAnimali[1] = "gatto";
mieiAnimali[2] = "topo";
mieiAnimali[3] = "papera";
mieiAnimali[4] = "gallina";
Questo perché split divide una stringa in corrispondenza del carattere che noi indichiamo, prima abbiamo usato lo spazio, ma accetta qualsiasi combinazione di caratteri, per esempio se avessimo usato la stringa “ga”, in questo modo:
miaStringa = "cane gatto topo papera gallina";
mieiAnimali = miaStringa.split("ga");
avremmo ottenuto questo:
mieiAnimali[0] = "cane ";
mieiAnimali[1] = "tto topo papera ";
mieiAnimali[2] = "llina";
Per finire vi lascio anche il contrario di split che è join().
join() - metodo di un Array.
Unisce tutti gli elementi di un Array concatenandoli con una stringa a piacere, restituisce una stringa.
Dato il seguente Array:
mioArray = new Array("pippo", "pluto", "topolino", "paperino");
scrivendo:
miaStringa = mioArray.join(" - ");
otteniamo questo:
miaStringa = "pippo - pluto - topolino - paperino";
ovvero tutti i valori dell'Array concatenati dal separatore usato nell'argomento (in questo caso SPAZIO-LINEA-SPAZIO).

Di: Professore | 26/09/2020 18:26:18


EVVIVA! TUTTO CHIARISSIMO!!!! Il timore degli array mi sta passando GRAZIE ANCORA! Le vostre spiegazioni sono splendide! Ho imparato più dalle risposte in questo forum che in ore e ore di letture e ricerche sul manuale...!!
Trovo che il manuale sia abbastanza difficile per i "novellini" come me... io perlomeno non riesco a "tradurre" in esempi semplici quello che dice e poi bisogna saltare da un link all'altro per cercare di farsi un'idea globale della questione....

Di: alice33 | 26/09/2020 18:26:18