This is a discussion on La classe Point di Flash CS3 within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Un ciao a tutti è più che doveroso.
Noto che siete tanti a seguire i miei articoli e ne sono onorato ...
Un ciao a tutti è più che doveroso.
Noto che siete tanti a seguire i miei articoli e ne sono onorato e contento.
Detto questo, vado ad introdurre la classe Point di Actionscript 3.0. Non tutta ma una piccola parte per poter mettere in condizione qualcuno di voi a creare delle animazioni liberando l' estro personale. Personalmente non ne ho molto ma conosco molto bene Actionscript e quindi spero di darvi degli strumenti in più per poter creare sempre meglio quello che avete in testa.
Questa classe è già stata utilizzata in alcuni tutorials di questo sito, come ad esempio tagliare un' immagine con Actionscript, oppure con la classe Timer però non è mai stata approfondita.
Partirei col dire che, come la definizione della classe stessa dice, è come avere un punto e poterlo muovere tramite le sue proprietà X e Y oppure assegnargli delle coordinate in fase di un progetto il quale le richiede.
Vediamo cosa si può fare con queste 2 proprietà...
Creo un FLA che salvo con nome ' main.fla ', completamente vuoto.
Creo la Document CLass, un file AS che salvo con nome ' Main.as ', implementata in questo modo:
Code:
package
{
import flash.display.MovieClip;
import flash.display.Shape;
import flash.geom.Point;
import flash.events.Event;
public class Main extends MovieClip
{
private var shape:Shape;
private var random_point:Point;
private var points_array:Array;
private var num_points:int=4;
private var randomX:int;
private var randomY:int;
private var id:int=0;
public function Main()
{
init();
}
private function init():void
{
stage.frameRate=31;
points_array=new Array();
createPoints();
createShape();
startDraw();
movePoint();
}
private function createPoints():void
{
for(var i:int=0;i < num_points;i++)
{
var point:Point=new Point(stage.stageWidth/2,stage.stageHeight/2);
points_array.push(point);
}
}
private function createShape():void
{
shape=new Shape();
addChild(shape);
}
private function startDraw():void
{
shape.addEventListener(Event.ENTER_FRAME,go);
}
private function go(e:Event):void
{
shape.graphics.clear();
shape.graphics.beginFill(0x0066FF,1);
shape.graphics.moveTo(points_array[0].x,points_array[0].y);
for(var i:int=0;i < points_array.length;i++)
{
shape.graphics.lineTo(points_array[i].x,points_array[i].y);
}
}
private function movePoint():void
{
randomX=Math.round(Math.random()*stage.stageWidth);
randomY=Math.round(Math.random()*stage.stageHeight);
random_point=new Point(randomX,randomY);
addEventListener(Event.ENTER_FRAME,run);
}
private function run(e:Event):void
{
var dx:Number=random_point.x-points_array[id].x;
var ax:Number=dx*.5;
points_array[id].x+=ax;
var dy:Number=random_point.y-points_array[id].y;
var ay:Number=dy*.5;
points_array[id].y+=ay;
if(Math.abs(dx)<=.02)
{
points_array[id].x=random_point.x;
points_array[id].y=random_point.y;
removeEventListener(Event.ENTER_FRAME,run);
id++;
if(id>=points_array.length-1)
id=0;
movePoint();
}
}
}
}
per ottenere questo risultato ( vi invito ad approfondire il codice, so che non è un' animazione spettacolare infatti il suo fine vuole essere quello di trasmettere il concetto basilare di come si usa la classe Point ) :
Analiziamo il codice
Proprietà
una Shape
private var shape:Shape;
una istanza della classe Point in cui inerirò delle coordinate
private var random_point:Point;
un Array che conterrà le istanze Point con le coordinate dei punti di partenza
private var points_array:Array;
una variabile numerica ( intera ) che contiene il numero di punti che vogliamo muovere
private var num_points:int=4;
due variabili numeriche intere a cui assegnerò un valore random
private var randomX:int;
private var randomY:int;
una variabile numerica ( sempre intera )che parte da zero e che incrementerò di una unità in modo da spostarmi negli indici dell' Array
private var id:int=0;
Metodi
init();
imposto il frame rate
stage.frameRate=31;
inizializzo l' Array ( altrimenti il suo valore resterebbe null e quando cercherei di popolarlo Flash mi direbbe tramite un errore che non può riferirsi ad un oggetto con valore null
points_array=new Array();
chiamo rispettivamente i metodi createPoints, createShape, startDraw e movePoint
createPoints();
createShape();
startDraw();
movePoint();
createPoints();
utilizzando un ciclo, creo tante istanze Point per quanto è il valore della variabile num_points e le inserisco nell' array points_array
for(var i:int=0;i < num_points;i++)
{
var point:Point=new Point(stage.stageWidth/2,stage.stageHeight/2);
points_array.push(point);
}
createShape();
creo una nuova Shape e l' aggiungo al DisplayObject ( altrimenti non sarebbe visibile )
shape=new Shape();
addChild(shape);
startDraw();
creo unintervallo ENTER_FRAME che chiama il metodo go tante volte al seconde quanto è il valore del frame rate. In questo modo farò disegnare alla Shape una forma sempre sotto intervallo, per cui mi basterà muovere i punti che ho nell' Array ( che sono istanze della classe Point ) per poter cambiarne la forma
shape.addEventListener(Event.ENTER_FRAME,go);
go();
inizializzo le grafiche di shape
shape.graphics.clear();
shape.graphics.beginFill(0x0066FF,1);
faccio partire il disegno dalle coordinate del punto che si trova nel primo indice dell' Array
shape.graphics.moveTo(points_array[0].x,points_array[0].y);
for(var i:int=0;i
{
gli dico di disegnare sempre passando per ogni coordinata di ogni punto che ho nell' Array
shape.graphics.lineTo(points_array[i].x,points_array[i].y);
}
movePoint();
assegno a randomX e randomY due valori casuali che vanno rispettivamente da zero alla larghezza dello stage e sempre da zero all' altezza dello stage
randomX=Math.round(Math.random()*stage.stageWidth) ;
randomY=Math.round(Math.random()*stage.stageHeight );
assegno random point le coordinate dei due valori random appena ottenuti
random_point=new Point(randomX,randomY);
chiamo un intervallo ENTER_FRAME che chiamerà a sua volta il metodo run
addEventListener(Event.ENTER_FRAME,run);
run():
in questo metodo non faccio altro che applicare l' inerzia ( vedi articolo Inerzia
) e prendo come punti di arrivo le coordinate di random_point ( quindi le sue proprietà x e y ) e muovo verso di lui i punti che sono nell' indice dell' Array con valore id
var dx:Number=random_point.x-points_array[id].x;
var ax:Number=dx*.5;
points_array[id].x+=ax;
var dy:Number=random_point.y-points_array[id].y;
var ay:Number=dy*.5;
points_array[id].y+=ay;
if(Math.abs(dx)<=.02)
{
points_array[id].x=random_point.x;
points_array[id].y=random_point.y;
fermo l' intervallo quando il punto ha quasi raggiunto le coordinate di random_point
removeEventListener(Event.ENTER_FRAME,run);
incremento id di una unità
id++;
controllo che id non sia ne superiore ne uguale alla lunghezza di points_array ( altrimenti a forza di incrementare id ci troveremo col cercare un punto nell' Array inesistente, dato che sarebe maggiore o uguale della lunghezza dell' Array stesso... )
if(id>=points_array.length-1)
se è maggiore o uguale riporto id a zero
id=0;
e richiamo il metodo movePoint che assegnerà altri valori random alle proprietà x e y di random point.
movePoint();
}