Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox



Cibler des clips enfants créés dynamiquement

Compatible ActionScript 2. Cliquer pour en savoir plus sur les compatibilités.Par tambra, le 15 mai 2007

Problèmatique

tuto en construction. Toute participation est la bienvenue :-)

Lors de la création dynamiques de clips, on peut ne pas connaitre le nom des occurences de MovieClip ciblés. Pour un clip “parent” donné, on cherche à connaitre tous les “enfants”, occurrences de MovieClip.

Solution

Pour remédier à ce problème, on peut exécuter une boucle for..in sur une occurrence de MovieClip afin d'en connaitre le contenu.

function trouveEnfant (mc_parent:MovieClip):Void
{
	for (var i in mc_parent) {
		if (typeof (mc_parent[i]) == "movieclip") {
			trace ("Un enfant :" + mc_parent[i]._name);
		}
	}
}

Nous partirons du postulat suivant : Nous n'avons aucun moyen de connaitre ou d'accéder au clips enfants par leurs noms. Pour illustrer ce fait, on créer trois fonctions génératives. L'une va créer un nombre aléatoire d'occurrences de MovieClip, l'autre un nombre aléatoire d'occurrences de String (afin de brouiller les pistes lors de l'énumération du contenu du clip parent) et la dernière génère une chaine de caractère aléatoire, de cette manière, nous n'avons vraiment aucun moyen d'accéder aux occurrences par leur nom LOL. Cette dernière fonction fait elle même appelle à trois autres fonctions qui retournent majuscule, minuscule et chiffre aléatoire.

//On initialise un tableau qui nous servira à stocker le contenu du clip parent.
var listeDesClipsEnfants:Array = new Array ();
//D'abord la fonction du manuel concernant l'utilisation de Math.random(), 
//qui retourne un entier compris entre min et max.
function randRange (min:Number, max:Number):Number
{
	var randomNum:Number = Math.floor (Math.random () * (max - min + 1)) + min;
	return randomNum;
}
/*Ensuite une série de trois fonctions qui retournent un caractère aléatoire. 
On utilise ici String.fromCharCode (), qui convertit un entier compris entre 0 et 127
en son équivalent dans la table de caractères ascii.*/
//Les majuscules
function majAleatoire ():String
{
	//On appelle la fonction randRange(), et l'on stocke le retour dans la variable n.
	var n:Number = randRange (48, 57);
	return String.fromCharCode (n);
}
//Les minuscules
function minAleatoire ():String
{
	var n:Number = randRange (65, 90);
	return String.fromCharCode (n);
}
//Les chiffres
function chiffreAleatoire ():String
{
	var n:Number = randRange (97, 122);
	return String.fromCharCode (n);
}
/*A l'aide de ces trois précédentes fonctions, on compose une chaîne de caractère 
aléatoire.
On se laisse la possibilité d'ajouter un préfixe à des fins de déboguage uniquement. 
Nous n'utiliserons pas directement ce préfixe pour cibler.*/
function nomAleatoire (prefixe:String):String
{
	//On détermine le nombre de lettre composant le futur nom d'occurence.
	var nombreDeLettres:Number = randRange (5, 10);
	// On initialise la chaîne de caractère avec le préfixe passé en argument à la 
	//fonction nomAleatoire().
	var nomAleatoire:String = prefixe;
	//On exécute une boucle autant de fois que nécessaire
	for (var i:Number = 0; i <= nombreDeLettres; i++) {
		//On détermine le type (maj/min/chiffre) de caractère à ajouter.
		var n:Number = randRange (0, 2);
		if (n == 0) {
			//et on concatène le présent caractère avec le reste du nom.
			nomAleatoire += majAleatoire ();
		} else if (n == 1) {
			nomAleatoire += minAleatoire ();
		} else {
			nomAleatoire += chiffreAleatoire ();
		}
	}
	return nomAleatoire;
}

On va créer un nombre aléatoire de clips et de strings, avec chacun un nom bien barbare.

function creerClips (cible:MovieClip):Void
{
	//Nous déterminons le nombre de clips à créer, ici entre 5 et 10 et nous exécutons 
	//une boucle.
	var nombreClipsACreer:Number = randRange (5, 10);
	for (var i:Number = 0; i <= nombreClipsACreer; i++) {
		//On passe un préfixe à la fonction nomAléatoire().
		var nomClip:String = nomAleatoire ("mc_");
		//et nous créons le clip
		cible.createEmptyMovieClip (nomClip, cible.getNextHighestDepth ());
	}
}
//Ici de même que précédemment, mais avec une chaîne de caractère.
function creerStrings (cible:MovieClip):Void
{
	var nombreStringsACreer:Number = randRange (5, 10);
	for (var i:Number = 0; i <= nombreStringsACreer; i++) {
		var string:String = nomAleatoire ("str_");
		cible[string] = new String ();
	}
}
//Nous voilà enfin au coeur de la manipulation. Créons d'abord un parent...
this.createEmptyMovieClip ("mc_parent", this.getNextHighestDepth ());
//et passons le en argument à nos deux fonctions génératives.
creerStrings (mc_parent);
creerClips (mc_parent);

Ici nous allons énumérer le contenu du clip parent à l'aide d'une boucle for in et vérifier si le type et movieclip. Si la condition se vérifie on place la référence dans un tableau qui sera reourné par la fonction.

function getChildList (mc_parent:MovieClip):Array
{
	var listeDesClips:Array;
	listeDesClips = new Array ();
	for (var i in mc_parent) {
		if (typeof (mc_parent[i]) == "movieclip") {
			listeDesClips.push (mc_parent[i]);
		}
	}
	return listeDesClips;
}
//On peux tester en appelant une méthode de MovieClip sur une des entrées du tableau 
//des enfants.
listeDesClipsEnfants = getChildList(mc_parent);
var test:MovieClip = listeDesClipsEnfants[2].createEmptyMovieClip ("mc_test", 1000);
trace (test);
//sortie : _level0.mc_parent.mc_oOf9wP.mc_test

Et pour terminer, comme ce genre de problème est récurent, on écrit une classe as2 avec une méthode static, ce qui nous évitera d'instancier la classe à chaque fois que l'on en a besoin :

class MovieClipChildParser
{
	private function MovieClipChildParser ()
	{
	}
	public static function getChildList (mc_parent:MovieClip):Array
	{
		var listeDesClipsEnfants:Array;
		listeDesClipsEnfants = new Array ();
		for (var i in mc_parent) {
			if (typeof (mc_parent[i]) == "movieclip") {
				listeDesClipsEnfants.push (mc_parent[i]);
			}
		}
		return listeDesClipsEnfants;
	}
}

Conclusion

Ce tuto est en construction : soyez indulgent.

Pour en discuter, poser vos questions ou me faire un retour :

http://flash.mediabox.fr/index.php?s=0b2a6049467a7fe88ddc451a0df51ae0&showtopic=70930&hl=