Operazioni con gli oggetti

ActionScript è un linguaggio di programmazione orientato agli oggetti. La programmazione orientata agli oggetti è semplicemente un modello di programmazione, un modo di organizzare il codice per definire un programma che utilizza gli oggetti.

In precedenza il termine “programma per computer” è stato definito come una serie di istruzioni o procedure che il computer esegue. Concettualmente, quindi, potete immaginare che un programma è solo un lunghissimo elenco di istruzioni. In realtà, nella programmazione orientata agli oggetti, le istruzioni sono raggruppate in base all'oggetto a cui si riferiscono. Di conseguenza, il codice è organizzato in moduli funzionali dove le procedure correlate o i dati correlati sono raggruppati in un contenitore.

Adobe Flash Professional

I simboli utilizzati in Flash Professional sono degli oggetti. Supponete di aver definito un simbolo del clip filmato, ad esempio il disegno di un rettangolo, e di aver inserito una copia sullo stage. Il simbolo del clip filmato è anche, letteralmente, un oggetto di ActionScript; oltre a essere una istanza della classe MovieClip.

Sono diverse le caratteristiche del clip filmato che possono essere modificate. Dopo averlo selezionato, potete cambiare i valori nella finestra di ispezione Proprietà, cioè modificare la coordinata x o la larghezza. Potete anche regolare i colori, modificando il valore alpha (trasparenza) o applicare un filtro ombra esterna. Con altri strumenti di Flash Professional potete apportare ulteriori modifiche come, ad esempio, applicare una rotazione usando lo strumento Trasformazione libera. Tutti questi diversi modi in cui è possibile modificare un simbolo di clip filmato in Flash Professional sono disponibili anche in ActionScript. Potete modificare il clip filmato in ActionScript cambiando i frammenti di dati che vengono combinati nel pacchetto definito oggetto MovieClip.

Nella programmazione orientata agli oggetti di ActionScript, una classe può comprendere tre tipi di caratteristiche:

  • Proprietà

  • Metodi

  • Eventi

Questi elementi permettono di manipolare i dati utilizzati dal programma e di definire le azioni da eseguire e la relativa sequenza.

Proprietà

Una proprietà rappresenta una porzione di dato che, combinata con altre, fa parte dell'oggetto. Ad esempio, un oggetto “song” potrebbe avere le proprietà artist e title ; la classe MovieClip ha proprietà del tipo rotation , x , width e alpha . Le proprietà vengono utilizzate come se fossero variabili singole; in realtà, le proprietà possono essere considerate anche come semplici variabili secondarie di un oggetto.

Ecco alcuni esempi dell'impiego di proprietà nel codice ActionScript. Questa riga di codice sposta il clip filmato denominato square nella coordinata x di 100 pixel:

square.x = 100;

Questa riga di codice utilizza la proprietà rotation per imprimere al clip filmato square la stessa rotazione del clip filmato triangle :

square.rotation = triangle.rotation;

Questa riga di codice modifica la scala orizzontale del clip filmato square su un valore di una volta e mezzo superiore rispetto all'originale:

square.scaleX = 1.5;

Notate la struttura comune: si utilizza una variabile ( square , triangle ) come nome dell'oggetto, seguita da un punto ( . ) e il nome della proprietà ( x , rotation , scaleX ). Il punto, conosciuto come operatore punto , introduce un elemento secondario di un oggetto. L'intera struttura, “nome variabile-punto-nome proprietà”, viene considerata un'unica variabile che dà il nome a un singolo valore della memoria del computer.

Metodi

Un metodo è un'azione che un oggetto può eseguire. Ad esempio, supponete di aver creato un simbolo di clip filmato in Flash Professional contenente vari fotogrammi e animazioni nella linea temporale. Potete riprodurre o interrompere il clip filmato oppure spostare l'indicatore di riproduzione su un particolare fotogramma.

Questa riga di codice indica di avviare la riproduzione del clip filmato denominato shortFilm :

shortFilm.play();

