com.neolao.movieclip.VirtualTimeline
Timeline virtuelle.
On peut ajouter à cette timeline virtuelle:
- un script
- une animation
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:
- l'instant t
- le début
- la différence entre la fin et le début
- 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 ====================*/ /*========================================================================*/ }