Conservez toute votre animation, mais supprimez votre musique de la bibliothèque.
Vous allez voir toute la simplicité de Flash sous vos yeux ébahis

: nous allons modifier une seule et unique ligne de code, et le chargement va devenir dynamique.
Supprimez :
Code : Actionscript | musique.attachSound("Hallelujah");
|
et remplacez par :
Code : Actionscript | musique.loadSound("Hallelujah.mp3", true);
|
Et ça fonctionne déjà.
Le second argument de
loadsound() permet de définir si la lecture peut se faire en streaming ou non. En clair, si vous mettez
false, il faudra attendre que la musique soit entièrement chargée avant de pouvoir l'écouter...
Mais quand je charge une grosse musique, et que l'animation est sur internet, le curseur de lecture devient complètement fou ! Qu'est-ce qui se passe ?
Ça aurait été trop facile, aussi

! En fait, le problème vient de la propriété
duration, qui ne correspond pas à la durée totale de la musique, mais à la durée qui a été chargée dans le lecteur Flash...
En fait, il n'y a
aucun moyen de connaître avec exactitude la durée totale de votre fichier audio, tant qu'il ne sera pas chargé complètement. Si vous regardez dans l'aide, vous verrez qu'il est possible de récupérer les tags
id3 des musiques que l'on charge. Ces tags incorporent ce qu'on appelle des méta-données sur la musique : son titre, le compositeur ... Il existe même un tag qui indique la durée de la musique. Mais voilà le problème : on trouvera le tag
TIME, qui correspond au temps total, sur très très peu de musiques.
Il va donc falloir faire fonctionner les méninges.

Si on ne peut connaître exactement la durée de la musique, on peut au moins l'approximer.
Barre de chargement
On va utiliser
selecteur comme barre de chargement. Puisque sa taille va changer au cours du temps, nos règles de trois ne seront plus valables. Il va donc falloir enregistrer au début de l'animation la taille maximale de la barre pour l'utiliser dans nos calculs.
On va donc avoir avec cette modification :
Code : Actionscript 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | var musique:Sound = new Sound();
musique.loadSound("Hallelujah.mp3", true);
var position_pause:Number = 0;
var largeur:Number = selecteur._width; // On stocke la largeur maximale de la barre
arret.onRelease = function() {
musique.start(0);
musique.stop();
};
pause.onRelease = function() {
musique.stop();
};
lecture.onRelease = function() {
musique.start(musique.position/1000);
};
curseur.onEnterFrame = function() {
this._alpha = 0;
this._xscale = (musique.position/musique.duration)*100;
};
selecteur.onRelease = function() {
musique.stop();
musique.start((this._xmouse*musique.duration)/(largeur*1000)); // Pour pouvoir l'utiliser dans les calculs
};
|
Vous remarquerez, que j'ai effectué une autre petite modification : j'ai enlevé la variable
vraie_position. Quand on utilise
attachSound(), elle est indispensable, mais quand on charge le son dynamiquement, écrire
start(0) remet réellement la position à zéro, ce qui n'est pas le cas avec la méthode statique (bug ?).
Il ne reste plus qu'à modifier la largeur de
selecteur selon le pourcentage correspondant au chargement de notre musique. Pour ça : pas de problème, on retrouve les mêmes méthodes que pour les images et les animations. On peut donc rajouter à la fin de notre code :
Code : Actionscript | selecteur.onEnterFrame = function() {
this._xscale = (musique.getBytesLoaded()/musique.getBytesTotal())*100;
if (this._xscale == 100) { // Une fois la musique complètement chargée
delete this.onEnterFrame; // On supprime le onEnterFrame
}
};
|
Si vous désactivez le curseur qui vous cache la barre de chargement, vous pourrez voir
selecteur qui grandit au fur et à mesure du chargement de votre musique.
Approximation de la durée totale
On connaît maintenant suffisamment de données pour pouvoir calculer une approximation de la durée totale, en considérant que le poids de la chanson est proportionnelle à sa durée.
On va donc introduire la variable
tduration, qui correspondra à la durée approximative totale de la musique.
Pour trouver la valeur de cette variable, c'est toujours et encore une bête règle de trois, il faut diviser la durée chargée par le pourcentage de chargement.
Code : Actionscript | tduration = (musique.getBytesTotal()*musique.duration)/musique.getBytesLoaded();
|
On placera ce code dans
selecteur.onEnterFrame, car ce dernier se détruit de lui-même une fois que la musique est complètement chargée.
Ensuite, il ne reste plus qu'à modifier l'affichage de
curseur pour qu'il se base sur
tduration, et non plus sur
musique.duration, qui est faussé.
Notre code complet :
Code : Actionscript 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | var musique:Sound = new Sound();
musique.loadSound("Hallelujah.mp3", true);
var largeur:Number = selecteur._width;
arret.onRelease = function() {
musique.start(0);
musique.stop();
};
pause.onRelease = function() {
musique.stop();
};
lecture.onRelease = function() {
musique.start(musique.position/1000);
};
curseur.onEnterFrame = function() {
this._xscale = (musique.position/tduration)*100;
};
selecteur.onRelease = function() {
musique.stop();
musique.start((this._xmouse*musique.duration)/(largeur*1000));
};
selecteur.onEnterFrame = function() {
this._xscale = (musique.getBytesLoaded()/musique.getBytesTotal())*100;
if (this._xscale == 100) {
delete this.onEnterFrame;
}
tduration = (musique.getBytesTotal()*musique.duration)/musique.getBytesLoaded();
};
|