Reflex e ReflexMe: da Classe base a Classe

Venerdì 13 Giugno, 2008

Nel post Flash CS3: creare un effetto Reflex su qualsiasi MovieClip avevamo visto com'è possibile scrivere una classe, che estende un MovieClip, per collegarla a DesignTime ad un qualsiasi MovieClip in libreria. Ho scoperto, tuttavia, che può risultare più utile ed economico fare il percorso contrario. Ho creato una classe Reflex (Reflex.as), con l'intenzione di usarla esclusivamente da codice. Ho creato questa classe pensando di passare nel costruttore il puntatore ad un MovieClip. La nuova classe Reflex contiene in sostanza lo stesso codice prima inserito nella ReflexMe, ma leggermente modificato in modo da poter funzionare espressamente da codice:

Actionscript:
  1. //
  2. import undolibrary.sfx.*;
  3. //
  4. var rx:Reflex = new Reflex( movieClipInstance );

Continua a leggere... »

Flash CS3: template per la classe Documento

Venerdì 2 Maggio, 2008

Questo è il template che uso per la classe Documento di un generico progetto Flash CS3:

Actionscript:
  1. package {
  2.     /*
  3.     ** @name        : MioDocumento.as
  4.     ** @description : [descrizione]
  5.     ** @author      : =undo=
  6.     ** @web         : http://www.undolog.com
  7.     ** @email       : g.fazioli@undolog.com - g (dot) fazioli (at) undolog (dot) com
  8.     ** @ver         : 1.0
  9.     */
  10.  
  11.     import flash.display.*;
  12.     import flash.events.*;
  13.  
  14.     public class MioDocumento extends MovieClip {
  15.         /*
  16.         ** @private var
  17.         */
  18.  
  19.         public function MainFive():void {
  20.             addEventListener(Event.ADDED_TO_STAGE, init );
  21.         }
  22.  
  23.         /*
  24.         ** @name           : init()
  25.         ** @description    : trigged when added to stage
  26.         */
  27.         protected function init(e:Event):void {
  28.             // todo
  29.         }
  30.     } // constructor
  31. } // package

Classi, Oggetti e Istanze

Martedì 29 Gennaio, 2008

Ho notato spesso confusione quando si parla di Classi, Oggetti ed Istanze. Chi non è particolarmente istruito sulla programmazione ad oggetti spesso confonde il vero significato di questi termini. Sapevo, tuttavia, che esistono due scuole di pensiero riguardo alla definizione di Classe e Oggetto. A me piace la "scuola" che indica la Classe come definizione di un possibile Oggetto e, quindi, l'Oggetto come Istanza della Classe.

Sembra banale, tuttavia mi è capitato - discorrendo con altri - di trovarmi in "conflitto" (per così dire) e poi cadere in equivoci, quando si usano questi termini, partendo casomai dal presupposto che "l'altro" li intenda esattamente come noi.

Io la vedo in questo modo; una Classe è una definizione! Viene appunto definita una classe di possibili oggetti. La Classe è l'insieme di metodi e proprietà (se volete possiamo aggiungere anche gli eventi - che altro non solo che speciali metodi...) che possiederà l'oggetto.

Ad esempio quando scriviamo in Actionscript, o qualsiasi altro linguaggio ad oggetti:

Actionscript:
  1. class MiaClasse {
  2.     function MiaClass() {}
  3.     function MioMetodo() {}
  4. }

Abbiamo definito una Classe e non un Oggetto. Al limite abbiamo "definito" un "possibile" oggetto. Potremmo addirittura sostenere, e non a torto, che l'Oggetto esiste a runtime mentre la Classe no (in verità esistono Classi dinamiche che possono essere definite - e poi usate per creare oggetti - anche a runtime). Escludo le classi statiche, ovviamente che - alla fine - altro non sono che sotto-istanze (o istanze nascoste) e quindi oggetti veri e propri.

Quando invece abbiamo:

Actionscript:
  1. var mioOggetto:MiaClasse = new MiaClasse();

Ecco che mioOggetto è una istanza di MiaClasse()! Cioè mioOggetto è un Oggetto - appunto - di tipo MiaClasse().

Ne deriva, proprio nella filosofia ad oggetti, che di Oggetti di tipo MiaClasse() ne posso avere quanti ne voglio, cosa che non può essere - per la definizione stessa - di MiaClasse(). Ad esempio, se vale ed ha senso la relazione:

Actionscript:
  1. var mioOggetto_1:MiaClasse = new MiaClasse();
  2. var mioOggetto_2:MiaClasse = new MiaClasse();
  3. var mioOggetto_3:MiaClasse = new MiaClasse();
  4. ...
  5. var mioOggetto_n:MiaClasse = new MiaClasse();

Non ha significato:

Actionscript:
  1. class MiaClasse {
  2.     function MiaClass() {}
  3.     function MioMetodo_2() {}
  4. }
  5.  
  6. class MiaClasse {
  7.     function MiaClass() {}
  8.     function MioMetodo_2() {}
  9. }
  10.  
  11. class MiaClasse {
  12.     function MiaClass() {}
  13.     function MioMetodo_3() {}
  14. }

Istanza e Oggetto, quindi, coincidono e sono usate alternativamente per lo stesso significato in diversi contesti.

Probabilmente non frega molto a nessuno... questione di esigenze di completezza... :)

10 motivi per passare ad Adobe Flash CS3

Lunedì 26 Novembre, 2007

