Versione originale di Warp9 Spunti e
illuminazioni presi su un paio di manuali e su un saaaaaacco di siti in giro per
la rete... :-)
Livello di difficoltà: Intermedio/Avanzato
Cose da sapere per affrontare questo tutorial:
Basi di programmazione
Conoscenza basilare di Flash (timeline, action, movie clip ecc.)
Voglia di farsi del male...
Dove stanno le pastiglie per il mal di testa
Svolgimento
Una delle prime cose che si affronta quando si decide di imparare
un linguaggio di programmazione, a parte la logica dello stesso, è il concetto
di variabile.
Che cos'è una
variabile
Immaginate una variabile come un cassetto o una scatoletta dove
potete riporre qualcosa. In questo caso quel qualcosa sono
informazioni che vengono memorizzate e possono quindi essere
riprese e riutilizzate in un secondo tempo.
Ma che tipo di informazioni ? Solitamente, ne esistono di tre
tipi:
Numeriche
Numeri che possono essere trattati con
operazioni matematiche e di confronto
Stringhe
Valori alfanumerici (numeri e
lettere) che hanno sempre una valenza di testo
Logiche
Informazioni particolari che comprendono
due soli valori: Vero (True) o Falso (False). Flash utilizza
anche il valore numerico zero trattandolo come Falso, mentre
qualsiasi altro corrisponde a Vero.
Come si definisce una
variabile
Solitamente, nei normali linguaggi di programmazione, si devono
compiere due operazioni: la definizione del suo nome e del suo tipo. In
parole povere bisogna prima dare un nome, ad esempio: Pippo (un sacco di
fantasia, lo so...) e poi definire di che tipo di variabile si
tratta (per esempio numerica o testo) in base al dato che dovrà ospitare.
Una volta fatte queste due operazioni, la variabile è pronta per accettare
un tipo di dato e solo quello. Quindi se impostiamo la variabile Pippo
come numerica, non possiamo poi decidere di usarla per memorizzare delle
stringhe o viceversa.
In Flash le cose non stanno proprio così (e se no che divertimento
ci sarebbe ?) .
Nel linguaggio ActionScript questa distinzione per il tipo di
variabile non esiste e cioè non è necessario definire a priori una
variabile. Anzi, se vogliamo dirla tutta, è impossibile. Questo
cosa vuol dire ? Che in Flash, una variabile viene determinata dal
contesto al quale è applicata. In pratica in una variabile i numeri
possono essere trattati come stringhe e viceversa e il modo con cui una
variabile viene valutata dipende dalla variabile stessa e cioè se è scritta come
stringa, numero o dato logico.
So che adesso sembra un casino, ma poco per volta vedrete che le
cose si chiariranno.
In Flash, il modo classico di impostare una variabile è usando
l'action Set Variable dall'elenco delle action disponibili per
l'inserimento in un frame.
Nel box chiamato Variable si inserisce il nome della
variabile e comparirà subito dopo i due punti del comando. Nel box chiamato
Value si inserisce il valore o l'espressione che deve contenere la
variabile e comparirà nella parte destra dell'istruzione. Il riquadro a
fianco del box Value è dove potete scegliere che tipo di dato volete
assegnare alla vostra variabile e quindi, che tipo di variabile volete che essa
diventi. String Literal significa stringa letterale e cioè un valore
alfanumerico. Expression significa espressione e comprende sia
i valori numerici che le espressioni (queste ultime comunque
finiscono sempre per dare un valore, quindi...). Per quanto riguarda i valori
logici, questi si prendono dalle espressioni o da istruzioni di
Flash.
Facciamo qualche esempio.
Set Variable: "Pippo" = "a"
La variabile di nome Pippo è di tipo String
Literal (alfanumerico) e contiene la stringa a
Set Variable: "Pippo" = "1"
La variabile di nome Pippo è di tipo String
Literal (alfanumerico) e contiene la stringa 1
Ma nella seconda c'è un 1, come fa ad essere una stringa
? Per due motivi: il primo è che una stringa può contenere caratteri
alfanumerici e cioè sia lettere che numeri e il secondo che il
numero uno è racchiuso tra virgolette, cosa che fa diventare il
numero una stringa.
Set Variable: "Pippo" = 1
La variabile di nome Pippo è di tipo
Expression (Numerico) e contiene il valore 1
Qui le virgolette non ci sono e quindi il numero uno rimane
un valore.
Tutto chiaro fino a qui ? Come vedete, la stessa istruzione può
generare diversi tipi di variabile, che sono definiti dal contesto che
decidete.
Come si usa una
variabile
Qui le cose si fanno ancora più
contorte... preparatevi.
L'istruzione Set Variable non fa solo la definizione, ma
può anche compiere delle operazioni. Non è assolutamente detto che il
contenuto di una variabile debba rimanere immutato, la maggior parte delle volte
infatti questo cambia a seconda di quello che vogliamo far eseguire al programma
o del valore di cui abbiamo bisogno.
Esempio: Abbiamo detto che Set Variable: "Pippo" = 1
vale appunto, 1. Ma se scriviamo Set Variable: "Pippo" = 1 + 1, la
variabile varrà 2.
Ma perchè non scriviamo direttamente il valore due ? Perchè
quella che abbiamo appena fatto si chiama Espressione (in questo caso
numerica, ma le vediamo dopo) e cioè un calcolo.
Tanto per farvi venire un altro po' di mal di testa, sappiate che
le variabili possono essere usate tra di loro. Esempio: Set Variable:
"Pippo" = 1 Set Variable: "Pluto" = 1 Set Variable:
"Paperino" = Pippo + Pluto In questo caso abbiamo definito due variabili
(Pippo e Pluto) di valore 1 e poi ne abbiamo definita una terza
(Paperino) che è la somma delle precedenti e che vale 2.
Se invece vogliamo per esempio confrontare il risultato di
una variabile per definirne una seconda, si può fare così:
If (Pippo=1) Set Variable: "Pluto" = "Pippo vale
1" Else Set Variable: "Pluto" = "Pippo non vale 1" End If
Quello che abbiamo appena costruito si chiama Istruzione
condizionata. Praticamente abbiamo detto a Flash di controllare la
variabile Pippo e di definire la variabile Paperino a seconda di
quello che vale Pippo. Il ciclo funziona così:
If (Pippo=1)
Se Pippo vale 1
Set Variable: "Pluto" = "Pippo vale 1"
Allora setta Pluto con questa stringa
Else
Se no, se invece non vale 1
Set Variable: "Pluto" = "Pippo non vale 1"
Allora setta Pluto con questa stringa
End If
Fine
E questo è il risultato in Flash
AAAAAAAH... c'è una casella che cambia da sola !!! E come fa
?
Semplicemente perchè è un Campo di testo. Questo
particolare oggetto ha una particolarità: nelle sue proprietà si può definire un
nome di variabile e se questo nome corrisponde a quello di una variabile
definita con un Set Variable questa casella mostrerà o registrerà il suo
valore.
In pratica:
Un altro uso delle variabili molto diffuso (e utile) nei movies è
associato ai contatori. Come dice la parola stessa, un contatore
conta. Le applicazioni sono molteplici: - barre di progresso -
incrementi - loop attraverso gli stessi frames - ecc.
Mettiamo caso di voler ripetere i frames che vanno da 10 a 20 per
tre volte prima di passare al frame 21. Basta inserire nel frame 20 queste
actions:
Set Variable: "contatore" = contatore + 1 If (contatore <
3) Go To and Play (10) End If
Ed ecco il nostro bel contatore che funziona così:
Set Variable: "contatore" = contatore + 1
Setta la variabile contatore con un valore che vale
la stessa variabile + 1 NOTA BENE: dato che contatore non
è stata definita in precedenza, al primo passaggio vale 0 e quindi si ha
un risultato di 1 per effetto della somma.
If (contatore < 3)
Se contatore è minore di 3
Go To and Play (10)
Allora vai al frame 10 e riproduci
End If
Fine del ciclo di controllo e quindi passaggio al frame 21
Le variabili e gli
operatori
Nella prima parte abbiamo visto alcuni esempi di come si possono usare le
variabili. Però, per eseguire un'espressione o un confronto c'è bisogno degli
operatori.
Si definisce operatore un elemento utilizzato per valutare delle
espressioni, per concatenare delle stringhe o per confrontare numeri e
stringhe.
Essi si dividono in:
OPERATORI NUMERICI Seguono le normali regole
esistenti in matematica, quindi: - le operazioni tra parentesi vengono
eseguite prima - seguono moltiplicazione e divisione - per finire
con addizione e sottrazione
( )
Le classiche parentesi tonde. Sono usate per dare la precedenza
in un calcolo, cioè quello che è racchiuso tra di loro viene calcolato per
primo.
+
Somma
-
Sottrazione
*
Moltiplicazione
/
Divisione
=
Uguale (ritorna un valore True/False - vero/falso)
<>
Non uguale, differente
<
Minore di
>
Maggiore di
<=
Minore o uguale a
>=
Maggiore o uguale a
OPERATORI DI STRINGA
""
Doppie virgolette, usate per definire una stringa all'interno di
un'espressione
&
Concatenazione di stringa Esempio: Pippo & Pluto ritorna una
stringa PippoPluto (senza lo spazio)
eq
Equal - Uguale a
ne
Not equal - Diverso da
lt
Less than - Minore di
gt
Greater than - Maggiore di
le
Less equal - Minore o uguale a
ge
Greater equal - Maggiore o uguale a
OPERATORI LOGICI
not
non questo, tutto tranne questo
and
sia questo che quello
or
o questo o quello
Tanto per ritornare al discorso della variabile che viene definita in base al
contesto, anche l'operatore fa la sua bella parte.
Per esempio::
1 + 5 viene valutato come valore grazie all'operatore numerico
+ e quindi si avrà 6 1 + A viene valutato come valore grazie
all'operatore numerico + e quindi si avrà 1 1 & 5 viene
valutato come stringa grazie all'operatore di stringa & e quindi si
avrà 15 1 & A viene valutato come stringa grazie all'operatore di
stringa & e quindi si avrà 1A
Occhio quindi a quale operatore inserite... Solito esempio Flash per
chiarire le idee:
Le variabili e gli
espressioni
Ed eccole qui. In Flash ne esistono di tre tipi: numeriche, stringhe e
logiche. Da brave figliolette della matematica possono essere nidificate
(cioè un'espressione ne può contenere un'altra e così via) ma comunque il
risultato finale viene sempre riportato e valutato come uno di questi tre
tipi.
Espressioni numeriche Il risultato è sempre un
numero ed è composta da un operatore numerico più un numero, una variabile
definita come numerica oppure una funzione che restituisce come risultato
un valore numerico.
Esempio
Set Variable: "Pippo" = 1 + 1
La variabile varrà 2
Esempio strano
Set Variable: "Pippo" = 1 + "1"
Anche in questo caso la variabile varrà 2, anche se il
secondo 1 è racchiuso tra virgolette e quindi è una stringa. Questo
perchè se una stringa contiene solo caratteri numerici e se l'operatore
è numerico, essa verrà valutata come numero (un'aspirina,
grazie...).
Esempio ancora più strano
Set Variable: "Pippo" = 1 + "1 "
In questo caso la variabile varrà 1, perchè se fate
attenzione, tra le virgolette del secondo 1 è racchiuso anche uno
spazio. Questo fa sì che non contenga solo caratteri numerici e quindi
viene trattata come stringa. E dato che non si possono sommare numeri e
lettere, il risultato sarà solo la parte numerica dell'espressione e cioè
il primo 1.
Espressioni di stringa Il risultato è sempre una
stringa ed è composta da un operatore stringa più un testo tra virgolette,
una variabile definita come stringa oppure una funzione che restituisce
come risultato una stringa.
Esempio
Set Variable: "Pippo" = "Pippo"
Mi sembra che le spiegazioni siano superflue
Set Variable: "Pippo" = "1"&"1"
Restituisce la stringa 11
Espressioni logiche Il risultato è sempre una
valore booleano e perciò Vero o Falso ed è composta da un
operatore logico più un confronto stringa, un confronto testo oppure una
funzione che restituisce come risultato un valore logico. Solitamente
si usano nelle istruzioni condizionali (come un ciclo
If...Then...Else) oppure nei cicli ripetitivi (come Loop
While) ma anche l'action Set Variable può ospitarle. In
Flash, True (Vero) restituisce 1 e False (Falso) restituisce
0.
I confronti
I confronti analizzano due espressioni tra di loro e ne riportano sempre solo
due risultati: Vero o Falso. Ne esistono di due tipi: numerici e di
stringa.
Confronti numerici Confrontano due espressioni tra
di loro in base ai numeri che contengono. Il risultato è sempre 1 per
Vero e 0 per Falso e se una delle due espressioni non può essere
convertita in un numero il risultato sarà Falso e quindi 0.
Esempio
Set Variable: "Pippo" = "10 < 5"
Falso - 10 non è minore di 5
Set Variable: "Pippo" = "(11+4) = 15"
Vero - 11+4 è uguale a 15
Confronti tra stringhe Confrontano due espressioni
tra di loro in base ai ai caratteri che contengono. Il risultato è
sempre 1 per Vero e 0 per Falso. La valutazione avviene partendo dal
primo carattere a sinistra della stringa per arrivare fino all'ultimo e si
serve dei codici ASCII per poter effettuare il confronto. E' case
sensitive, cioè è sensibile alle maiuscole e minuscole (infatti le
maiuscole hanno valori ASCII inferiori alle minuscole).
Esempio
Set Variable: "Pippo" = "Pino eq Gino"
Falso - La prima lettera non è uguale
Set Variable: "Pippo" = "Pino gt Pini"
Vero - la lettera finale o ha un valore
ASCII di 111 mentre i ha un valore di 105, quindi è vero che
Pino è maggiore di Pini
Set Variable: "Pippo" = "Sasso gt Saso"
Vero - Sasso ha una lettera in più di
Saso
Tanto per continuare a complicare le cose, i confronti possono essere
concatenati tra di loro utilizzando gli operatori logici AND e OR
(ripeto qui sotto la parte di tabella interessata).
OPERATORI LOGICI
and
sia questo che quello
or
o questo o quello
Questa particolarità offre ai confronti di agire in situazioni più ampie
rispetto a prima.
Per esempio:
(Pippo >= 10) AND (Pippo <= 100) In questo caso, se Pippo
sarà un numero compreso tra 10 e 100, l'espressione porterà Vero, mentre
minore di 10 o maggiore di 100 porterà Falso. Con l'operatore logico
AND tutte e due le espressioni devono essere Vero se si vuole
avere come risultato Vero. Se anche solo una delle due è Falso,
si avrà di ritorno come risultato Falso.
(Pippo = 10) OR (Pippo = 100) Se Pippo sarà 10 oppure 100,
l'espressione porterà Vero, altrimenti porterà Falso. Con l'operatore logico OR basta che una delle due espressioni sia
Vero se si vuole avere come risultato Vero. Per ottenere
Falso, bisognerà che tutte e due le espressioni siano Falso.
Per comodità, questa è una tabella dove vengono prese in esame varie
situazioni che coinvolgono le espressioni logiche.
Primo valore
Operatore logico
Secondo valore
Risultato finale
Falso
AND
Falso
Falso
Vero
AND
Falso
Falso
Falso
AND
Vero
Falso
Vero
AND
Vero
Vero
Falso
OR
Falso
Falso
Vero
OR
Falso
Vero
Falso
OR
Vero
Vero
Vero
OR
Vero
Vero
I percorsi delle
variabili
Abbiamo visto cosa sono, come si definiscono e come si usano le
variabili. Ora vediamo come si richiamano e come si possono definire da un
posto per crearle in un altro.
COME SI RICHIAMANO La cosa è molto più semplice di
quello che sembra.
Una cosa che bisogna ricordare è questa: una variabile creata
sulla timeline principale non esiste per un movie clip o un .swf esterno e
vicecersa.
Tuttavia, e possibile richiamarle tramite percorso. Se
si devono richiamare delle variabili sulla stessa timeline, basta indicarne il
nome. Se invece la variabile da richiamare risiede su un'altra timeline, per
esempio quella di un'altro movie clip o quella del movie principale, bisognerà
inserirne il percorso completo.
Il metodo usato per indicare questi percorsi è identico a quello
usato dall'azione Tell Target(il
link porta al tutorial apposito) con in più una piccola differenza: prima
bisogna inserire il percorso e poi, separato dai due punti ( : ) si
indica il nome della variabile. Anche qui, ricordatevi che uno slash ( /
) indica un percorso assoluto, mentre due punti di seguito ( ..
) indicano un percorso relativo.
Esempio
/movieclip1:Pippo
Viene richiamata la variabile Pippo che risiede
all'interno del Movie Clip Movieclip1
/movieclip1/movieclip2:Pippo
Viene richiamata la variabile Pippo che risiede
all'interno del Movie Clip Movieclip2 che a sua volta risiede
all'interno del Movie Clip Movieclip1
COME SI DEFINISCONO IN UN POSTO PER CREARLE IN UN ALTRO
Prima abbiamo visto come si definisce una variabile tramite
l'action Set Variable. Però abbiamo sempre fatto esempi con una
variabile che veniva creata, risiedeva e doveva essere usata nella stessa
timeline. A volte però si può presentare la necessità di creare la variabile
da una timeline per poterla memorizzare in un altra timeline. Anche qui si
usa la tecnica dei percorsi.
Esempio
Set Variable: "Pippo" = 1
Viene creata la variabile Pippo e risiede nella
stessa timeline
Set Variable: "mc:Pippo" = 1
Viene creata la variabile Pippo e risiede nella
timeline di un movie clip con nome di istanza mc
Set Variable: "..:Pippo" = 1
Partendo da un movie clip che risiede sulla scena
principale, viene creata la variabile Pippo sulla timeline
principale usando un percorso relativo
Set Variable: "../mc2:Pippo" = 1
Partendo da un movie clip viene creata la variabile
Pippo su un altro movie clip usando un percorso relativo
Set Variable: "/mc1/mc2:Pippo" = 1
Partendo da un movie clip viene creata la variabile
Pippo su un altro movie clip usando un percorso
assoluto
Una variabile può anche essere generata o raggiunta in un .swf
esterno tramite l'action Load Movie. In questo caso il livello al
quale è stato caricato il movie sarà indicato prima di indicare il nome della
variabile.
Esempio
Set Variable: "_level1/:Pippo" = 1
Il movie padre è A che carica il movie
B. La variabile viene creata da A e usata da
B.
Ma il più bello l'ho lasciato per ultimo... :-) Credeteci o no,
le variabili possono essere anche generate fuori dal movie e più precisamente da
una stringa di query in un tag html o usando JavaScript.
Da una stringa di query in un tag HTML:
Create un movie nuovo e disegnate all'interno un campo di testo vuoto
con nome di variabile text. Salvatelo con il nome
movie.fla e pubblicate sia il .swf che il .html Con un editor di
testo (va bene anche il notepad) aprite il file movie.html e
cercate il tag OBJECT. All'interno di questo tag, trovate questa
istruzione
<PARAM NAME=movie VALUE="movie.swf">
Alla fine di "movie.swf" aggiungete "?text=ciao" in questo modo
<PARAM NAME=movie VALUE="movie.swf?text=ciao">
Ora cercate il tag EMBED e ripetete l'operazione in modo da
avere questa stringa
<EMBED src="movie.swf?text=ciao"> (è un po' più corta)
Salvate il file, sovrascrivendo quello vecchio.
Se ora provate a lanciare il movie Flash dal file html, vedrete che
dentro la casella di testo ci sarà la parola ciao.
NOTA BENE Con questo sistema possono essere passate anche
variabili multiple usando la sintassi
Assegnate i valori sia nel tag OBJECT che nel tag EMBED
in modo da avere la piena compatibilità con tutti i browsers. Invece
con Internet Explorer per Mac, se rimanete in locale (ossia off-line) non
vedrete un bel niente. Per poterlo visualizzare dovrete fare un upload
sul vostro sito sia del .swf che del .html e digitare sul browser
l'indirizzo completo compreso di
http://
Usando JavaScript
Questo è solo uno dei tanti modi con i quali potete passare variabili a
un movie tramite JavaScript. In questo esempio un link nella pagina
html passa una variabile al movie Flash quando viene
cliccato. NOTA: non funziona con Internet Explorer per Mac. (e
quando mai ?)
Create un movie nuovo e disegnate all'interno un campo di testo vuoto
con nome di variabile text. Aggiungete un secondo frame in modo
da averne due in totale. Salvatelo con il nome movie.fla e
pubblicate sia il .swf che il .html usando il template di default. Con
un editor di testo (va bene anche il notepad) aprite il file
movie.html e all'interno dei tag HEAD inserite questo
codice, facendo attenzione di copiarlo esattamente.
<script
LANGUAGE="JavaScript"> function
PassFlash(){ window.document.movie.SetVariable("text",
"ciao"); } </script>
Ora cercate il tag EMBED e trovate i parametri HEIGHT e
WIDTH. Se non c'è già inserite questa istruzione
NAME=movie
e subito di seguito inserite
swLiveConnect=true
Ora, giusto sopra il tag di chiusura BODY inserite questo
cocide
<a href="#" onClick="PassFlash( )">Passa la
variabile</a>
Nota: le parentesi dopo PassFlash non devono avere spazi
in mezzo.
Salvate il file, sovrascrivendo quello vecchio.
Se ora provate a lanciare il movie Flash dal file html e cliccate sopra
il link Passa la variabile, vedrete che dentro la casella di testo
ci sarà la parola ciao.
NOTA BENE Come avrete notato, le possibilità di far convivere
Flash e JavaScript sono infinite. Con un po' di fantasia e di studio si
può arrivare a combinare delle
meraviglie.
Un paio di consigli
finali
Yu-hu !!! Praticamente il tutorial è finito.
Una cosa che è bene tenere presente è che in Flash, con un po' di
sano autolesionismo, è possibile creare dei movie veramente complessi che
lavorano con timeline multiple. A causa di ciò, può verificarsi la
duplicazione di nomi di variabili su timeline differenti e quindi la scrittura
di un programma inizia a farsi complicata. Per ovviare a questo, si possono
usare alcune tecniche:
Quando state controllando il vostro movie in Test Movie,
potete selezionare Control ---> List Variables per avere una lista
di tutte le variabili dichiarate su qualunque timeline e dei loro relativi
valori.
Per controllare il valore di una variabile quando si attiva una specifica
istruzione, usate il comando Trace. Potete inserire il nome della
variabile che vi interessa nel box di dialogo che apparirà e quando andrete in
Test Movie, apparirà una finestra di output che vi indicherà il valore.
Inserire momentaneamente una campo di testo sulla scena che abbia lo
stesso nome della variabile che volete tenere sotto controllo, può fornirvi un
aiuto visuale per determinare se e quando questa variabile viene
definita. Un campo di testo può accettare nel nome anche percorsi assoluti
o relativi, quindi non ci saranno problemi per controllare variabili in giro
per il movie.