This is a discussion on Inerzia con Flash CS3 within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Spesso vi sarà capitato di vedere animazioni o effetti che simulano leggi fisiche o matematiche con Actionscript.
Quello che voglio ...
Spesso vi sarà capitato di vedere animazioni o effetti che simulano leggi fisiche o matematiche con Actionscript.
Quello che voglio introdurre è un capitolo che sarà molto lungo e non sempre semplice da capire.
Seguite gli articoli che verranno perchè ne vedremo delle belle !
Dunque, partiamo...
Il primo effetto che è bene imparare è il così chiamato ' movimento inerziale ' .
In poche parole si tratta di quelle animazioni che partono veloci e rallentano sempre di più fino a fermarsi al punto finale.
Chiaramente mi riferisco ad animazioni di movimento/spostamento di oggetti con Actionscript, ma questo effetto è applicabile anche ad altre proprietà come ad esempio l' alpha o la rotazione.
Entriamo nel sodo:
creo un FLA e lo salvo con nome ' inerzia.fla ' e poi creo la Document class con un file AS che salvo con nome ' Inerzia.as '.
Eccola:
Code:
package
{
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.events.Event;
import flash.events.MouseEvent;
public class Inerzia extends Sprite
{
private var quadrato:Sprite;
private var arrivo:int=400;
public function Inerzia()
{
stage.frameRate=31;
creaSprite();
initQuadratoListener();
initBottoneListener();
}
private function creaSprite():void
{
quadrato=new Sprite();
quadrato.graphics.beginFill(0xFF0066);
quadrato.graphics.drawRect(100,100,50,50);
quadrato.graphics.endFill();
addChild(quadrato);
}
private function initQuadratoListener():void
{
quadrato.addEventListener(Event.ENTER_FRAME,muoviQuadrato);
}
private function initBottoneListener():void
{
riprova_btn.addEventListener(MouseEvent.MOUSE_DOWN,replay);
}
private function muoviQuadrato(e:Event):void
{
var distanza:Number=arrivo-quadrato.x;
var inerziale:Number=distanza*.1;
quadrato.x+=inerziale;
if(Math.abs(distanza)<=.5)
{
quadrato.x=arrivo;
quadrato.removeEventListener(Event.ENTER_FRAME,muoviQuadrato);
}
}
private function replay(m:MouseEvent):void
{
quadrato.removeEventListener(Event.ENTER_FRAME,muoviQuadrato);
quadrato.x=0;
initQuadratoListener();
}
}
}
Risultato:
Da notare che la classe estende la classe Sprite e non la MovieClip semplicemente perchè riduco la memoria e non importo la classe MovieClip ma solo la Sprite.
Se le MovieClip vengono disegnate ' a mano ' nel FLA allora la classe dovrà estendere la MovieClip class.
Cosa faccio:
- creo una variabile con nome ' arrivo '
- disegno una semplice Sprite di forma quadrata e la imposto ad una certa X e Y.
- aggiungo i listeners ( in questo caso c'è anche un listener per il bottone ' riprova ' )
- faccio partire un intervallo ( ENTER_FRAME ) La variabile ' distanza ' è sempre la differenza tra il punto di arrivo ( il valore della variabile ' arrivo ' ) e la x della Sprite.
La variabile ' inerziale ' divide la distanza in 10, cioè: dire *.1 equivale a dire /10
Ricordiamoci sempre che dobbiamo interrompere l'intervallo quando la Sprite raggiunge il punto di arrivo o avremo un intervallo sempre attivo con conseguenze sulla CPU dell'utente.
Quindi fermo l'intervallo quando il valore della variabile ' distanza ' è minore o uguale a 0.5 .