2007-11-21_170314 Per alcuni sviluppatori basta sapere che esiste una nuova versione del loro pacchetto di sviluppo preferito per correre ad acquistare l'aggiornamento. Altri, e non a torto, mantengono una maggiore calma e "pretendono" di conoscere gli effettivi miglioramente della nuova versione prima di modificare le proprie abitudini. Nel caso di Adobe Flash CS3 non c'è molto da attendere, visto gli innumerevoli cambiamenti che ha subito il pacchetto da quando Macromedia è stata acquisita da Adobe.
Ecco, quindi, 10 semplici, ma importanti, motivi che, a mio personale parere, bastano per convincersi ad eseguire l'aggiornamento ad Adobe Flash CS3. Mi soffermerò, ovviamente, solo sulle caratteristiche che mi hanno colpito personalmente; questo non vuole essere un elenco esaustivo di tutte le numerose novità introdotte con la suite CS3, solo un volo radente per anticipare qualche features della versione CS3.

1. Installazione

L'installazione è gradevole e rapida, rispetto alle precedenti versioni. Si integra, tra l'altro, con tutti i prodotti Adobe (Dreamweaver CS3, Photoshop CS3 extended, ecc...) il che rende le operazioni di installazione/rimozione ed aggiornamento un vero piacere.

2. Compatibilità a ritroso

Una questione spesso sottovalutata, ma sempre tenuta in considerazione nella storia di Flash: la possibilità di gestire le precedenti versioni del prodotto. In Flash CS3 ci sono tutti gli strumenti sia per migrare che per manipolare le precedenti versioni dei nostri filmati. Troviamo questa possibilità sia nel debug (un debug separato per Actionscript 2.0 e Actionscript 3.0) sia in fase di compilazione del filmato. Scrivere da subito applicazioni Flash in Actionscript 3.0 potrebbe essere controproducente in determinati contesti. Se il vostro sito target ha un traffico notevole potrebbe capitare che molti utenti non hanno ancora installato le ultime versioni del Player Flash per il browser e quindi non vedrebbero il filmato. Tuttavia, come già detto, Flash CS3 permette di sviluppare applicazioni Flash mantendedo la compatibilità a ritroso e quindi non vedo in questo un grosso ostocalo nell'upgrade del prodotto.

3. Interfaccia grafica e IDE

Pannello ridotto ad icona Nuovo pannello Flash CS3 L'IDE di Flash CS3 (come quella di Dreamweaver CS3) è stata rivisitata al meglio. I pannelli (vedi figura qui a sinistra), spesso scomodi nelle precedenti versioni, sono stati completamente ridisegnati e adesso il loro uso è notevolemente meno invasivo. Pannelli in modalità icona Inoltre la possibilità di ridurre ad icona i pannelli (vedi figura qui a destra) è una vera trovata che rende l'interfaccia gradevole e funzionale. Quando un pannello si trova in modalità icona occupa molto meno spazio e con un semplice click è possibile aprire il pannello principale prima sempre visibile.
Tutta l'IDE, insomma, è stata rivista compresa la zona centrale con la finestra per l'editing grafico e del codice. Non vi segnalo tutti i cambiamenti altrimenti vi rovinerei la sorpresa...

Nuova IDE Flash CS3

Continua a leggere... »

Scrivere buon codice OO in Adobe Flash

Venerdì 19 Ottobre, 2007

Ecco alcuni consigli su come scrivere un buon codice Object Oriented (OO) in Adobe Flash, soprattutto per chi ancora usa la versione MX in attesa di passare alla CS3.

Organizzare le cartelle delle classi

Prima di tutto l'organizzazione delle classi rende il lavoro di manutenzione del codice estremamente più semplice. Inoltre è possibile creare una vera e propria libreria personale da poter riutilizzare in altri progetti. Flash usa una nomenclatura legata al filesystem, quindi l'organizzazione in cartelle si rifletterà anche sull'importazione delle classi. Se ad esempio creiamo la sequenza di cartelle "mylibrary/grafica/plot" e inseriamo una nostra classe ActionScript "PlotClass.as", quando andremo ad importare la classe dovremmo usare:

Actionscript:
  1. import mylibrary.grafica.plot.PlotClass;

Se la libreria (cartella) "mylibrary" non si trova nella cartella del nostro filmato o progetto, usare l'impostazioni di pubblicazione di Flash per selezionare il percorso:

Impostazione percoroso librerie

Continua a leggere... »

Estendere i MovieClip in Adobe Flash MX

Mercoledì 17 Ottobre, 2007

Io utilizzo due tecniche per estendere le funzionalità di un MovieClip. La prima, utilizzata anche nelle precedenti versioni di Flash MX, usa la proprietà prototype, un puntatore alla superclasse (madre), come indicato nel manuale:

Un riferimento alla superclasse di un oggetto classe o funzione. La proprietà prototype viene creata automaticamente e associata a qualsiasi oggetto classe o funzione creato. Questa proprietà è di tipo statico ed è specifica della classe o della funzione creata. Se, ad esempio, si crea una classe personalizzata, il valore della proprietà prototype viene condiviso da tutte le istanze della classe ed è accessibile solo come una proprietà della classe. Le istanze della classe personalizzata non possono accedere direttamente alla proprietà prototype, ma possono accedervi mediante la proprietà __proto__.

Uno dei vantaggi nell'uso di prototype, soprattutto con i MovieClip, risiede nell'estensione di tutti i MovieClip, nessuno esluso. Di fatto si effettua un'estensione broadcast a tutti i MovieClip statici o dinamici. Ad esempio, una comoda estensione potrebbe essere:

Actionscript:
  1. MovieClip.prototype.move = function(x:Number, y:Number) {
  2.     this._x = x; this._y = y;
  3. }

Continua a leggere... »