Questa riga di codice indica di interrompere la riproduzione del clip filmato denominato shortFilm (l'indicatore di riproduzione si ferma nel punto in cui si trova, come succede quando si preme il tasto pausa di un video):

shortFilm.stop();

Questa riga di codice indica di spostare l'indicatore di riproduzione al fotogramma 1 e di interrompere la riproduzione del clip filmato denominato shortFilm (come succede quando si riavvolge un video):

shortFilm.gotoAndStop(1);

I metodi si invocano proprio come le proprietà: si scrive il nome dell'oggetto (una variabile) seguito da un punto, poi si aggiunge il nome del metodo seguito da due parentesi. Le parentesi indicano la chiamata al metodo, vale a dire che si sta richiedendo all'oggetto di eseguire quella determinata azione. A volte le parentesi possono contenere dei valori o delle variabili che forniscono informazioni aggiuntive necessarie per eseguire l'azione. Questi valori aggiuntivi vengono definiti parametri del metodo. Ad esempio, per il metodo gotoAndStop() è necessario specificare il fotogramma dove l'indicatore di riproduzione si deve fermare, pertanto richiede la specifica di un parametro tra parentesi. Altri metodi, come play() e stop() , sono sufficientemente chiari e non richiedono informazioni supplementari, anche se le due parentesi del nome vengono mantenute.

Contrariamente alle proprietà e alle variabili, i metodi non sono utilizzati come segnaposto di valori. Tuttavia alcuni di essi possono eseguire dei calcoli e restituire un risultato che può essere utilizzato come una variabile. Per esempio, il metodo toString() della classe Number converte il valore numerico in una stringa di testo:

var numericData:Number = 9; 
var textData:String = numericData.toString();

Ad esempio, potete utilizzare il metodo toString() per visualizzare il valore della variabile Number in un campo di testo dello schermo. La proprietà text della classe TextField è definita come un tipo String, pertanto può contenere solo valori di testo. (La proprietà text rappresenta il testo visualizzato sullo schermo). Questa riga di codice converte il valore numerico della variabile numericData in testo e lo visualizza sullo schermo nell'oggetto TextField denominato calculatorDisplay :

calculatorDisplay.text = numericData.toString();

Eventi

Un programma per computer è una serie di istruzioni che il computer esegue in sequenza. I programmi più semplici non sono nient'altro che una serie di procedure che il computer esegue e terminate le quali il programma finisce. I programmi creati con ActionScript, tuttavia, sono progettati per non interrompersi e attendere l'input da parte dell'utente o il verificarsi di altre condizioni. Gli eventi sono il meccanismo che definisce le istruzioni che il computer esegue e la relativa sequenza.

In sostanza, gli eventi sono condizioni che si verificano di cui ActionScript è consapevole e a cui è in grado di reagire. Molti eventi sono collegati all'interazione dell'utente, ad esempio la selezione di un pulsante o la pressione di un tasto della tastiera, ma ne esistono anche di altri tipi. Per esempio, se usate ActionScript per caricare un'immagine esterna, esiste un evento che può avvertire quando l'immagine è stata caricata completamente. Quando un programma ActionScript è in esecuzione, concettualmente resta in attesa del verificarsi di determinati eventi. Quando questi eventi si realizzano, esegue il codice ActionScript specificato per quegli eventi.

Principi di gestione degli eventi

Per gestione degli eventi si intende la definizione delle azioni da eseguire in risposta a particolari eventi. La scrittura di codice ActionScript per la gestione degli eventi presuppone l'identificazione di tre elementi importanti:

  • L'origine dell'evento: su che oggetto si verificherà l'evento? Ad esempio, quale pulsante è stato selezionato o quale oggetto Loader carica l'immagine? L'origine dell'evento corrisponde anche al target dell'evento , in quanto si tratta dell'oggetto in cui il computer esegue l'azione (in cui l'evento si verifica).

  • L'evento: qual è l'evento che si attende, l'evento a cui bisogna rispondere? È particolarmente importante identificare l'evento specifico, perché molti oggetti attivano eventi diversi.

  • La risposta: che cosa deve succedere quando l'evento si realizza?

Il codice ActionScript per la gestione degli eventi deve sempre comprendere questi tre elementi e riprodurre questa struttura di base (gli elementi in grassetto sono segnaposti modificabili a seconda del caso specifico):

function eventResponse(eventObject:EventType):void 
{ 
    // Actions performed in response to the event go here. 
} 
  
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);

Questo esempio di codice esegue due compiti. Per prima cosa, definisce una funzione, vale a dire specifica le azioni che devono avvenire in risposta all'evento. In secondo luogo, chiama il metodo addEventListener() dell'oggetto source, in pratica associando la funzione all'evento. Quando si verifica l'evento vengono attivate le azioni descritte nella funzione. Consideriamo ogni compito in maggiore dettaglio.

Una funzione rappresenta un modo per raggruppare varie azioni creando un'unica entità dotata di un nome proprio. Le funzioni sono quasi identiche ai metodi, con l'unica differenza che non sono necessariamente associate a una classe specifica; infatti, si potrebbe definire il termine “metodo” come una funzione associata a una classe specifica. Una funzione per la gestione di eventi deve avere obbligatoriamente un nome (in questo caso eventResponse ) e un parametro (nel nostro esempio: eventObject ). La specifica di un parametro per una funzione equivale alla dichiarazione di una variabile, di conseguenza, per il parametro è necessario definire il tipo di dati. In questo esempio, il tipo di dati del parametro è EventType .

