Articoli con Tag ‘ActionScript’


Scrivere buon codice OO in Adobe Flash

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:

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

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

Note sul testing e debug in Adobe Flash

Una considerazione, ovvia ma sottovalutata, durante lo sviluppo di applicazioni in Adobe Flash: la differenza tra il Player utilizzato per il testing all’interno dell’IDE Flash e l’oggetto (ActiveX o EMBED) usato dal nostro browser. Chi possiede la versione “Macromedia” Flash MX (la versione 8 per intenderci, ma questo discorso in realtà vale per qualsiasi versione di Flash…) quando sviluppa un filmato e lo prova all’interno dell’IDE Flash manda in esecuzione il Player legato al pacchetto di sviluppo. Quando poi si pubblica il filmato sulla rete e lo si “prova” con il Player Flash del browser si potrebbero riscontrare alcune – sostanziali – differenze!

image image

 

Continua...

N3TV Interactive Platform

Cos’è?

N3TV Interactive Platform è la piattaforma interattivita di N3TV.it, nata da un’idea di Tommaso Tessarolo, “Blogger d’azione” che se discute di Net TV non rimane certo vincolato alle sole parole, ma agisce concretamente provando in prima persona che cosa vuol dire “fare Net TV”, proponendo strumenti software in grado di fornire un’interazione online di nuova generazione.
La piattaforma N3TV Interactive Platform ha quindi l’obiettivo di fornire interattività durante le numerose dirette televisive proposte su N3TV.it.

N3TV Interactive Platform
N3TV.it: una diretta con la N3TV Interactive Platform

Continua...

ActionScript 3.0 Performance

Io sono un estimatore di Adobe Flash CS3 e quindi di ActionScript 3.0. Ecco un demo, presentata alla conferenza Adobe in Giappone, che dimostra le capacità del nuovo motore di rendering sviluppato da Adobe, giusto per smentire strane voci su un “superamento” da parte di Microsoft Silverlight. Cliccate e muovete il Mouse, aumentando il numero di sfere!

Loading Flash Player...

Davvero notevole…

Continua...

Adobe Flash 3D simulator

Guardate che bella simulazione 3D (a volo d’uccello pilotabile con il mouse) in tempo reale realizzata in Adobe Flash!

Loading Flash Player...

Continua...

Nasce N3TV: NetTV 2.0

image È andata, il giorno è arrivato. Parte oggi il progetto N3TV, il nuovo “canale” NetTV di Tommaso Tessarolo con moltissime novità interessanti. Ho avuto il piacere di partecipare come CTO allo sviluppo della nuova piattaforma di interazione che fornisce servizi di Poll, Digg e Chat. Complimenti a tutto il gruppo per i consigli, i test, i nuovi video e i testi. Così N3TV rappresenta davvero un nuovo modo di fare e vedere la NetTV, dove interazione e qualità s’incontrano. Tenete d’occhio il sito e partecipate alla prossima trasmissione!

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

Right Click in AS3: menu contestuali personalizzati

Eliminare i menu contestuali o più semplicemente rispondere al “right click” del mouse del Flash Player è una possibilità non permessa direttamente da codice ActionScript anche nella versione CS3. Questa caratteristica sarebbe interessante sia per i giochi che per le Applicazioni RIA. Paulius Uza ha proposto una soluzione per ActionScript 3 (AS3) che lavora in accoppiata con Javascript. Questa “patch” è ancora in fase di testing in quanto dipende dal Flash Player installato e dal browser. Si può contribuire testando un’applicazione demo qui.
È stato apero anche un “progetto” su Google Code:

The idea is fairly simple:

1-Use Javascript in the HTML container page to disable the right-click on top of the SWF.

2-Capture the event and pass it to a function that communicates with Flash via the External Interface

3-In Actionscript the function called from Javascript does whatever you need to display your own custom context-menu.

Continua...



Stop SOPA