TUTORIELS 
Un preloader en ActionScript sous Flash MX

Page 1 | 2 | 3

Indiquer à l'internaute le temps restant avant la fin du chargement d'une animation est essentiel: une méthode pour intégrer ce service dans vos propres créations.
 (31 mars 2003)
 

Avec le temps, va...
Dernier petit ajout qui peut être fort utile pour les visiteurs: un indicateur de temps écoulé et restant ainsi que la vitesse de chargement, particulièrement utiles pour les applications très lourdes...
Nous placerons ces informations supplémentaires dans notre champ texte affichage; libre à vous de leur créer un champ à part...

(image-clé 1 du calque preload)
// variables générales
Stage.scaleMode = "exactFit";
_root.preload._x = 0;
_root.complet._x = 0;
_root.preload._y = 10;
_root.complet._y = 10;
_root.preload._height = 2;
_root.complet._height = 2;
_root.preload._width = 0;
_root.complet._width = Stage.width;

// variables temporelles
temps = new Date();
secondes = temps.getSeconds();
minutes = temps.getMinutes();
heures = temps.getHours();
jours = temps.getDay();

Nous introduisons quelques lignes dans notre second script:

(image-clé 3 du calque preload)
if (_root.getBytesLoaded() < _root.getBytesTotal())
  {
  temps2 = new Date();
  secondes2 = temps2.getSeconds() - secondes;
  minutes2 = temps2.getMinutes() - minutes;
  heures2 = temps2.getHours() - heures;
  jours2 = temps2.getDay() - jours;
  tempsecoule = (jours2 * 24 * 60 * 60) + (heures2 * 60 * 60) + (minutes2 * 60) + secondes2;
  vitesse = Math.round(_root.getBytesLoaded()
/ tempsecoule / 1024);
  tempsrestant = Math.round((_root.getBytesTotal()
- _root.getBytesLoaded()) / (vitesse*1024));

  _root.affichage.text = "Chargement en cours: "
  + Math.floor(_root.getBytesLoaded())
  + " octets chargés sur "
  + Math.floor(_root.getBytesTotal())
  + " au total, soit "
  + Math.floor(_root.getBytesLoaded() / _root.getBytesTotal() * 100)
  + "%. "
  + "Temps écoulé: " + tempsecoule
  + " secondes. Temps restant estimé: " + tempsrestant
  + " secondes. Vitesse de chargement: " + vitesse + " Ko/s.";

  _root.preload._width = (_root.getBytesLoaded()
  / _root.getBytesTotal()) * Stage.width;
  prevFrame();
  play();
  }

Beaucoup de calculs pour, en définitive, mettre les informations suivantes dans affichage: "Chargement en cours: 105657 octets chargés sur 743509 au total, soit 14%. Temps écoulé: 22 secondes. Temps restant estimé: 133 secondes. Vitesse de chargement: 4.7 Ko/s".

Pour ce faire, nous retrouvons ici la classe Date(), déjà abordée dans un précédent article. Ainsi, nous déclarons dans la première image-clé une occurrence de Date() appelée temps: elle nous permet de dater précisément le lancement de l'animation à l'aide des méthodes getSeconds(), getMinutes() et getHours(), dont nous récupérons les valeurs dans les variables idoines. Nous n'avons besoin de cette date qu'une seule fois, c'est pourquoi nous définissons ces valeurs dans la première image-clé, dont le script ne sera lancé qu'une seule fois.

En revanche, tout ce qui concerne le temps passé nécessite des valeurs constamment mises à jour, et c'est pourquoi nous les avons placées dans la seconde image-clé de preload (nous aurions aussi bien pu créer une nouvelle image-clé sur l'image 2 de ce calque): une nouvelle occurrence de Date(), appelée temps2, nous permet d'obtenir les valeurs du temps à l'instant du passage de la tête de lecture, et donc (par soustraction avec les valeurs tirées de temps) d'être toujours au fait du temps écoulé: secondes2 contient ainsi le nombre de secondes écoulées...
Le temps total écoulé est ensuite calculé en passant toutes les valeurs de jours, d'heures et de minutes écoulés en secondes, et en additionnant toutes ces valeurs avec les secondes écoulées.
La vitesse (en kilo-octets/seconde) est calculées en divisant le nombre d'octets chargés par le nombre de secondes écoulées. On divise ensuite les octets/s obtenus par 1024 pour obtenir des ko/s. L'utilisation de Math.round nous permet de ne pas avoir de chiffres après la virgule.
C'est grâce à la vitesse de chargement que l'on peut calculer une estimation du temps restant à charger. On soustrait d'abord le nombre d'octets chargés au nombre total d'octets pour obtenir le nombre d'octets restants à charger. On divise ensuite cette valeur par la vitesse multipliée par 1024 (étant donné que getBytesLoaded et getBytesTotal sont en octets, nous devont repasser la vitesse en octets pour obtenir les bonnes valeurs), un petit Math.round et le tour est joué.

Vous pouvez voir la version finale de notre preloader ici, et télécharger notre code source ici. Comme d'habitude, il est volontairement dépouillé d'effet esthétique.

Il y a bien entendu de nombreuses autres manières de construire un preloader: à vous de faire celui qui vous convient le mieux. Nous espérons vous avoir mis sur la bonne voie pour cela.

Page 1 | 2 | 3

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page