A ogni tipo di evento che si desidera ascoltare è associata una classe ActionScript. Il tipo di dati specificato per il parametro funzione è sempre la classe associata dell'evento specifico a cui si desidera rispondere. Ad esempio, un evento click (attivato quando l'utente fa clic su un elemento con il mouse) è associato alla classe MouseEvent. Per scrivere una funzione di listener per un evento click , dovete definire la funzione di listener con un parametro con associato il tipo di dati MouseEvent. Infine, tra le parentesi graffe ( { ... } ) scrivete le procedure che il computer deve eseguire quando l'evento si verifica.

Una volta scritta la funzione di gestione degli eventi, dovete comunicare all'oggetto di origine dell'evento (l'oggetto su cui si verifica l'evento, ad esempio, il pulsante) che la funzione deve essere chiamata nel momento in cui l'evento si verifica. Per registrare la funzione con l'oggetto di origine dell'evento, chiamate il metodo addEventListener() dell'oggetto, infatti, tutti gli oggetti associati ad eventi sono associati anche al metodo addEventListener() . Il metodo addEventListener() accetta due parametri:

  • Prima di tutto, il nome dell'evento specifico a cui rispondere. Ogni evento è collegato a una classe specifica. Ogni classe event ha un valore speciale, che è come un nome univoco, definito per ciascuno dei suoi eventi e che utilizzate come primo parametro.

  • Secondariamente, il nome della funzione di risposta all'evento. Si noti che i nomi di funzione passati come parametri vanno scritti senza parentesi.

Processo di gestione degli eventi

Segue una descrizione dettagliata del processo che si mette in atto quando si crea un listener di eventi. L'esempio illustra la creazione di una funzione di listener da chiamare quando l'utente fa clic sull'oggetto myButton .

Il codice scritto dal programmatore è il seguente:

function eventResponse(event:MouseEvent):void 
{ 
    // Actions performed in response to the event go here. 
} 
 
myButton.addEventListener(MouseEvent.CLICK, eventResponse);

Ecco cosa succede quando il codice viene eseguito:

  1. Nel momento in cui carica il file SWF, il computer registra l'esistenza della funzione eventResponse() .

  2. Il computer, allora, esegue il codice (e in particolare le linee del codice che non sono presenti in una funzione). In questo caso è presente una sola riga di codice: chiamata al metodo addEventListener() nell'oggetto di origine dell'evento (denominato myButton ) e passaggio della funzione eventResponse come parametro.

    Internamente, myButton mantiene un elenco di funzioni che intercettano ciascuno di questi eventi. Quando viene chiamato il metodo addEventListener() , myButton registra la funzione eventResponse() tra i suoi listener di eventi.

  3. Quando l'utente fa clic sull'oggetto myButton , viene attivato l'evento click (definito nel codice come MouseEvent.CLICK ).

    A questo punto, si verifica quanto segue:

    1. Viene creato un oggetto che è un'istanza della classe associata all'evento in questione (MouseEvent in questo esempio). Per molti eventi, questo oggetto è un'istanza della classe Event. Per gli eventi del mouse è un'istanza MouseEvent. Per altri eventi, è un'istanza della classe associata a tale evento. L'oggetto creato è noto come oggetto evento e contiene informazioni specifiche sull'evento: tipo di evento, posizione in cui si è verificato e altre informazioni specifiche, se disponibili.

    2. Il computer esamina l'elenco di listener di eventi registrati in myButton e chiama ogni singola funzione passando l'oggetto evento come parametro. Dal momento che la funzione eventResponse() è uno dei listener di myButton , come parte del processo il computer chiama la funzione eventResponse() .

    3. Nel momento in cui viene chiamata la funzione eventResponse() , il suo codice viene eseguito e le azioni specificate vengono attivate.

Esempi di gestione degli eventi

Seguono alcuni esempi concreti di codice di gestione degli eventi per dare un'idea degli elementi evento più comuni e delle possibili variazioni disponibili per scrivere codice per la gestione di eventi:

  • Selezionare un pulsante per avviare la riproduzione del clip filmato corrente. Nell'esempio che segue, playButton è il nome istanza del pulsante e this è un nome speciale che significa “l'oggetto corrente”:

    this.stop(); 
     
    function playMovie(event:MouseEvent):void 
    { 
        this.play(); 
    } 
     
    playButton.addEventListener(MouseEvent.CLICK, playMovie);
  • Rilevare l'inserimento di testo in un campo di testo. Nell'esempio che segue, entryText è un campo di testo di input e outputText è un campo di testo dinamico:

    function updateOutput(event:TextEvent):void 
    { 
        var pressedKey:String = event.text; 
        outputText.text = "You typed: " + pressedKey; 
    } 
     
    entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);
  • Selezionare un pulsante per accedere a un URL. Nell'esempio che segue, linkButton è il nome di istanza del pulsante:

    function gotoAdobeSite(event:MouseEvent):void 
    { 
        var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/"); 
        navigateToURL(adobeURL); 
    } 
     
    linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);

