Categoria ‘Tutorials’


Creare MovieClip modali in TopMost

Illustrerò una tecnica per realizzare simboli (MovieClip) modali da usare similmente ai componenti Alert e Window di Flash. L’obiettivo è quello di mostrare un MovieClip sopra tutti gli altri, disabilitando – anche – l’accesso all’area sottostante e qualsiasi altro oggetto/componente presente. Ad essere sincero ho realizzato tutto ciò eseguendo un po’ di reverse engineering dai codici Adobe, che sono in chiaro! Non ho proprio resistito ;)

L’artefizio che si usa, per disabilitare qualsiasi interfaccia presente al di sotto del nostro MovieClip, è quella di creare un MovieClip trasparente che prenda tutta l’area dello stage. A questo MovieClip, che non sarà praticamente visibile, si aggancia un metodo “nullo” sull’evento onRelease, stando attenti ad impostare la proprietà useHandCursor a false.

Prima di tutto creiamo un filmato con una qualsiasi interfaccia nello stage principale:

Interfaccia

Continua...

Aggiungere proprietà ad un MovieClip

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:

1
2
3
4
5
6
7
function _get_alpha():Number {
        return(this._alpha);
}
function _set_alpha(v:Number):Void {
       new Tween(this, "_alpha", Strong.easeOut, this._alpha, v, 1, true);
}
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à:

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.

Continua...

Filmati ridimensionabili in Flash: atto II

Riprendendo il Post StageExt Class: filmati ridimensionabili in Flash ecco un modo ancor più semplice per ottenere il medesimo effetto, solo se nella libreria del nostro filmato è presente almeno un componente Flash!

Create un simbolo, un quadrato rosso 100×100 e ponetelo nella stage chiamandolo resizeWindow. Inserire in libreria, non nello stage, un componente qualsiasi, ad esempio un TextInput, e scrivete il seguente codice nel primo fotogramma del filmato.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import mx.managers.SystemManager;
//
Stage.scaleMode = "noscale"
//
//SystemManager.init();
SystemManager.addEventListener("resize", resizeWindow);
//
resizeWindow.resize = function(Void):Void {
    var s:Object = SystemManager.screen;
    this._width = s.width;
    this._height = s.height;
    this._x = Math.round(s.x);
    this._y = Math.round(s.y);
}
resizeWindow.resize();

La riga 6 (SystemManager.init();) può essere omessa.

Continua...

Flash: come inizializzare componenti nel costruttore di una classe

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:

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

}

Continua...

Fullscreen in Flash dal browser

Flash ha sempre supportato la modalità a schermo interno (fullscreen) sia nel Player stand-alone che nel proiettore. Questa modalità ancor oggi viene pienamente supportata e non ha subito modifiche. Adobe ha invece recentemente introdotto la possibilità di attivare il fullscreen direttamente nei filmati visualizzati nel browser. È stata introdotta una nuova e semplice funzionalità ActionScript che lavora sia con i player stand-alone che con i player browser. Per rendere il fullscreen fuzionante bisogna operare anche lato HTML, aggiungendo un nuovo parametro allowFullScreen nei TAG <object> ed <embed>. Tutto il resto è demandato al motore interno di Flash.
Questa nuova funzionalità ha comunque alcune restrizioni che bisogna conoscere, prima tra tutte l’uso del Flash Player versione 9.0.28.0 o superiore. Inoltre, ricapitolando:

  • Sul Browser dev’essere installata la versione del Player 9.0.28.0 o superiore
  • I developer devono aggiungere un nuovo parametro allowFullScreen nei Tag <object> e <embed>. Questo parametro è impostato normalmente a false e non permette il fullscreen. Per permettere il fullscreen bisogna esplicitamente impostarlo a true.
  • Un Box di dialogo verrà mostrato quando si entra in modalità fullscreen e indicherà all’utente come uscire da tale modalità. Questo Box sarà visibile per pochi secondi, passati i quali scomparirà da solo.
  • L’attivazione del fullscreen da ActionScript può avvenire solo in risposta di un click del mouse o tramite la pressione di un tasto, qualsiasi altra modalità verrà ignorata in ActionScript 2.0 e scatenera una eccezione throw in ActionScript 3.0.
  • Durante la modalità di fullscreen non è possibile utilizzare la tastiera. L’utente finale non può quindi inserire o modificare testi. L’unica risposta alla tastiera è riservata alla combinazione di tasti usata per uscire dalla modalità di fullscreen (la pressione del tasto ESC)

