Les sons, chargement

Portrait de titouille

Etant un afficionado des développement RIA, je me soucie en général assez peu du "préchargement" de mes applications, vu que ces dernières sont le plus souvent destinées à être installées sur le poste client directement, sans avoir besoin d'accéder au web pour en afficher les contenus...

Après avoir écrit le ticket des bibliothèques partagées, version "sounds", on m'a demandé comment je gérais le préchargement de celle-ci. Etant plutôt du genre à voir la logique des choses, je répondit qu'un swf chargé dans un swf conteneur permettait normalement sans autre de pouvoir gérer le chargement, mais là, on m'a dit que non. Les swf contenant du son renvoient "vrai" au préchargement total dès le lancement de la fonction loadMovie, ce qui me semblais tout de même assez bizarre... J'ai fait des tests, et j'ai bien été confronté à ce problème... hem...

Après quelques minutes de recherches, j'ai fini par comprendre pourquoi, et c'est plutôt simple à définir :

Lorsqu'on charge un fichier dans un clip cible, on passe par la méthode loadMovie. Pour gérer la gestion du préchargement, on va utiliser un gestionnaire onEnterFrame qui va permettre de tester les méthodes getBytesLoaded() et getBytesTotal() afin de définir ou en est notre chargement.
Le problème, justement, c'est que la gestion du préchargement ne se fait pas par le clip qui charge son contenu, donc on peut toujours avoir des surprises...

Dans le cas de la bibliothèque des sons, lorsqu'on lance la méthode loadMovie et qu'un gestionnaire onEnterFrame est lancé droit derrière, il capte l'initialisation du clip conteneur, qui va surement faire en sorte de remettre à zéro toutes les valeurs du conteneur avant de lancer le chargement de son contenu...
Avant même que le chargement commence, notre test sur getBytesLoaded et getBytesTotal nous donne 0 et 0, ce qui fait qu'on a notre correspondance, et on sort du gestionnaire (malheureusement, au mauvais moment).

Pour palier à ce problème, il suffit de mettre un "flag" qui va nous indiquer qu'on a déjà passé plusieurs fois dans le gestionnaire onEnterFrame avant de commencer à tester les valeurs de chargement...

Voici un petit bout de code qui illustre mes propos :

var ctnr:MovieClip = this.createEmptyMovieClip( 'ctnr', 1 );
ctnr.loadMovie( 'sharedSounds.swf' );
var flag:Number = 0;
this.onEnterFrame = function()
	{
	trace (ctnr.getBytesLoaded() + " :: " + ctnr.getBytesTotal());
	flag ++;
	if (flag > 4)
		{
		if (ctnr.getBytesLoaded() < ctnr.getBytesTotal())
			trace ('loading');
		else
			{
			delete this.onEnterFrame;
			trace ('loaded');
			}
		}
	}

et vala Wink





thanx
very useful !