Flash CS3: creare un effetto Reflex su qualsiasi MovieClip
Mercoledì 4 Giugno, 2008Sfruttando una notevole caratteristica di Actionscript 3.0 (vedi Actionscript 3.0: tutto con l'operatore new) ho creato una classe ReflexMe in grado di generare un effetto "riflessione" su un qualsiasi MovieClip presente in libreria.
Il sorgente fa parte del pacchetto undolibrary - presente su GoogleCode - ma se volete potete scaricare il singolo file ReflexMe.as.
Utilizzo
Scaricate il file ReflexMe.as e posizionatelo nella cartella del vostro filmato .fla. Selezionate nella libreria il MovieClip a cui volete applicare l'effetto reflex e aprite la finestra delle proprietà simbolo. Nella sezione Concatenamento inserite ReflexMe nel campo Classe base:

A questo punto, provando il filmato, il MovieClip selezionato avrà l'effetto reflex. Se al MovieClip date un nome di istanza potrente anche regolare alcuni parametri come:
- reflexOffset - distanza del riflesso
- gradientOffset - l'estenzione del gradiente riflesso
- alphaOffset - il canale alpha del riflesso
- gradientRadial - tipo di riflesso: radiale o lineare
Note
La classe ReflexMe.as è scritta come classe base per estendere un qualsiasi MovieClip. La sua semplicità è tale e disarmante che potete riaddatarla anche come codice "spurio" da utilizzare da codice, invece che dall'IDE Flash. Tutto l'effetto è generato dalle poche (tolti i commenti) righe di codice che seguono:
-
// preservo le dimesioni orginali del MovieClip
-
__oWidth = this.width;
-
__oHeight = this.height;
-
// creo una BitmapData delle dimesioni del
-
// MovieClip a cui voglio applicare l'effetto reflex
-
__bmpd = new BitmapData( this.width, this.height, true, 0x000000);
-
// copio il MovieClip sulla BitmapData
-
__bmpd.draw( this );
-
// creo un oggetto Bitmap per la visualizzazione
-
// questo sarà il nostro effetto reflex
-
__bmp = new Bitmap( __bmpd );
-
// lo visualizzo
-
addChild( __bmp );
-
// lo ruoto di 180 gradi: lo inverto
-
__bmp.scaleY = -1;
-
// lo posiziono alla base del MovieClip oroginale
-
// il x 2 sull'altezza è necessario a casua della
-
// rotazione che ha spostato l'origine degli assi
-
__bmp.y = __oHeight*2 + __reflexOffset;
-
// cache come bitmap: necessario per mascherare dopo
-
// con effetto gradiente e alpha channel
-
__bmp.cacheAsBitmap = true;
-
// creo una maschera
-
__mask = new Shape();
-
// cache come bitmap: necessario per mascherare dopo
-
// con effetto gradiente e alpha channel
-
__mask.cacheAsBitmap = true;
-
// posiziono anch'essa sopra l'immagine riflessa
-
__mask.y = __oHeight + __reflexOffset;
-
// creo una matrice per il gradiente
-
__matrix = new Matrix();
-
// creo il gradiente delle stesse dimensione del
-
// MovieClip originale
-
__matrix.createGradientBox(__oWidth, __oHeight, Math.PI/2);
-
with( __mask.graphics ) {
-
clear();
-
beginGradientFill( GradientType.LINEAR, [0x000000,0x000000], [__alphaOffset, 0], [0, __gradientOffset], __matrix);
-
drawRect(0, 0, __oWidth, __oHeight);
-
endFill();
-
}
-
addChild( __mask );
-
// imposto maschera
-
__bmp.mask = __mask;
Vedi anche...
- 27.08.08: Very short snippet: inviare email in HTML con PHP (0)
- 26.08.08: Skypemote.com: dillo con le emotions (3)
- 21.08.08: WP-ABS: aggiungere il proprio blog al search del browser (7)
- 20.08.08: Simple Accordion con la classe USimpleTabStrip (0)
- 19.08.08: Flick e Flock (2)


















Marco ha detto:
ciao ho provato ha utilizzare questa classe ma mi da degli errori.
ti dico il procedimento che ho fatto, cosi magari mi puoi dire se, e dove sbaglio.
-creo un nuono documento in as3,
-disegno un semplice quadrato, e lo trasformo in movieclip;
-nella libreria tasto destro sul simbolo, nella sezione Concatenamento inserisco ReflexMe nel campo Classe base;
-logicamente ho salvato il file fla nella stessa cartella dove si trova ReflexMe.as
però mi da questi errori:
-errore 1017 impossibile trovare la definizione della classe base ReflexMe;
-5000: La classe ‘ReflexMe’ deve essere una sottoclasse di ‘flash.display.MovieClip’ perché è collegata a un simbolo di libreria di quel tipo;
-5001: Il nome del pacchetto ‘undolibrary.sfx’ non riflette la posizione del file. Modificare il nome della definizione del pacchetto all’interno del file o spostare il file. C:\Documents and Settings\Utente\Desktop\ReflexMe.as
dove sbaglio? cosa devo fare??
ti ringrazio in anticipo.
ciao!
Giovambattista Fazioli ha detto:
@Marco: se usi il file ReflexMe.as al di fuori della libreria undolibrary devi modificare il “namespace” del package. All’inizio del file trovi “package undolibrary.sfx”, elimina il namespace “undolibrary.sfx”, in pratica lascia solo “package {” - con la graffa
Reflex e ReflexMe: da Classe base a Classe | Undolog.com ha detto:
[...] post Flash CS3: creare un effetto Reflex su qualsiasi MovieClip avevamo visto com’è possibile scrivere una classe, che estende un MovieClip, per collegarla a [...]
Linus ha detto:
Complimenti per il sito web meraviglioso. Volevo sapere se ho dato un nome istanza al mio movieclip come posso accedere alle proprietÃ
reflexOffsetetc.Grazie
Giovambattista Fazioli ha detto:
@Linus: puoi utilizzare
miaistanza.reflexOffsetper accedere a tutte le proprietà . Quando usi la classeReflexestendi, di fatto, le caratteristiche del MovieClip base. Questo significa che il MovieClip ottiene tutte le proprietà e i metodi della classeReflex.carlitos ha detto:
Ciao a tutti quelli che stanno leggendo il mio messaggio. Volevo chiedere a qualcuno di voi, se mi insegnaste come creare i sottomenu su flash cs3. Io ho cercato su internet, ma non so come si faccia. Per favore mi potreste aiutare? Il mio contatto è: sicilianofolle@hotmail.it
attendo in molti grazie!
Giovambattista Fazioli ha detto:
@Carlitos: esattamente cosa ti serve?