Creazione di istanze di oggetti

Per poter utilizzare un oggetto in ActionScript, l'oggetto deve già essere stato creato. Il primo passo nella creazione di un oggetto è la dichiarazione di una variabile, vale a dire, l'identificazione di una porzione di memoria del computer destinata a contenere dei dati. In seguito, questo spazio vuoto va riempito assegnando un valore alla variabile, in pratica creando un oggetto e memorizzandolo nella variabile in modo che possa diventare utilizzabile. Il processo di creazione di un oggetto corrisponde alla creazione di un'istanza dell'oggetto. In altre parole, viene creata un'istanza di una particolare classe.

Esiste un modo semplice per creare un'istanza di un oggetto che non prevede l'utilizzo di ActionScript. In Flash Professional, inserite un simbolo di clip filmato, un simbolo di pulsante o un campo di testo sullo stage e ad esso assegnate un nome di istanza. Flash Professional dichiara automaticamente una variabile usando quel nome di istanza, crea un'istanza dell'oggetto e memorizza l'oggetto nella variabile. Analogamente, in Flex create un componente in MXML codificando un tag MXML o inserendo il componente nell'editor in modalità Flash Builder Design. Quando assegnate un ID a questo componente, tale ID diventa il nome di una variabile ActionScript contenente l'istanza del componente.

Tuttavia, non sempre vorrete creare un oggetto graficamente, inoltre per gli oggetti non visuali questo non è possibile. Esistono altri modi per creare istanze dell'oggetto utilizzando solo ActionScript.

Molti tipi di dati di ActionScript consentono di creare istanze usando un' espressione letterale , vale a dire, un valore scritto direttamente in linguaggio ActionScript. Di seguito sono forniti alcuni esempi.

  • Valore numerico letterale (inserire il numero direttamente):

    var someNumber:Number = 17.239; 
    var someNegativeInteger:int = -53; 
    var someUint:uint = 22;
  • Valore String letterale (racchiudere il testo tra virgolette):

    var firstName:String = "George"; 
    var soliloquy:String = "To be or not to be, that is the question...";
  • Valore Boolean letterale (usare i valori letterali true o false ):

    var niceWeather:Boolean = true; 
    var playingOutside:Boolean = false;
  • Valore Array letterale (racchiudere un elenco di valori separati da virgola tra parentesi quadre):

    var seasons:Array = ["spring", "summer", "autumn", "winter"];
  • Valore XML letterale (inserire XML direttamente):

    var employee:XML = <employee> 
            <firstName>Harold</firstName> 
            <lastName>Webster</lastName> 
        </employee>;

ActionScript definisce espressioni letterali anche per i tipi di dati Array, RegExp, Object e Function.

Il modo più comune per creare un'istanza di un tipo dati è utilizzare l'operatore new con il nome della classe, come mostrato di seguito:

var raceCar:MovieClip = new MovieClip(); 
var birthday:Date = new Date(2006, 7, 9);

La creazione di un oggetto mediante l'operatore new è comunemente descritta con l'espressione “chiamare la funzione di costruzione della classe”. La funzione di costruzione è uno speciale metodo chiamato come parte del processo di creazione di un'istanza di una classe. Notate che per creare un'istanza in questo modo, il nome della classe deve essere seguito dalle parentesi e può essere necessario specificare dei parametri, proprio come accade quando si chiama un metodo.

Utilizzate l'operatore new per creare un'istanza dell'oggetto anche per i tipi di dati che consentono di creare istanze tramite espressioni letterali. Queste due righe di codice, ad esempio, generano lo stesso risultato:

var someNumber:Number = 6.33; 
var someNumber:Number = new Number(6.33);

È importante avere dimestichezza con il metodo new ClassName () per la creazione degli oggetti Molti tipi di dati di ActionScript non hanno una rappresentazione visiva, per cui non possono essere creati inserendo un elemento sullo stage di Flash Professional né utilizzando la modalità Design dell'editor MXML di Flash Builder. L'unica opzione di cui disponete è creare un'istanza di questi tipi di dati in ActionScript usando l'operatore new .

Adobe Flash Professional

In particolare, Flash Professional permette di usare l'operatore new per creare un'istanza di un simbolo di clip filmato definito nella Libreria ma non inserito sullo stage.