This is a discussion on Trigonometria con Actionscript 3.0 esempio 2 within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Eccoci quà ! Siamo tornati sulla trigonometria ( molto affascinante eh... )
Questo articolo è la seconda, ma non ultima, parte dell' articolo Trigonometria ...
Questa volta applicherò la trigonometria all' effetto spring visto in questo articolo.
Entriamo subito nel vivo...
Creo un FLA che salvo con nome ' trigonometria_2.fla ' al cui interno:
-creo una MovieClip con forma a piacere ( si tratta solo di un esempio ) a cui assegno nome istanza '.stella_mc '.
-creo un' altra MovieClip che chiamo ' freccia_mc ' ( in questo caso a forma di freccia ) e che istanzio 2 volte assegnado nomi istanze ' freccia_0_mc ' e ' freccia_1_mc '
Creo la Document Class, un file AS che salvo con nome ' TrigoDue.as ', implementata in questo modo:
Code:
package
{
import flash.display.MovieClip;
import flash.events.Event;
public class TrigoDue extends MovieClip
{
private var angle:Number=0;
private const raggio:int=100;
public function TrigoDue()
{
init();
}
private function init():void
{
stage.frameRate=31;
stella_mc.x=stage.stageWidth/2;
stella_mc.y=stage.stageHeight/2;
stella_mc.addEventListener(Event.ENTER_FRAME,muovi);
}
private function muovi(e:Event):void
{
e.target.y=stage.stageHeight/2+Math.sin(angle)*raggio;
e.target.x=stage.stageWidth/2+Math.sin(angle)*raggio;
var dx_0:Number=e.target.x-freccia_0_mc.x;
var dy_0:Number=e.target.y-freccia_0_mc.y;
var radians:Number=Math.atan2(dy_0,dx_0);
freccia_0_mc.rotation=(radians/Math.PI)*180;
var dx_1:Number=e.target.x-freccia_1_mc.x;
var dy_1:Number=e.target.y-freccia_1_mc.y;
var radians2:Number=Math.atan2(dy_1,dx_1);
freccia_1_mc.rotation=(radians2/Math.PI)*180;
angle+=.1;
}
}
}
Risultato:
Analizziamo il codice:
Proprietà:
una variabile numerica che contiene il valore dell' angolo
private var angle:Number=0;
una costante numerica chiamata raggio a cui assegno il valore di 100 ( sarà il raggio azione di stella_mc )
private const raggio:int=100;
init();
dichiaro una velocità di frame rate
stage.frameRate=31;
posiziono stella_mc
stella_mc.x=stage.stageWidth/2;
stella_mc.y=stage.stageHeight/2;
assegno un listener in ascolto di ENTER_FRAME che chiama muovi()
stella_mc.addEventListener(Event.ENTER_FRAME,muovi );
muovi();
ricordiamoci che siamo all' interno di un intervallo ( ENTER_FRAME ), per cui questo metodo verrà eseguito tante volte al secondo per quanto è il valore del frame rate
e.target è chi ha dispacciato l' evento, in questo caso stella_mc
assegno alla x di stella_mc un valore che è la metà dell' altezza dello stage + il seno dell' angolo ( variabile ' angle ' che ancora è zero ) moltiplicato per il valore della costante raggio
e.target.x=stage.stageWidth/2+Math.sin(angle)*100;
assegno alla y di stella_mc un valore che è la metà della larghezza dello stage + il seno dell' angolo ( variabile ' angle ' che ancora è zero ) moltiplicato per il valore della costante raggio
e.target.y=stage.stageHeight/2+Math.sin(angle)*100;
creo 2 variabili numeriche che contengono il valore della differenza tra le coordinate di stella_mc e freccia_0_mc
var dx_0:Number=e.target.x-freccia_0_mc.x;
var dy_0:Number=e.target.y-freccia_0_mc.y;
calcolo i radianti tra i valori delle due variabili appena create ( vedi questo articolo )
var radians:Number=Math.atan2(dy_0,dx_0);
assegno i gradi ( ottenuti dalla forumla matematica di conversione radianti / gradi ) alla rotation di freccia_0_mc
freccia_0_mc.rotation=(radians/Math.PI)*180;
stessa cosa per freccia_1_mc
var dx_1:Number=e.target.x-freccia_1_mc.x;
var dy_1:Number=e.target.y-freccia_1_mc.y;
var radians2:Number=Math.atan2(dy_1,dx_1);
freccia_1_mc.rotation=(radians2/Math.PI)*180;
incremento il valore di angle di 0,1
angle+=.1;