com.neolao.movieclip.VirtualTimeline

Timeline virtuelle.

On peut ajouter à cette timeline virtuelle:

Pour chaque élément ajouté, un layer est créé. Ce layer possède toutes les informations nécessaires pour que l'élément s'exécute correctement. Une vérification de chaque layer est faite toutes les frames et permet de mettre à jour chaque élément.

Classes recquises:

Exemple

var f1:BlurFilter = new BlurFilter(50, 50, 1);
var f2:DropShadowFilter = new DropShadowFilter(2, 45, 0, .7, 10, 10, 2, 1);
 
 
this.monClip.filters = [f1, f2];
 
timeline = new VirtualTimeline();
 
var etat1:Object = {_x:0, _y:0};
etat1.filters = new Array();
etat1.filters[0] = {blurX:50, blurY:50};
etat1.filters[1] = {alpha:0, blurX:10, blurY:10};
 
var etat2:Object = {_x:200, _y:200};
etat2.filters = new Array();
etat2.filters[0] = {blurX:0, blurY:0};
etat2.filters[1] = {alpha:1, blurX:0, blurY:0};
 
timeline.addMotion(1, this.monClip, etat1, etat2, 50);
timeline.play();

Propriétés

Visibilité Type Nom Status Description
public Object _global L'objet contenant toutes les variables globales
public Number _currentframe La frame courante
public Number _totalframes Le nombre total de frames
public Boolean loop Indique si la timeline boucle

Méthodes

Visibilité Return Nom Param 1 Param 2 Param 3 Param 4 Param 5 Param 6 Param 7 Param 8 Description
public Void addScript frame:Number script:Function Ajouter un script sur une frame
public Void addMotion frame:Number target:MovieClip start:Object end:Object steps:Number function:Function script:Function scriptEnd:Function Ajouter une animation
public Void play Jouer l'animation
public Void stop Stopper l'animation

Change log

[12/08/2004]

Timeline virtuelle

[12/10/2004] Version 1.1

Ajout d'un Object qui enregistre des variables globales

[25/10/2004]

Un ptit check up !

[05/10/2005] Version 2.0

Reécriture complète.

[06/10/2005] Version 2.1

  • L'animation peut être fait sur le _alpha et _rotation maintenant, j'avais oublié
  • correction de _enterFrame, l'incrémentation du _currentframe était trop tot

[07/10/2005] Version 2.2

Modification de la fonction d'animation. Maintenant, les paramètres sont:

  1. l'instant t
  2. le début
  3. la différence entre la fin et le début
  4. le nombre d'étape

Pour coller avec la forme des equations de Penner

Source

import com.neolao.controls.EnterFrame;
import com.neolao.data.ArrayUtils;
import com.neolao.data.TypeUtils;
/**
 * @ignore
 * 
 * Timeline virtuelle
 * @author 		neolao <neo@neolao.com>
 * @version 		2.2 (07/10/2005)
 * @link		http://resources.neolao.com/flash/classes/movieclip/VirtualTimeline
 * @license		http://creativecommons.org/licenses/by-sa/2.0/
 */
