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... »

Post correlati

Aggiungere proprietà ad un MovieClip

Venerdì 9 Novembre, 2007

Nel Post Estendere i MovieClip in Adobe Flash MX avevo illustrato alcune tecniche per estendere un MovieClip. In particolare avevo detto che l'uso di MovieClip.prototype non permetteva l'estensione di proprità ma solo di metodi:

[...] Due importanti limitazioni di questa tecnica sono:

  1. Non può essere applicata a tutti gli oggetti esposti da Flash
  2. Possono essere "aggiunti" solo metodi e non proprietà [...]

In verità è possibile, con un passaggio in più, aggiungere dinamicamente proprietà anche usando MovieClip.prototype. Prima dell'introduzione di function get e function set, infatti, Flash permetteva l'aggiunta di proprietà (in lettura/scrittura o solo lettura) tramite il metodo addProperty(). Nella pratica questo si traduce nell'invocazione del metodo addProperty() e nella definizione di due funzioni getter e setter. La setter può essere null così da creare proprietà in sola lettura. Ad esempio se volessimo estendere tutti i MovieClip con una nuova proprietà _alpha in grado di aggiungere un'animazione, basta scrivere il seguente codice:

Actionscript:
  1. function _get_alpha():Number {
  2.         return(this._alpha);
  3. }
  4. function _set_alpha(v:Number):Void {
  5.        new Tween(this, "_alpha", Strong.easeOut, this._alpha, v, 1, true);
  6. }
  7. MovieClip.prototype.addProperty("_alpha_tween", _get_alpha, _set_alpha);

Da questo momento in poi se abbiamo un simbolo "miosimbolo_mc" possiamo sfruttare questa nuova proprietà:

Actionscript:
  1. miosimbolo_mc._alpha_tween = 50;

Quello che non è possibile fare, invece, è sovrascrivere le proprietà esistenti; per questo motivo ho usato _alpha_tween invece di _alpha. Ecco, quindi, un buon motivo per usare comunque le Classi 2.0 per estendere - e derivare - eventuali MovieClip.

Post correlati

Flash: come inizializzare componenti nel costruttore di una classe

Martedì 6 Novembre, 2007

Quando si estente una classe da un MovieClip che continene altri oggetti (MovieClip, TextField, etc...) questi ultimi potrebbero non essere "pronti" all'interno del costruttore. Questo accade soprattutto quando si utilizzano altri MovieClip estesi o i componenti (controls) di Flash. Per risolvere il problema basta sfruttare l'evento onLoad ereditato dalla classe stessa. Ad esempio immaginiamo di avere un MovieClip che contiene un campo TextField (oggetto visuale statico interno a Flash) e un oggetto TextInput (controllo inserito dal pannello componenti) e si vuole impostare qualche proprietà durante il costruttore della nostra classe MiaClasse.

Esempio Creiamo un simbolo ed inseriamo al suo interno sia l'oggetto TextField (chiamiamolo text_txt) sia l'oggetto TextInput (textinput_txt). Associamo questo simbolo ad una classe che estende un MovieClip, chiameremo la nostra classe MiaClasse. Quello che vogliamo ottenere è che durante il costruttore della nostra classe MiaClasse vengano inizializzati questi due controlli. Se proviamo ad usare un codice come questo:

Actionscript:
  1. //
  2. import mx.controls.TextInput;
  3. //
  4. class MiaClasse extends MovieClip {
  5.     //
  6.     private var text_txt:TextField;
  7.     private var textinput_txt:TextInput;
  8.     //
  9.     function MiaClasse() {
  10.         trace("MiaClasse::costruttore");
  11.         //
  12.         text_txt.text = "Ciao";
  13.         textinput_txt.text = "Ciao";
  14.         //
  15.     }
  16.  
  17. }

Continua a leggere... »

Post correlati

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... »

Post correlati

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... »

Post correlati