<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hello World: &#187; Actionscript</title>
	<atom:link href="http://razorblade.netsons.org/tag/actionscript/feed/" rel="self" type="application/rss+xml" />
	<link>http://razorblade.netsons.org</link>
	<description>Programmazione web e oltre: php5, Zend Framework, jQuery, Actionscript 3.0, Sandy 3D Engine e altro</description>
	<lastBuildDate>Fri, 28 Aug 2009 18:23:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Flash Sandy 3D Engine con Actionscript 3.0</title>
		<link>http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/</link>
		<comments>http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/#comments</comments>
		<pubDate>Sun, 07 Sep 2008 22:29:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Sandy 3D engine]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[3D Framework]]></category>
		<category><![CDATA[3DStudio]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[concatenamento file libreria]]></category>
		<category><![CDATA[ENTER_FRAME]]></category>
		<category><![CDATA[event object]]></category>
		<category><![CDATA[KeyboardEvent Object]]></category>
		<category><![CDATA[keycode]]></category>
		<category><![CDATA[KEY_DOWN]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=8</guid>
		<description><![CDATA[<p>Da qualche mesetto ho avuto il modo di utilizzare questa fantastica libreria per la gestione della grafica poligonale con Actionscript 3.0. Questa vi permette di creare in maniera non troppo complessa, oggetti tridimensionali e farli muovere ed interagire in un mondo tridimensionale.</p>

<p>L'esempio che tratterò in questo articolo sarà quanto di più semplice è possibile realizzare utilizzando questo framework, una sfera texture-mappata rappresentante il pianeta Terra, con in più qualche comando tipo la rotazione negli assi X,Y,Z ed alcuni movimenti della telecamera virtuale.
Se siete pronti non vi resta che scaricare Sandy 3D Engine <a href="http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/">[...] Continua</a></p>



Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li><li><a href='http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/' rel='bookmark' title='Permanent Link: Esportare modelli poligonali con AS3 Geom Class Exporter'>Esportare modelli poligonali con AS3 Geom Class Exporter</a> <small>Utilizziamo modelli poligonali realizzati con 3DStudio Max in Flash Come...</small></li><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Da qualche mesetto ho avuto il modo di utilizzare questa fantastica libreria per la gestione della grafica poligonale con Actionscript 3.0. Questa vi permette di creare in maniera non troppo complessa, oggetti tridimensionali e farli muovere ed interagire in un mondo tridimensionale.</p>
<p>L&#8217;esempio che tratterò in questo articolo sarà quanto di più semplice è possibile realizzare utilizzando questo framework, una sfera texture-mappata rappresentante il pianeta Terra, con in più qualche comando tipo la rotazione negli assi X,Y,Z ed alcuni movimenti della telecamera virtuale.<br />
Se siete pronti non vi resta che scaricare Sandy 3D Engine.</p>
<p>Lo potete trovare in download su <a title="Flash Sandy 3D Engine" href="http://www.flashsandy.org/download" target="_blank">http://www.flashsandy.org/download</a>.</p>
<p>Per i più impazienti, qui sotto potete vedere il risultato finale. Niente male per poche righe di codice, che ne dite?</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="380" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="quality" value="high" /><param name="src" value="http://razorblade.netsons.org/flash/provaSfera.swf" /><embed type="application/x-shockwave-flash" width="500" height="380" src="http://razorblade.netsons.org/flash/provaSfera.swf" quality="high"></embed></object></p>
<p>Usate i tasti 1,2,3,4,5,6 per muovere rispettivamente la Terra nel suo asse X ( 1 e 2 ), Y ( 3 e 4 ) e Z ( 5 e 6 ), inoltre i tasti PAG UP e PAG DOWN per avvicinare ed allontanare la camera virtuale e i tasti direzionali per muovere sempre la camera direzionale nelle relative direzioni.</p>
<p>Prima di cominciare bisogna &#8216;dire&#8217; a Flash dove andare a prendere le librerie di Sandy 3D engine in modo tale che quando le richiameremo nell&#8217;applicazione non ci venga restituito un bell&#8217;errore. Quindi, <strong>dopo aver scaricato Sandy 3D engine</strong>, apriamo flash, nel menu in alto selezioniamo Modifica -&gt; Preferenze ( CTRL+U ), dopodichè selezioniamo Actionscript, clicchiamo su Impostazioni Actionscript 3.0  e selezioniamo la directory in cui abbiamo i file di flash Sandy 3D Engine. Attenzione in questo passaggio, in quanto la directory da selezionare dev&#8217;essere quella che <strong>contiene al suo interno</strong> la directory Sandy ( es. il_mio_percorso/src/ dove src conterrà Sandy ).</p>
<p>Ogni applicazione che utilizza Sandy 3D engine è composta principalmente da questi oggetti:</p>
<ul class="listato">
<li>Una scena 3D, ovvero il mondo 3D</li>
<li>Un gruppo, ovvero un oggetto che conterrà tutti gli altri oggetti</li>
<li>Una camera 3D</li>
</ul>
<p>Il seguente è il codice completo di questa applicazione, ovvero della sfera texture-mappata, del loop dell&#8217;applicazione e dell&#8217;interazione dei comandi della tastiera:</p>
<pre name="code" class="php">
package {
    import flash.display.Sprite;
    import flash.events.*;
    import sandy.core.Scene3D;
    import sandy.core.scenegraph.*;
    import sandy.primitive.*;
    import sandy.materials.*;
    import flash.ui.*;

    public class Sfera extends Sprite {
      private var sfera:Sphere;
      private var scene:Scene3D;
      private var camera:Camera3D;
      private var group:Group;

      public function Sfera():void {
        group = new Group("root");
        camera = new Camera3D( 550, 400 );
        scene = new Scene3D( "myScene", this, camera, group);
        sfera = new Sphere( "mySphere",100,24,18 );
        sfera.appearance = new Appearance(  new BitmapMaterial( new Texture(0,0) ) );
        scene.root.addChild(sfera);
        addEventListener( Event.ENTER_FRAME, enterFrameHandler );
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
      }

      private function enterFrameHandler( event : Event ):void {
        scene.render();
      } 

      private function keyPressed(event:KeyboardEvent):void {
        switch(event.keyCode) {
          case Keyboard.UP:
            camera.tilt +=2;
            break;
          case Keyboard.DOWN:
            camera.tilt -=2;
            break;
          case Keyboard.RIGHT:

            camera.pan -=2;
            break;
          case Keyboard.LEFT:
            camera.pan +=2;
            break;
          case Keyboard.CONTROL:
            camera.roll +=2;
            break;
          case Keyboard.PAGE_DOWN:
            camera.z -=5;
            break;
          case Keyboard.PAGE_UP:
            camera.z +=5;
          break;
          case 49:
            sfera.rotateX+=1;
          break;
          case 50:
            sfera.rotateX-=1;
          break;
          case 51:
            sfera.rotateY+=1;
          break;
          case 52:
            sfera.rotateY-=1;
          break;
          case 53:
            sfera.rotateZ+=1;
          break;
          case 54:
            sfera.rotateZ-=1;
          break;
        }
        trace(event.keyCode);
      }
    }
  }
</pre>
<p>Dalla riga 2 alla riga 8 importiamo tutte le librerie di cui abbiamo bisogno.</p>
<p>Dalla riga 11 alla 14 creaiamo le proprietà private che conterranno gli oggetti fondamentali con in aggiunta la sfera.</p>
<p>La funzione <strong>enterFrameHandler</strong> è quella che viene richiamata in ogni singolo frame, e non a caso renderizza la scena.</p>
<p>La funzione <strong>keyPressed</strong> viene richiamata ogni qual volta un tasto della tastiera è premuto. Se il <strong>keycode</strong> della tastiera corrisponde ad uno dei casi, l&#8217;azione relativa viene eseguita.</p>
<p>All&#8217;interno della funzione <strong>keyPressed</strong> ho aggiunto trace(event.keyCode); che ci permette di visualizzare il keycode del tasto premuto ( un numero intero ).</p>
<p>L&#8217;unico punto su cui dobbiamo soffermarci riguarda l&#8217;inserimento della texture all&#8217;interno dell&#8217;applicazione. Questa, una volta scelta ( <a title="nasa planets textures" href="http://maps.jpl.nasa.gov/pix/" target="_blank">qui</a> ne trovate a volontà ), deve essere importata nella libreria ( File -&gt; apri &#8230; vi ricordo CTRL+L per visulizzare la libreria ) e <strong>concatenata</strong> ad una classe.</p>
<p>Per eseguire questa operazione, selezioniamo il file dalla libreria, destro del mouse e selezioniamo la voce <strong>concatenamento</strong>. Fatto cio attribuiamo un nome classe alla texture, nel nostro caso il nome sarà proprio Texture ( la maiuscola è FONDAMENTALE ). Se visualizzate il codice alla riga 21, è proprio una istanza di Texture ( quindi di questa immagine ) che passiamo come argomento all&#8217;istanza di BitmapMaterial. Inoltre devono essere spuntati &#8216;Esporta per Actionscript&#8217; ed &#8216;Esporta nel primo fotogramma&#8217;.</p>
<p>Per compilare questa applicazione vi ricordo che dovete creare un nuovo documento flash ( linguaggio AS3 ), creare un file chiamato col medesimo nome della classe, <strong>Sfera</strong> nel nostro caso, con estensione .as e legarlo al documento inserendo il nome della classe, <strong>Sfera</strong> all&#8217;interno del campo input di testo in proprietà -&gt; classe documento.</p>
<p>Termina qui questo tutorial di base per il framework Flash Sandy 3D engine. I feedback sono sempre ben accetti quindi se avete domande e/o commenti potete scrivere qui sotto.</p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li><li><a href='http://razorblade.netsons.org/2009/01/15/esportare-modelli-poligonali-con-as3-geom-class-exporter/' rel='bookmark' title='Permanent Link: Esportare modelli poligonali con AS3 Geom Class Exporter'>Esportare modelli poligonali con AS3 Geom Class Exporter</a> <small>Utilizziamo modelli poligonali realizzati con 3DStudio Max in Flash Come...</small></li><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introduzione a Actionscript 3.0</title>
		<link>http://razorblade.netsons.org/2008/08/22/introduzione-a-actionscript-30/</link>
		<comments>http://razorblade.netsons.org/2008/08/22/introduzione-a-actionscript-30/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 01:48:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[access modifier]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[built-in classes]]></category>
		<category><![CDATA[class point of entry]]></category>
		<category><![CDATA[classi e oggetti]]></category>
		<category><![CDATA[custom classes]]></category>
		<category><![CDATA[datatype]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[ES4]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[packages]]></category>
		<category><![CDATA[programmazione ad oggetti]]></category>
		<category><![CDATA[subtype]]></category>
		<category><![CDATA[supertype]]></category>
		<category><![CDATA[tamarin]]></category>
		<category><![CDATA[type  annotation]]></category>
		<category><![CDATA[type declaration]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=6</guid>
		<description><![CDATA[<p>Premetto che in passato non ho mai avuto modo di approfondire linguaggi come Actionscript e la sua versione 2.0, nonostante mi abbiano sempre affascinato i risultati ottenuti da alcuni programmi, davvero molto belli da vedere, tanto per fare un esempio la famosa <a href="http://razorblade.netsons.org/2008/08/22/introduzione-a-actionscript-30/">[...] Continua</a></p>


Related posts:<ol><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Premetto che in passato non ho mai avuto modo di approfondire linguaggi come Actionscript e la sua versione 2.0, nonostante mi abbiano sempre affascinato i risultati ottenuti da alcuni programmi, davvero molto belli da vedere, tanto per fare un esempio la famosa <a href='http://www.no3dfx.com/polaroid/' target='_blank'>Polaroid Gallery</a>.</p>
<p>L&#8217;avvento della terza versione di questo linguaggio di programmazione mi ha convinto ad approfondire l&#8217;argomento, considerate anche le nuove features offerte.</p>
<p>Actionscript 3.0 è un linguaggio orientato agli oggetti la cui sintassi ricorda molto linguaggi di programmazione come Java e C#. Il cuore del linguaggio è basato sulle specifiche date dall&#8217;<a href='http://wiki.ecmascript.org/doku.php' target='_blank'>ECMAScript 4</a>, esattamente come succede per il linguaggio Javascript. Potete trovare la documentazione ufficiale di <b>Actionscript 3</b> ( che per comodità chiamerò d&#8217;ora in poi <b>AS3</b> ) cliccando su <a href='http://livedocs.adobe.com/specs/actionscript/3' target='_blank'>questo link</a>.</p>
<p>Inoltre potete trovare a <a href='http://www.mozilla.org/projects/tamarin/' target='_blank'>questo indirizzo</a> la pagina ufficiale del progetto <a href='http://www.mozilla.org/projects/tamarin/' target='_blank'>Tamarin</a> il cui obiettivo è quello di fornire una implementazione di ECMAScript 4th edition (ES4).</p>
<p>Per compilare il codice AS3 avrete bisogno di <a href='http://www.adobe.com/go/flash/' target='_blank'>Adobe Flash CS3 ( Flash versione 9 )</a> o in alternativa di <a href='http://www.adobe.com/products/flex/productinfo/overview/' target='_blank'>Adobe Flex Builder</a> o ancora di <a href='http://www.adobe.com/go/flex2_sdk' target='_blank'>Adobe Flex 2 SDK</a>.</p>
<p>Per questa guida userò Adobe Flash CS3. Pronti?</p>
<h2>Le basi del linguaggio</h2>
<p>Cercherò di essere il più sintetico possibile nelle spiegazioni senza dilungarmi più di tanto su un singolo punto. Per la comprensione di questo articolo dovreste avere qualche conoscenza di base di programmazione generale, quantomeno sapere che cosa è una variabile, che cosa è un array, una funzione. Per chi avesse bisogno di approfondimenti su alcune features è pregato di lasciare un commento in fondo all&#8217;articolo. Il linguaggio AS3 è un linguaggio completamente <b>Object Oriented</b>. Questo che cosa significa? Che per utilizzarlo dovete avere una idea di cosa è un oggetto, ma ancora prima di cosa è una classe.</p>
<p><h2>Classi e Oggetti</h2>
</p>
<p>Immaginate un&#8217;automobile. Essa è composta da moltissimi pezzi al suo interno e non: la carrozzeria, il motore, il volante, il serbatoio ecc ecc.. ed ogni singola parte ha bisogno di un progetto prima di essere costruita. Semplificato al massimo questo è il concetto che sta dietro alle classi e gli oggetti. Le classi sono il progetto e gli oggetti sono le <b>istanze</b> delle classi.</p>
</p>
<p>Gli oggetti all&#8217;interno di AS3 come in qualsiasi altro linguaggio di programmazione possono essere creati da zero, e prendono il nome di <b>Custom Classes</b>, ma ne esistono altri già pronti all&#8217;uso facenti parte del linguaggio, le <b>Built-in Classes</b>. Creare un&#8217;applicazione utilizzando classi e oggetti pende il nome di <b>Programmazionead Oggetti ( OOP &#8211; Object Oriented Programming )</b>. Le seguenti sono le classi built-in di AS3:</p>
<ul class="listato">
<li><b>String</b> Rappresenta del testo ( ad esempio un nome )</li>
<li><b>Boolean</b> Rappresenta gli stati <b>true</b> e <b>false</b> ( vero e falso )</li>
<li><b>Number</b> Rappresenta numeri in virgola mobile</li>
<li><b>int</b> Rappresenta numeri interi</li>
<li><b>uint</b> Rappresenta numeri interi positivi</li>
<li><b>Array</b> Rappresenta una lista ordinata</li>
<li><b>Error</b> Rappresenta un errore del programma ( ad esempio un errore di sintassi )</li>
<li><b>Date</b> Rappresenta uno specifico punto nel tempo</li>
<li><b>Math</b> Contiene le più comuni funzionalità matematiche</li>
<li><b>RegExp</b> Definisce dei tool per trovare e sostituire del testo</li>
<li><b>Function</b> Rappresenta del codice che può essere riusato</li>
<li><b>Object</b> Definisce ogni funzionalità di base di ogni oggetto Actionscript</li>
</ul>
<h2>Packages</h2>
<p>Ogni classe, sia custom che built-in farà parte di un <b>package</b>. Un package è un contenitore di classi che gestiscono una porzione indipendente del programma. Chiameremo il package della nostra applicazione di prova <b>zoo</b> e chiameremo la classe <b>VirtualZoo</b>.Detto ciò, il seguente è un esempio di codice che sarà contenuto all&#8217;interno del file che gestisce una classe:</p>
<pre name="code" class="php">
package zoo{
  import flash.display.Sprite;
  class VirtualZoo extends Sprite{
    public function VirtualZoo(){
      // codice
    }
  }
}
</pre>
<p>La classe <b>VirtualZoo</b> è la <b>main class</b> della nostra applicazione, chiamata anche <b>class point of entry</b>. Questa deve <b>necessariamente</b> estendere la built-in class <b>Sprite</b>, che quindi <b>deve essere importata all&#8217;interno del nostro pacchetto</b> zoo (import flash.display.Sprite;). Essendo VirtualZoo una classe del pacchetto zoo il suo percorso completo, conosciuto come <b>fully qualified class name</b> sarà zoo.VirtualZoo. Il metodo omonimo presente al suo interno è il costruttore della classe, ovvero quel codice che viene eseguito appena la classe è istanziata. Come per diversi altri programmi di programmazione il commento su una unica linea è possibile grazie all&#8217;uso di // mentre il commento su più linee sara /* commento */.</p>
</p>
<p>Per convenzione i nomi della classi vanno sempre con la prima lettera maiuscola, ed in caso di nomi composti si userà il CamelCase.</p>
<p>L&#8217;organizzazione delle directories dove risiedono i sorgenti del programma è fondamentale per il suo utilizzo. Per la struttura che ho appena spiegato sarà la seguente:</p>
<ul class="applicationThree">
<li>VirtualZoo
<ul>
<li>src
<ul>
<li>zoo</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>La directory src &#8217;sources&#8217; è dove risiederanno i sorgenti del programma. Il prossimo passo è creare un nuovo documento flash e linkarlo alla classe che abbiamo appena creato, ma ancor prima creare il file della classe VirtualZoo. Dirigiamoci quindi all&#8217;interno della directory zoo, creiamo un file di testo e rinominiamolo in VirtualZoo.as. Quindi all&#8217;interno della directory src e creiamo un nuovo file, VirtualZoo.fla ( tasto destro del mouse -> nuovo -> documento Flash ). Clicchiamo due volte il file appena creato e quindi selezioniamo la voce &#8216;documento Actionscript 3.0&#8242;, clicchiamo sul label proprietà ( dovrebbe trovarsi in basso a sinistra ) e dove vedete il testo &#8216;Classe documento&#8217; con a fianco un input di testo inserite zoo.VirtualZoo ( senza estenzione as!! ) e cliccate la matitina. Se avete fatto tutto correttamente il contenuto del file sarà importato all&#8217;interno di flash, altrimenti riceverete un messaggio di errore.</p>
<h2>Access Modifiers</h2>
<p>Gli <b>Access Modifiers</b> sono degli attributi che posso essere utilizzati per le classi, le proprietà e i metodi al suo interno. Gli Access Modifiers sono 4, ovvero public, internal, private e protected. Una classe a cui non viene specificato un access modifier <b>è per default internal</b> ovvero può essere accessibile da tutte le altre classi contenute nello stesso pacchetto e solo da queste. Specificare internal per una classe ha come unico scopo quello di chiarire l&#8217;effettivo utilizzo che il programmatore ne vuole fare. Se volessimo rendere disponibile la classe per le classi degli altri pacchetti bisognerebbe definirla come <b>public</b>.</p>
<p>Come già detto, gli Access Modifiers possono essere utilizzati anche per i metodi e le proprietà. Utilizzare public per un metodo o una proprietà indica che quel metodo o proprietà è disponibile in qualsiasi zona del programma, internamente o esternamente alla classe in cui si trova. Definire proprietà e metodi con private indica che quel metodo o proprietà saranno disponibili <b>esclusivamente all&#8217;interno della stessa classe</b>. Infine protected è un access modifier somigliante a private, la loro differenza risiede nell&#8217;accesso da parte delle classi figlie. Un metodo o proprietà definito come protected non sarà disponibile all&#8217;esterno della classe ( esattamente come per private ), ma sarà disponibile per le classi che estendono la classe in cui il metodo o la proprietà definita protected risiedono.</p>
<h2>Tipi di dato</h2>
<p>I tipi di dato, o anche <b>datatypes</b>, definiscono un set di valori. I datatype disponibili in actionscript sono fondamentalmente tre: Null, void e Object. I primi due possono avere rispettivamente il valore di null e undefined, mentre Object include il datatype di ogni istanza di ogni classe. Inoltre ogni built-in o custom classes definiscono il loro tipo di dato. Detto così ha poco senso passiamo quindi a mettere in pratica il concetto di datatype aggiungendo qualche nuova classe al nostro programma di prova.<br />
In uno zoo saranno presenti degli animali e questi animali avranno bisogno di mangiare. Procediamo quindi con la creazione della classe VirtualPet, della classe Food e delle sottoclassi Apple e Sushi.</p>
<p><b>VirtualPet.as</b></p>
<pre name="code" class="php">
 // VirtualPet class
  package zoo
  {
    import flash.utils.setInterval;
    import flash.utils.clearInterval;

    internal class VirtualPet
    {
      private static var maxNameLength:int = 20;
      private static var maxCalories:int = 2000;
      // Le calorie che consuma durante la digestione
      private static var caloriesPerSecond:int = 100;

      private var petName:String;
      private var currentCalories:int = 1000;
      // Id del set interval per la digestione
      private var digestIntervalID:int;

      //private var creationTime;

      public function VirtualPet(name:String):void
      {
        //creationTime = new Date();
        setName(name);
        digestIntervalID = setInterval(digest, 1000);
      }

      // setter method AKA mutator method, from AS3.0 modifier method
      public function eat(foodItem:Food):void
      {
        // If this pet is dead...
        if (currentCalories == 0)
        {
          // ...quit this method without modifying currentCalories
          trace(getName() + " is dead. You can't feed it.");
          return;
        }

        if (foodItem is Apple)
        {
          if (Apple(foodItem).hasWorm())
          {
            trace("The " + foodItem.getName() + " had a worm. " + getName()
                  + " didn't eat it.");
            return;
          }
        }

        var newCurrentCalories:int = currentCalories + foodItem.getCalories();
        if (newCurrentCalories > VirtualPet.maxCalories)
        {
          currentCalories = VirtualPet.maxCalories;
        }
        else
        {
          currentCalories = newCurrentCalories;
        }

        trace(getName() + " ate some " + foodItem.getName() + ". It now has " + currentCalories + " calories remaining.");
      }

      // getter method AKA accesser method, from AS3.0 retriever method
      public function getHunger():Number
      {
        return currentCalories / VirtualPet.maxCalories;
      }

      public function setName (newName:String):void
      {
        if (newName.length > VirtualPet.maxNameLength)
        {
          newName = newName.substr(0, VirtualPet.maxNameLength);
        }
        else if (newName == "")
        {
          return;
        }
        petName = newName;
      }

      public function getName():String
      {
        return petName;
      }

      private function digest():void
      {
        // If digesting more calories would leave the pet's currentCalories at
        // 0 or less...
        if (currentCalories - VirtualPet.caloriesPerSecond < = 0)
        {
          // ...stop the interval from calling digest()
          clearInterval(digestIntervalID);
          // Then give the pet an empty stomach
          currentCalories = 0;
          // And report the pet's death
          trace(getName() + " has died.");
        }
        else
        {
          currentCalories -= VirtualPet.caloriesPerSecond;
          trace(getName() + " digested some food. It now has " + currentCalories + " calories remaining.");
        }
      }

      /*public function getAge()
      {
        var currentTime = new Date();
        var age = currentTime.time - this.creationTime.time;
        return age;
      }*/
    }
  }
</pre>
<p><b>Food.as</b></p>
</pre>
<pre name="code" class="php">
  // Food class
  package zoo
  {
    public class Food
    {
      private var calories:int;
      private var name:String;

      public function Food (initialCalories:int)
      {
        setCalories(initialCalories);
      }

      public function getCalories ():int
      {
        return calories;
      }

      public function setCalories (newCalories:int):void
      {
        calories = newCalories;
      }

      public function getName ():String
      {
        return name;
      }

      public function setName (newName:String):void
      {
        name = newName;
      }
    }
  }
</pre>
<p><b>Apple.as</b></p>
<pre name="code" class="php">
  // Apple class
  package zoo
  {
    public class Apple extends Food
    {
      // Set the default number of calories for an Apple object to 100
      private static var DEFAULT_CALORIES:int = 100;
      private var wormInApple:Boolean;

      public function Apple (initialCalories:int = 0)
      {
        // If no calorie value or a negative calorie value was specified
        // for this particular object...
        if (initialCalories < = 0)
        {
          // ...use the default value
          initialCalories = Apple.DEFAULT_CALORIES;
        }

        super(initialCalories);

        wormInApple = Math.random() >= .5;

        // Set the food name for all Apple objects
        setName("Apple");
      }

      public function hasWorm ():Boolean
      {
        return wormInApple;
      }
    }
  }
</pre>
<p><b>Sushi.as</b></p>
<pre name="code" class="php">
 // Sushi class
  package zoo
  {
    public class Sushi extends Food
    {
      private static var DEFAULT_CALORIES:int = 500;

      public function Sushi (initialCalories:int = 0)
      {
        if (initialCalories < = 0)
        {
          initialCalories = Sushi.DEFAULT_CALORIES;
        }

        super(initialCalories);

        setName("Sushi");
      }
    }
  }
</pre>
<p>Come potete vedere ogni metodo ed ogni proprietà che compone il nostro programma specifica il tipo di dato di cui fa parte ( ad esempio private var petName:String; ) o il tipo di dato che restituise ( ad esempio il metodo getName():String all'interno della classe VirtualPet ).<br />
Quando delle classi <b>estendono</b> delle altre classi, come nel nostro caso Apple e Sushi estendono Food, Food si dice essere il <b>supertype</b> di Apple e Sushi, mentre Apple e Sushi sono il <b>subtype</b> di Food. Inoltre le istanze di Apple e Sushi saranno rispettivamente di tipo Apple e di tipo Sushi e contemporaneamente saranno di tipo Food mentre una istanza di Food sarà esclusivamente di tipo Food. Il tipo di dato, indicato tramite il suffisso :[tipo], si dice essere <b>type annotation</b> o anche <b>type declaration</b>.</p>
<h2>Proprietà statiche</h2>
<p>Una proprietà statica è una variabile che si riferisce alla classe stessa e non ad una sua istanza. Per chiarire questo concetto prendiamo ad esempio la proprietà statica maxNameLength all'interno della classe VirtualPet</p>
</pre>
<pre name="code" class="php">
private static var maxNameLength:int = 20;
</pre>
<p>Istanziando la classe VirtualPet, non vi è la necessità di differenziare il valore di maxNameLength per ogni sua singola istanza. maxNameLength, nel nostro esempio, varrà sempre 20 indistintamente. Quando una proprietà deve avere questo tipo di comportamento definiamo la variabile come <b>static</b>. Non sono solo le proprietà a poter essere così definite. Static può essere applicato anche a quei metodi che non richiedono l&#8217;utilizzo di proprietà istanziate.</p>
<h2>Costanti</h2>
<p>Le costanti sono delle variabili, statiche e non, il cui valore non cambia una volta assegnato. la sintassi per la creazione di una costante è la seguente</p>
<pre name="code" class="php">
static const IDENTIFIER = value
</pre>
<h2>Ereditarietà</h2>
<p>L&#8217;ereditarietà tra classi è una relazione in cui la classe che <b>estende</b> ( tramite la parola chiave <b>extends</b> ) un&#8217;altra classe prende in prestito da questa il codice presente nella classe che estende. Nel nostro programma questo concetto è stato utilizzato per le classi Food con Apple e Sushi. Apple e Sushi estendono Food, quindi in Apple e Sushi saranno disponibili tutte le proprietà e i metodi dichiarati in Food. Food viene definita <b>base class</b> o anche <b>ancestor</b> mentre Apple e Sushi sono definite come <b>derived class</b> o anche <b>descendants</b>.<br />
Moltissimo ci sarebbe da dire ancora sul concetto di ereditarietà, torneremo a parlarne.</p>
<h2>Compilazione</h2>
<p>Per compilare il nostro programma dovremo avere tutti i file sopre listati ( VirtualZoo.as, VirtualPet.as, Food.as, Apple.as e Sushi.as ) all&#8217;interno della directory zoo ed avere il documento flash all&#8217;interno della directory src. Per far in modo che il nostro programma visualizzi qualcosa aggiorniamo la nostra point of entry class in modo da creare un animale al suo interno e dargli da mangiare.</p>
<p><b>VirtualZoo.as</b></p>
<pre name="code" class="php">
	// VirtualZoo class
  package zoo
  {
    import flash.display.Sprite;
    public class VirtualZoo extends Sprite
    {
      private var pet:VirtualPet;

      public function VirtualZoo()
      {
        pet = new VirtualPet("Stan");

        pet.eat(new Apple());  // Feed Stan an apple
        pet.eat(new Sushi());  // Feed Stan some sushi
        // Assign the pet's old name to the local variable oldName
        //var oldName = pet.getName();
        // Give the pet a new name
        //pet.setName("Marcos");
      }
    }
  }
</pre>
<p>Per compilare il programma e vedere il risultato, avendo il file flash aperto, selezioniamo la voce &#8216;controllo&#8217; dal menù, quindi &#8216;Prova Filmato&#8217; ( Ctrl+Invio ).</p>
<p>Con questo è tutto per ora, per eventuali chiarimenti vi invito a lasciare i vostri commenti</p>
<h2>Copyright</h2>
<p>Il codice del programma VirtualZoo è tratto dal libro “Essential ActionScript 3.0 by Colin Moock. Copyright 2007 O’Reilly Media, Inc., 0-596-52694-6”.</p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>Related posts:<ol><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2008/08/22/introduzione-a-actionscript-30/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