dynamic class com.neolao.movieclip.VirtualTimeline {
	public var className:String = "VirtualTimeline";
	public var version:String = "2.2";
 
	// ----------------------------- CONSTANTES --------------------------------
	/**
	 * Une fonction affine
	 */
	public var DEFAULT_MOTION:Function = function(time, begin, change, steps){return begin + time*change/steps;};
 
	// ----------------------------- VARIABLES ---------------------------------
	/**
	 * La liste des frames
	 */
	private var _frames:Array;
	/**
	 * La liste des layers
	 */
	private var _layers:Array;
	/**
	 * Le nombre total de frames
	 */
	public var _totalframes:Number;
	/**
	 * La frame courante
	 */
	public var _currentframe:Number;
	/**
	 * Indique si la timeline boucle
	 */
	public var loop:Boolean;
	/**
	 * L'objet contenant toutes les variables globales
	 */
	public var _global:Object;
 
	// ----------------------------- EVENEMENTS --------------------------------
	/**
	 * La fonction exécutée à chaque frame
	 */
	public var onEnterFrame:Function;
	/**
	 * Evénement invoqué lorsque la fin de la timeline est atteinte
	 */
	public var onEnd:Function;
 
	/*============================= CONSTRUCTEUR =============================*/
	/*========================================================================*/
	/**
	 * Constructeur
	 */
	public function VirtualTimeline(){
		_frames = new Array();
		_layers = new Array();
		_totalframes = -1;
		loop = true;
		_global = new Object();
 
		init();
	}
	/*======================= FIN = CONSTRUCTEUR = FIN =======================*/
	/*========================================================================*/
 
	/*=========================== METHODES PRIVEES ===========================*/
	/*========================================================================*/
	/**
	 * Ajouter une action à une frame donnée
	 * @param pFrame La frame où mettre l'action
	 * @param pType Le type de l'action à effectuer : "motion", "script"
	 * @param pProperties Les paramètres de l'action
	 */
	private function _addAction(pFrame:Number, pType:String, pProperties:Object){
		var vLayer:Object;
 
		// Ralonge la timeline si besoin
		if(pFrame > _totalframes){
			_totalframes = pFrame;
		}
 
		vLayer = _addLayer(pType);
		vLayer.frame = pFrame;
		switch(pType){
			case "script":
				vLayer.script = pProperties.script;
				break;
			case "motion":
				// On copie tous les paramètres sur le layer
				for(var i:String in pProperties){
					vLayer[i] = pProperties[i];
				}
				// On en ajoute des nouveaux
				vLayer.frameEnd = pFrame + pProperties.steps;
 
				// On vérifie certaines propriétés
				if(!pProperties.motionFunction){
					vLayer.motionFunction = DEFAULT_MOTION;
				}
 
				// On étend la timeline si besoin
				if(pFrame + pProperties.steps > _totalframes){
					_totalframes = pFrame + pProperties.steps;
				}
				break;
		}
	}
	/**
	 * Mise à jour de l'état de l'animation d'un layer
	 */
	private function _updateMotion(pLayer:Object){
		var vProperties:Array = new Array("_x", "_y", "_width", "_height", "_xscale", "_yscale", "_alpha", "_rotation");
		var vFilters:Array;
 
		// Propriétés de MovieClip
		for(var i:Number = 0; i<vProperties.length; i++){
			if(TypeUtils.isNumber(pLayer.statusStart[vProperties[i]]) && TypeUtils.isNumber(pLayer.statusEnd[vProperties[i]])){
				pLayer.targetInstance[vProperties[i]] = pLayer.motionFunction(_currentframe - pLayer.frame, pLayer.statusStart[vProperties[i]], pLayer.statusEnd[vProperties[i]] - pLayer.statusStart[vProperties[i]], pLayer.steps);
			}
		}
 
		// Filters Flash 8
		if(TypeUtils.isArray(pLayer.targetInstance.filters) && TypeUtils.isArray(pLayer.statusStart.filters)){
			// Mémorisation des filtres
			vFilters = pLayer.targetInstance.filters;
 
			// Modification
			for(var i:Number = 0; i<vFilters.length; i++){
				// Pour chaque filtre
				for(var j:String in vFilters[i]){
					// Pour chaque propriété du filtre
					if(TypeUtils.isNumber(vFilters[i][j]) && TypeUtils.isNumber(pLayer.statusStart.filters[i][j]) && TypeUtils.isNumber(pLayer.statusEnd.filters[i][j])){
						vFilters[i][j] = pLayer.motionFunction(_currentframe - pLayer.frame, pLayer.statusStart.filters[i][j], pLayer.statusEnd.filters[i][j] - pLayer.statusStart.filters[i][j], pLayer.steps);
					}
				}
			}
 
			// Application des modifications
			pLayer.targetInstance.filters = vFilters;
		}
	}
	/**
	 * Fonction exécutée à chaque frame de la timeline
	 */
	private function _enterFrame(){			
		// le onEnterFrame paramétré
		onEnterFrame();
 
		// Pour chaque layer
		for(var i:Number=0; i<_layers.length; i++){
			switch(_layers[i].type){
				case "script":
					if(_currentframe == _layers[i].frame){
						// On lance script() avec comme paramètre les variables globales
						_layers[i].script(_global);
					}
					break;
				case "motion":
					if(_currentframe == _layers[i].frame){
						// Première frame
						// On lance onStart() avec comme paramètre les variables globales
						_layers[i].onStart(_global);
					}else if(_currentframe >= _layers[i].frame && _currentframe <= _layers[i].frameEnd){
						// Toutes les frames
						// Mise à jour de l'état du layer
						_updateMotion(_layers[i]);
					}else if(_currentframe == _layers[i].frameEnd){
						// La dernière frame
						// On lance onEnd() avec comme paramètre les variables globales
						_layers[i].onEnd(_global);
					}
					break;
				default:
			}
		}
 
		// Le compteur de frame s'incrémente
		_currentframe++;
 
		// test de fin de la timeline
		if(_currentframe >= _totalframes){
			if(loop){
				init();
			}else{
				stop();
			}
			onEnd()
		}		
	}
 
	/**
	 * Ajoute un layer à la liste des layers
	 * @param pType Indique le type du layer
	 */
	private function _addLayer(pType:String):Object{
		var vResult:Object;
 
		vResult = new Object();
		vResult.type = pType;
		_layers.push(vResult);
 
		return vResult;
	}
	/**
	 * Efface un layer de la liste des layers
	 * @param pLayer L'object layer à effacer
	 */
	private function _removeLayer(pLayer:Object){
		ArrayUtils.remove(_layers, pLayer);
	}
	/**
	 * Efface un layer de la liste des layers par son index
	 * @param pLayerIndex L'index de l'object layer à effacer
	 */
	private function _removeLayerByIndex(pLayerIndex:Number){
		_layers.splice(pLayerIndex, 1);
	}
	/*===================== FIN = METHODES PRIVEES = FIN =====================*/
	/*========================================================================*/
 
	/*============================ GETTER  SETTER ============================*/
	/*========================================================================*/
 
	/*====================== FIN = GETTER  SETTER = FIN ======================*/
	/*========================================================================*/
 
	/*========================== METHODES PUBLIQUES ==========================*/
	/*========================================================================*/
	/**
	 * Initialisation
	 */
	public function init(){
		_currentframe = 1;
	}
	/**
	 * Ajouter un script sur une frame
	 * @param pFrame La frame du script
	 * @param pScript La fonction qui sera exécutée à la frame donnée
	 */
	public function addScript(pFrame:Number, pScript:Function):Void{
		_addAction(pFrame, "script", {script:pScript});
	}
	/**
	 * Ajouter une animation
	 * @param pFrame La frame du début de l'animation
	 * @param pTarget La cible de l'animation
	 * @param pStatusStart L'état de départ
	 * @param pStatusEnd L'état d'arrivé
	 * @param pSteps Le nombre de frame que dure l'animation
	 * @param pMotionFunction (optional) L'équation de déplacement
	 * @param pOnStart (optional) Le script exécuté au début de l'animation
	 * @param pOnEnd (optional) Le script exécuté à la fin de l'animation
	 */
	public function addMotion(pFrame:Number, pTarget:MovieClip, pStatusStart:Object, pStatusEnd:Object, pSteps:Number, pMotionFunction:Function, pOnStart:Function, pOnEnd:Function):Void{
		_addAction(pFrame, "motion", {targetInstance:pTarget, statusStart:pStatusStart, statusEnd:pStatusEnd, steps:pSteps, motionFunction:pMotionFunction, onStart:pOnStart, onEnd:pOnEnd});
	}
	/**
	 * Jouer l'animation
	 */
	public function play():Void{
		EnterFrame.addListener(this, _enterFrame);
	}
	/**
	 * Stopper l'animation
	 */
	public function stop():Void{
		EnterFrame.removeListener(this);
	}
	/*==================== FIN = METHODES PUBLIQUES = FIN ====================*/
	/*========================================================================*/
}