Codice ActionScript

Il codice necessario per impostare il fullscreen è semplicissimo e sfrutta l’oggetto Stage discusso su questo Blog in StageExt Class: filmati ridimensionabili in Flash:

1
Stage["displayState"] = "fullScreen";

Continua...

MagicLetter Flash Class: una classe per le scritte magiche

Come promesso ecco la versione aggiornata del simpatico effetto delle scritte magiche. Ho realizzato una diversa animazione per la “lettera”, per mostrare quanti effetti si possono fare. Il sorgente completo potete scaricarlo qui.

Loading Flash Player...

Classe MagicLetter

Questo è il codice della Classe che, ovviamente, può essere modificato e migliorato ulteriormente. Ad esempio è possibile inserire un parse per supprotare un simbolo di “nuova linea”, per andare a capo insomma. Possono essere introdotte le funzioni di get e set per esportare alcune proprietà all’esterno, ed altro ancora.

Continua...

Scritte magiche in Flash

Questo che propongo è un articolo che scrissi nell’agosto del 2003 (titolo originale: Scritte magiche in Flash MX). Nonostante sia “datato” (ora userei un codice ActionScript differente), è a mio avviso un simpatico strumento utile per effetti davvero suggestivi. Proporrò più avanti, o fatelo voi, la versione aggiornata con l’uso delle classi…

MovieClip dinamici

L’elemento che gioca un ruolo fondamentale nell’architetura Flash è l’oggetto MovieClip. La possibilità di creare questo tipo di oggetti da codice conferisce a Flash una notevolissima potenzialità, rendendolo un decoroso ambiente di sviluppo davvero divertente. Grazie alla possibilità di aggiungere run-time oggetti di tipo MovieClip, vedremo quanto sia semplice realizzare l’effetto mostrato in figura 1.

Loading Flash Player...

Fig. 1 – Esempio di testo ad effetto

La classe MagicText_class

Visto che stiamo utilizzando la versione MX di Flash, facciamo le cose per bene e creiamo una classe MagicText_class da riutilizzare a nostro piacimento. Quello che stiamo per fare è definire una nuova classe MagicText_class, che erediterà tutte le caratteristiche di una classe MovieClip. In questo modo avremmo a disposizione un vero e proprio oggetto, la base per creare successivamente un componente Flash vero e proprio! Se lo desideriamo. Per ora soffermiamoci solo sulla nostra classe e vediamo come costruirla.

Continua...

Estendere i MovieClip in Adobe Flash MX

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:

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

Continua...

StageExt Class: filmati ridimensionabili in Flash

La tecnica del Fullsize (anticamera per il Fullscreen – di cui parleremo in seguito) era, fino a poco tempo fa, utilizzata soprattutto nelle applicazioni Flash (RIA), composte quindi da una più o meno complessa interfaccia utente, dove il contenitore (Adobe AIR, Browser o il Player stand-alone) ridimensionato dall’utente, costringeva ad un riposizionamento degli oggetti componenti il filmato. Al ridimensionamento del contenitore segue ovviamente una funzione di disegno o Refresh in grado di riposizionare i MovieClip o ridisegnare runtime l’interfaccia in base alle nuove dimensioni del contenitore. Oggi questa tecnica è utilizzata anche nei siti web più avanzati o articolati, rendondo l’interfaccia estremamente piì accattivante. L’implementazione di questa tecnica è abbastanza semplice e sfrutta sostanzialmente l’oggetto Stage nativo di Flash e introdotto con la versione MX. Per la sua implementazione ecco una classe che permette di ottenere le coordinate dell’area dello Stage:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/**
 *
 * @file                StageExt.as
 * @author              Giovambattista Fazioli (g.fazioli@undolog.com)
 * @web                 http://www.undolog.com
 * @email               g.fazioli@undolog.com
 */

