Le but recherché est de faire varier une valeur entre 2 extrémités tout en pouvant régler l’écart et le temps entre 2 variations.
/* ---------------------------------------------------------------------------- * * classe VariateurBase v1.0 * * Lorenzo le 03/05/2010 * * * AS >= 3.0 * package commun Flash et Flex ------------------------------------------------------------------------------- */ package lol.gestion{ import flash.events.Event; import flash.events.EventDispatcher; import flash.events.TimerEvent; import flash.utils.Timer; /** * @author Lorenzo * * Classe servant à faire varier une valeur numérique entre 2 extrémités. * * @example * var _variateur:VariateurBase = new VariateurBase(); _variateur.valeurMin = 0; _variateur.valeurMax = 150; _variateur.ecart = 1; _variateur.valeurDepart = 50; _variateur.ecartTemps = 5; _variateur.sensDepart = VariateurBase.AUGMENTER; _variateur.addEventListener(Event.CHANGE, evtVariateurChange); _variateur.lancer(); * * * @see lol.gestion.Variateur */ public class VariateurBase extends EventDispatcher{ // ----------------------------------------------------------------------------------- // DECLARATIONS // ----------------------------------------------------------------------------------- // ----------------------------- Parametres utilisateur ------------------------------ /** * La valeur minimum. */ protected var _valeurMin:Number = 0; /** * La valeur maximum. */ protected var _valeurMax:Number = 100; /** * La valeur de départ. */ protected var _valeurDepart:Number = 0; /** * L'écart à enlever ou ajouter à chaque itération. */ protected var _ecart:Number = 1; /** * La direction de départ <code>AUGMENTER</code> ou <code>DIMINUER</code>. */ protected var _sensDepart:String = AUGMENTER; /** * L'écart de temps entre 2 appel du variateur. */ protected var _temps:uint = 100; // -------------------------------- Parametres classe -------------------------------- /** * La valeur actuel. */ protected var _valeur:Number = 0; /** * Le sens de variation actuel. */ protected var _sens:String = AUGMENTER; /** * Le timer variateur. */ protected var _timer:Timer = null; // -------------------------------- constantes -------------------------------- /** * La direction qui indique dans quel sens la valeur doit être modifié au lancement du timer. */ public static const AUGMENTER:String = 'augmenter'; /** * La direction qui indique dans quel sens la valeur doit être modifié au lancement du timer. */ public static const DIMINUER:String = 'diminuer'; // ----------------------------------- Évenements ------------------------------------ /** * Propagé à chaque changement de valeur. * @eventType flash.events.Event.CHANGE */ [Event(name = "change", type = "flash.events.Event.CHANGE")] // ----------------------------------------------------------------------------------- // CONSTRUCTEUR // ----------------------------------------------------------------------------------- /** * Constructeur de VariateurBase */ public function VariateurBase() { super(); } // ----------------------------------------------------------------------------------- // METHODES // ----------------------------------------------------------------------------------- /** * Lancer le variateur */ public function lancer():void { this._valeur = this._valeurDepart; this._sens = this._sensDepart; this._timer = new Timer(this._temps, 0); this._timer.addEventListener(TimerEvent.TIMER, evtTimer); this._timer.start(); } /** * Mettre en pause le variateur */ public function pause():void { this._timer.removeEventListener(TimerEvent.TIMER, evtTimer); } /** * Mettre en pause le variateur et reinitialiser les valeurs */ public function reset():void { this.pause(); this._valeur = this._valeurDepart; this._sens = this._sensDepart; } // ----------------------------------------------------------------------------------- // EVENEMENTS // ----------------------------------------------------------------------------------- /** * */ protected function evtTimer(ev:TimerEvent):void { if( this._sens == AUGMENTER ){ this._valeur += this._ecart; if ( this._valeur >= this._valeurMax ) { this._valeur = this._valeurMax; this._sens = DIMINUER; } }else { this._valeur -= this._ecart; if ( this._valeur <= this._valeurMin ) { this._valeur = this._valeurMin; this._sens = AUGMENTER; } } this.dispatchEvent(new Event(Event.CHANGE)); } // ----------------------------------------------------------------------------------- // GET/SET // ----------------------------------------------------------------------------------- /** * La valeur minimum. * @default 0 */ public function get valeurMin():Number { return _valeurMin; } public function set valeurMin(val:Number):void { this._valeurMin = val; } /** * La valeur maximum. * @default 100 */ public function get valeurMax():Number { return _valeurMax; } public function set valeurMax(val:Number):void { this._valeurMax = val; } /** * La valeur de départ. * @default 0 */ public function get valeurDepart():Number { return _valeurDepart; } public function set valeurDepart(val:Number):void { this._valeurDepart = val; } /** * L'écart à enlever ou ajouter à chaque itération. * @default 1 */ public function get ecart():Number { return _ecart; } public function set ecart(val:Number):void { if ( val == 0 ) { throw new Error("Variateur::ecart - ne peut être égal à zéro"); } this._ecart = val; } /** * La direction de départ <code>VariateurBase.AUGMENTER</code> ou <code>VariateurBase.DIMINUER</code>. * @default VariateurBase.AUGMENTER */ public function get sensDepart():String { return _sensDepart; } public function set sensDepart(val:String):void { this._sensDepart = val; } /** * L'écart de temps en millisecondes entre 2 appel du variateur. * @default 100 */ public function get temps():uint { return _temps; } public function set temps(val:uint):void { this._temps = val; } /** * La valeur courante. */ public function get valeur():Number { return _valeur; } /** * Le sens de variation actuel : <code>VariateurBase.AUGMENTER</code> ou <code>VariateurBase.DIMINUER</code> */ public function get sens():String { return _sens; } } }
Ensuite, il est simple d’étendre VariateurBase
pour pouvoir cibler directement une occurrence quelconque et une propriété numérique de cette occurrence
/* ---------------------------------------------------------------------------- * * classe Variateur v1.0 * * Lorenzo le 03/05/2010 * * * AS >= 3.0 * package commun Flash et Flex ------------------------------------------------------------------------------- */ package lol.gestion{ import flash.events.Event; import flash.events.EventDispatcher; import flash.events.TimerEvent; import flash.utils.Timer; import lol.gestion.VariateurBase; /** * @author Lorenzo * * Classe servant à faire varier une propriété numérique d'une occurrence de classe quelconque. * * @example * var spCercle:Sprite = new Sprite(); with (spCercle.graphics) { lineStyle(0, 0, 1); drawCircle(20, 20, 10); } this.addChild(spCercle); var variateurX:Variateur = new Variateur(); variateurX.valeurMin = 0; variateurX.valeurMax = 150; variateurX.ecart = 1; variateurX.valeurDepart = 50; variateurX.temps = 5; variateurX.sensDepart = Variateur.AUGMENTER; variateurX.cible = spCercle; variateurX.propriete = "x"; variateurX.lancer(); * * * @see lol.gestion.VariateurBase */ public class Variateur extends VariateurBase{ // ----------------------------------------------------------------------------------- // DECLARATIONS // ----------------------------------------------------------------------------------- // ----------------------------- Parametres utilisateur ------------------------------ /** * Une occurrence de classe dont il faut faire varier une propriété. */ private var _cible:* = null; /** * La propriété qu'il faut faire varier. */ private var _propriete:String = ""; // -------------------------------- Parametres classe -------------------------------- /** * La direction qui indique dans quel sens la valeur doit être modifié au lancement du timer. */ public static const AUGMENTER:String = 'augmenter'; /** * La direction qui indique dans quel sens la valeur doit être modifié au lancement du timer. */ public static const DIMINUER:String = 'diminuer'; // ----------------------------------- Évenements ------------------------------------ /** * Propagé à chaque changement de valeur de la propriété. * @eventType flash.events.Event.CHANGE */ [Event(name = "change", type = "flash.events.Event.CHANGE")] // ----------------------------------------------------------------------------------- // CONSTRUCTEUR // ----------------------------------------------------------------------------------- /** * Constructeur de Variateur * */ public function Variateur() { } // ----------------------------------------------------------------------------------- // METHODES // ----------------------------------------------------------------------------------- /** * Lancer le variateur * */ public override function lancer():void { try { this._cible[this._propriete]; }catch (er:Error){ throw new Error("Variateur::lancer() - La cible ne contient pas la propriété"); } super.lancer(); } // ----------------------------------------------------------------------------------- // EVENEMENTS // ----------------------------------------------------------------------------------- /** * */ protected override function evtTimer(ev:TimerEvent):void { if( this._sens == AUGMENTER ){ this._valeur += this._ecart; if ( this._valeur >= this._valeurMax ) { this._valeur = this._valeurMax; this._sens = DIMINUER; } }else { this._valeur -= this._ecart; if ( this._valeur <= this._valeurMin ) { this._valeur = this._valeurMin; this._sens = AUGMENTER; } } this._cible[this._propriete] = this._valeur; this.dispatchEvent(new Event(Event.CHANGE)); } // ----------------------------------------------------------------------------------- // GET/SET // ----------------------------------------------------------------------------------- /** * Une occurrence de classe dont il faut faire varier une propriété. */ public function get cible():* { return _cible; } public function set cible(val:*):void { this._cible = val; } /** * La propriété à faire varier. */ public function get propriete():String { return _propriete; } public function set propriete(val:String):void { this._propriete = val; } } }
voici le code de l’exemple :
package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import lol.gestion.Variateur; /** * @author Lorenzo */ public class MainVariateur extends Sprite { public function MainVariateur():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point var spCercle:Sprite = new Sprite(); with (spCercle.graphics) { lineStyle(0, 0, 1); drawCircle(0, 0, 10); } this.addChild(spCercle); var variateurX:Variateur = new Variateur(); variateurX.valeurMin = 10; variateurX.valeurMax = 790; variateurX.ecart = 2; variateurX.valeurDepart = 50; variateurX.temps = 5; variateurX.sensDepart = Variateur.AUGMENTER; variateurX.cible = spCercle; variateurX.propriete = "x"; variateurX.lancer(); var variateurY:Variateur = new Variateur(); variateurY.valeurMin = 10; variateurY.valeurMax = 590; variateurY.ecart = 2; variateurY.valeurDepart = 20; variateurY.temps = 4; variateurY.sensDepart = Variateur.AUGMENTER; variateurY.cible = spCercle; variateurY.propriete = "y"; variateurY.lancer(); } } }
le SWF de l’exemple (pas de physique, juste une variation de la propriété x et y du sprite) :

A partir de ces classes, il est simple d’intégrer une variation non linéaire (principe des classes de tween) et plein d’autres choses sympa