[AS3] Classe TimelineController

1 décembre 2008 – 14:04

Parfois j'ai besoin de pouvoir contrôler la Timeline d'un MovieClip autrement que juste play, stop, gotoAnd...
Alors pour raccourcir la longueur de mon code source je me suis inspiré de TweenLite pour développer une petite classe TimelineController.

Trois méthodes statiques :

  • TimelineController.to(target:MovieClip, frame:Number) : permet de se rendre à une image précise sur la timeline de la façon la plus rapide. En résumé, si vous être sur l'image 5 et que vous devez aller sur l'image 100 (la dernière de votre timeline dans ce cas), la tête de lecture va partir vers l'arrière et passer par 1 pour atteindre l'image 100
  • TimelineController.reverse(target:MovieClip) : permet de lire la timeline à l'envers
  • TimelineController.once(target:MovieClip) : permet de lire la timeline "une fois" et s'arrête sur la dernière frame.

Comme pour TweenLite vous pouvez ajouter un objet en paramètre. Pour l'instant je n'utilise que la propriété onComplete et onCompleteParams. Pour déclencher une méthode lorsque l'image cible est atteinte.

TimelineController.as :

package  {
import flash.display.MovieClip;
import flash.events.Event;
 
public class TimelineController {
	private var _target:MovieClip
	private var _destinationFrame:Number;
	private var _direction:String;
	private var _params:Object;
 
public function TimelineController(aTarget:MovieClip, aDestinationFrame:Number = undefined, aDirection:String = undefined, aObject:Object = null ):void {
	_target = aTarget;
	_destinationFrame = aDestinationFrame;
	_params = new Object();
	if (aObject != null) _params = aObject;
	if (aDirection) {
		_direction = aDirection;
	}else {
		_direction = findQuickPath();
	}
	_target.addEventListener(Event.ENTER_FRAME, handleEnterFrame);
}
 
public static function to(aTarget:MovieClip, aDestinationFrame:Number, aObject:Object = null):TimelineController {
	return new TimelineController(aTarget, aDestinationFrame, undefined, aObject);
}
 
public static function once(aTarget:MovieClip, aObject:Object = null):TimelineController {
	return new TimelineController(aTarget, aTarget.totalFrames, "forward", aObject);
}
 
public static function reverse(aTarget:MovieClip, aObject:Object = null):TimelineController {
	return new TimelineController(aTarget, 1, "backward", aObject);
}
 
private function findQuickPath():String {
	var distance:Number =  _destinationFrame - _target.currentFrame;
	if (Math.abs(distance) > _target.totalFrames / 2) distance = -(distance);
	if (distance > 0) {
		return "forward";
	}else {
		return "backward";
	}
}
 
private function handleEnterFrame(e:Event):void {
	switch(_direction) {
case "forward":if (_target.currentFrame +1 <= _target.totalFrames) {
				_target.nextFrame();
			}else {
				_target.gotoAndStop(1);
			}
			break;
case "backward":if (_target.currentFrame -1 > 0) {
				_target.prevFrame();
			}else {
				_target.gotoAndStop(_target.totalFrames);
			}
			break;
			}
if (_target.currentFrame == _destinationFrame) {
	_target.removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
if (_params.onComplete != null) _params.onComplete.apply(null, _params.onCompleteParams);
	}
	}
}
}

Pour le moment je n'ai pas besoin de plus que ces trois méthodes mais si vous avez des idées...

  1. 6 Responses to “[AS3] Classe TimelineController”

  2. bonjour,

    je sèche depuis un bout de temps sur cette question de flv lu en reverse.
    Ce n’est pas avec mon petit niveau en as3 que j’y serai parvenu ^^
    Je travaille parfois avec des flv en couche alpha, et il aurait un mode tout à fait intéressant: le ping-pong.
    Une fois la vidéo achevée on rembobine en reverse et on rejoue en boucle.

    Aurais-tu un exemple fonctionel avec le TimeLineController?
    J’obtiens des erreurs de compilations ligne 38 – 39 -41 -18 -50 -54 -56
    à cause de rightparen attendu devant semicolon… :’(

    Cordialement
    CC

    By cedric on déc 15, 2008

  3. Ah !
    Je sais pourquoi tu as des erreurs. C’est mon WordPress qui a remplacé mes symboles « plus grand que » et « plus petit que » par des « &gt » et « &lt »… du coup si tu recopies le code tel quel tu vas avoir des erreurs de compilation.

    Je vais essayer de mettre en ligne quelque chose de plus fonctionnel…

    S.

    By Sakana on déc 15, 2008

  4. je me disais bien que “&gt” était une commande vraiment particulière :D

    By cedric on déc 15, 2008

  5. bonjour Sakana et Merci beaucoup pour tous ces post dont je m’abreuve sans modération ;)

    j’ai beaucoup utilisé ta classe timeline controller qui est vraiment clair et ce customize facilement pour un noob de l’AS comme moi ^^
    par contre je tombe maintenant sur un problème asse étrange et pas moyen de mettre le doigt dessus …
    une foi une lecture inversé lancé avec TimelineController.reverse (j’ai rajouté un destinationFrame dedans pour préciser jusqu’où aller) il m’annule mes tween de flou =/ ou me pète complètement mes interpolation 3D j’ai donc dabord renoncé à mes interpolation 3D mais par contre je ne peut pas renoncer à mes tween blur ^^
    et ce problème bien sur est le même avec ta classe timeline controller ou avec le « Nouveau » TweenMax V11: ( TweenMax.to(mc,0.5, {frame:40});, )
    Je ne sais pas si tu trouvera le temps de te pencher sur le problème mais on ne sais jamais ^^
    ci cela t’intéresse j’ai une source extra extra simple qui démontre tout cela.
    Merci encore pour tous tes post..
    Supa

    By supavice on mar 30, 2009

  6. Je veux bien voir la source, car comme ça c’est difficile à dire. Ma classe est très loin d’être parfaite, je l’ai réalisé pour un projet en particulier et il faudrait que je corrige pas mal de truc, surtout quand tu essayes de faire plusieurs tween à la fois.

    S.

    By Sakana on mar 30, 2009

  7. je trouve pas comment joindre une source =/

    By supavice on mar 31, 2009

Post a Comment