class StageExt {
    // release
    private var __release          :String = "1.0";
    // properties
    private var __movieWidth       :Number = 0;
    private var __movieHeight      :Number = 0;
    private var __left             :Number = 0;
    private var __right            :Number = 0;
    private var __top              :Number = 0;
    private var __bottom           :Number = 23;
    //
    function StageExt(w:Number, h:Number) {
        trace("StageExt::constructor");
        //
        __movieWidth = w;
        __movieHeight = h;
        //
        Stage.addListener(this);
    }
    /**
     * onResize() event
     */

    private function onResize() {
        trace("StageExt::onResize " + Stage.width + ", " + Stage.height);
        //
        var sw:Number = Math.round(Stage.width);
        var sh:Number = Math.round(Stage.height);
        var ow:Number = Math.round(this.__movieWidth);
        var oh:Number = Math.round(this.__movieHeight);
       
        // La coordinata x (in alto a sinistra)
       
        this.__left = -Math.floor(((sw - ow) / 2));
        this.__top = -Math.floor(((sh - oh) / 2));
       
        // La coordinata x (in alto a destra)
       
        this.__right = Math.round((sw + ow) / 2);
       
        // La coordinata y (in basso)
       
        this.__bottom = Math.round((sh + oh) / 2);
    }
    /**
     * Refresh()
     */

    public function Refresh() {
        onResize();
    }
    /**
     * Left - get
     */

    public function get Left():Number {
        return (__left);
    }
    /**
     * Top - get
     */

    public function get Top():Number {
        return (__top);
    }
    /**
     * Right - get
     */

    public function get Right():Number {
        return (__right);
    }
    /**
     * Bottom - get
     */

    public function get Bottom():Number {
        return (__bottom);
    }
    /**
     * MovieWidth - get/set
     */

    public function get MovieWidth():Number {
        return (__movieWidth);
    }
    public function set MovieWidth(v:Number) {
        __movieWidth = v;
    }
    /**
     * MovieHeight - get/set
     */

    public function get MovieHeight():Number {
        return (__movieHeight);
    }
    public function set MovieHeight(v:Number) {
        __movieHeight = v;
    }
}

Continua...

How I Did It: scrivere un countdown in Flash

Per la serie “How I Did It” (ovvero come lo feci) ecco come realizzare un countdown in Flash per visualizzare, partendo da un data, quanto giorni, ore, minuti e secondi mancano ad un evento! Nel filmato Flash qui sotto, ad esempio, vediamo quanti giorni mancano al primo dell’anno! Possono essere utilizzati i menu a tendina per selezionare un diversa data:

Loading Flash Player...

Creiamo tre combo day_cmb, month_cmb ed year_cmb e li inizializziamo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// init combo
import mx.controls.ComboBox;
//
for (var i = 1; i < 32; i++) {
  day_cmb.addItem(i, i);
}
var sm:Array = Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre");
for (var i = 0; i < 12; i++) {
  month_cmb.addItem(sm[i], i);
}
// potrei partire dall'anno attuale...
for (var i = 2007; i < 2020; i++) {
  year_cmb.addItem(i, i);
}
// imposto la data al 1 gennaio 2008
day_cmb.selectedIndex = 0; // -1
month_cmb.selectedIndex = 0; // -1
year_cmb.selectedIndex = 1;

Il cuore del sistema lo posizioniamo nell’evento onEnterFrame:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
this.onEnterFrame = function() {
  //
  var today:Date = new Date();
  var currentYear = today.getFullYear();
  var currentTime = today.getTime();
  //
  var targetDate:Date = new Date(year_cmb.selectedItem.data, month_cmb.selectedItem.data, day_cmb.selectedItem.data);
  var targetTime = targetDate.getTime();
  //
  var timeLeft = targetTime - currentTime;
  //
  var sec = Math.floor(timeLeft / 1000);
  var min = Math.floor(sec / 60);
  var hrs = Math.floor(min / 60);
  var days = Math.floor(hrs / 24);
  //
  sec = String(sec % 60);
  sec = (sec.length < 2) ? "0" + sec : sec;
  //  
  min = String(min % 60);
  min = (min.length < 2) ? "0" + min : min;
  //  
  hrs = String(hrs % 24);
  hrs = (hrs.length < 2) ? "0" + hrs : hrs;
  //  
  days = String(days);
  days = (days.length < 2) ? "0" + days : days;
  //
  var counter:String = days + ":" + hrs + ":" + min + ":" + sec;
  //
  time_txt.text = counter;
};

Continua...



Stop SOPA