classe variateur

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 :)

Laisser un commentaire

*