Preloader une animation Flash

By 1 mars 2008Adobe Flash, Tutoriels

Voici la nouvelle méthode pour faire un preloader (à partir de Flash MX 2004). Cette méthode est plus fiable que l’ancienne et présente quelques nouvelles fonctionnalités intéressantes.

Dans l’exemple ci-après, nous afficherons un simple champ de texte affichant le pourcentage de l’animation chargée, mais rien ne vous empêche, sur le même principe, d’afficher la nième image d’un clip.

Code sur l’image 1 du calque actions on crée d’abord un clip conteneur et on le positionne en haut à gauche

this.createEmptyMovieClip("conteneur_mc", 10);
conteneur_mc._x = 0;
conteneur_mc._y = 0;

On crée un objet loader avec un écouteur d’événements

loader_mcl = new MovieClipLoader();
ecouteur = new Object();

Voici maintenant les différentes méthodes de cette nouvelle classe MovieClipLoader

// appelée quand le chargement démarre
ecouteur.onLoadStart = function(cible_mc)
{
    // création d'un champ de texte dynamiquement
    _root.createTextField("chargement_txt",110,0,0,50,20);
    // quelques attributs
    chargement_txt.border = true;
    chargement_txt.borderColor = 0x000000;
    chargement_txt.textColor = 0x000000;
}

La méthode appelée pendant le chargement, c’est l’endroit idéal pour afficher le preloader.

ecouteur.onLoadProgress = function(cible_mc, charge, total)
{
    _root.chargement_txt.text = Math.floor((charge/total) * 100) + "%";
}

Le chargement est terminé, on efface le texte avec le pourcentage.

ecouteur.onLoadComplete = function(cible_mc)
{
    _root.chargement_txt.removeTextField();
}

On peut maintenant travailler avec le clip chargé, par exemple on peut connaître sa taille, ce qui peut être pratique lorsqu’il s’agit d’images à afficher dans une galerie.

ecouteur.onLoadInit = function(cible_mc)
{
  // trace(cible_mc._width);
}

On ajoute l’écouteur à notre objet

loader_mcl.addListener(ecouteur);

La nouvelle méthode loadClip remplace LoadMovie et LoadMovieNum

loader_mcl.loadClip("fichier.swf", "_root.conteneur_mc");
// attention cette méthode ne fonctionne pas en local avec MX 2004
stop(); // on arrête la tête de lecture

Pour pouvoir tester avec Flash MX 2004, il faut charger un fichier depuis le web, par exemple

loader_mcl.loadClip("http://www.site.com/monGrosJPEG.jpg", "_root.conteneur_mc");

Voici tout le code en un seul bloc à copier

avec en prime un centrage du champ de texte et quelques attributs…

this.createEmptyMovieClip("conteneur_mc", this.getNextHighestDepth());
conteneur_mc._x = 0;
conteneur_mc._y = 0;
loader_mcl = new MovieClipLoader();
ecouteur = new Object();

// on définit le style du champ de texte (liste non exhaustive)
var style_fmt:TextFormat = new TextFormat();
style_fmt.font = "arial";
style_fmt.bold = true;
style_fmt.italic = true;
style_fmt.size = 18;
style_fmt.align = "center";

ecouteur.onLoadStart = function(cible_mc)
{
  largeur = 100; // largeur du champ de texte
  hauteur = 22; // hauteur
  _root.createTextField("chargement_txt",110,(Stage.width-largeur)/2,
(Stage.height-hauteur)/2, largeur, hauteur);
  chargement_txt.border = true;
  chargement_txt.borderColor = 0x000000;
  chargement_txt.textColor = 0x000000;
}

ecouteur.onLoadProgress = function(cible_mc, charge, total) {
  _root.chargement_txt.text = Math.floor((charge/total) * 100) + "%";
  _root.chargement_txt.setTextFormat(style_fmt);
}

ecouteur.onLoadComplete = function(cible_mc) {
    _root.chargement_txt.removeTextField();
}

loader_mcl.addListener(ecouteur);
loader_mcl.loadClip("fichier.swf", "_root.conteneur_mc");
stop();

Preloader à l’ancienne au cas où…

Décidément, Flash est plein de mystères et si jamais le preloader ci-dessus ne marchait pas, voici le code à mettre dans l’animation à preloader, sur la première image du scénario.

stop();
largeurTexte = 100;
hauteurTexte = 22;
this.createTextField("chargement_txt",getNextHighestDepth(),
(Stage.width-largeurTexte)/2, (Stage.height-hauteurTexte)/2,
 largeurTexte, hauteurTexte);
chargement_txt.border = true;
chargement_txt.borderColor = 0x000000;
chargement_txt.textColor = 0x000000;	

var appel:Number = setInterval(preloadSite, 50);

function preloadSite():Void {
  var charge:Number = _root.getBytesLoaded();
  var total:Number = _root.getBytesTotal();
  var pourcentage:Number = Math.round(charge/total*100);
  _root.chargement_txt.text = pourcentage + "%";

  if (charge >= total) {
    clearInterval(appel);
    _root.chargement_txt.removeTextField();
    gotoAndPlay(2);
  }
}

Laisser un commentaire