Orange73
Messages postés1375Date d'inscriptiondimanche 28 novembre 2004StatutMembreDernière intervention 2 août 2011
-
10 mai 2009 à 09:46
joecharier
Messages postés1Date d'inscriptionjeudi 2 octobre 2008StatutMembreDernière intervention17 mai 2010
-
17 mai 2010 à 11:43
Hello, tout le monde,
Voila je n'arrive pas très bien a comprendre ceci :
Imaginons un code permettant de créer un clip vide puis d'y insérer un clip présent dans la bibliotheque :
---------------------------------
EN AS2, on faisait cela :
var Y = 100;
function showClip()
{
var theClip = this.createEmptyMovieClip("theClip",1);
theClip.attachMovie("test","test",1);
theClip._y = Y;
Y += 10;
theClip._x = 100;
}
clip.onPress = function(){ // "clip" est un movie clip present sur la scene;
showClip();
}
EN AS3, on fait ceci :
var Y = 100;
function showClip(e:MouseEvent)
{
var theClip:MovieClip = new MovieClip();
theClip.name = "theClip";
---------------------------------
Je remarque une chose.
En AS2, le movieclip créé par createEmptyMovieClip est supprimé et remplacé a chaque clic sur le movieclip "clip".
Alors qu'en AS3 , une nouveau movieclip est ajouté sur la scene a chaque clic... du coup on se retrouve avec autant de movieclip que de clic sur "clip".
Donc question : Je suis obligé de détecté la présence du MovieClip précédent puis de le supprimé s'il existe ?
donc mettre au debut de la fonction "showClip" un truc du genre :
if(this.getChildByName("title"))
removeChildAt(1);
Merci pour votre aide.
-- Orange73 -- "L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
pegase31
Messages postés6138Date d'inscriptiondimanche 21 décembre 2003StatutModérateurDernière intervention 4 septembre 201312 10 mai 2009 à 10:41
Bonjour,
En AS2, il y a des "niveaux" représentés par des nombres et un seul élément peut se trouver à chaque niveau. Si au niveau X se trouve un élément que tu que ajoutes un élément à ce niveau X, l'élément précédent est tout bonnement remplacé par le nouveau.
En AS3, il s'agit d'une "pile" de DisplayObject dont chaque élément s'ajoute en haut de la pile lors d'un addChild(). Pour vérifier la présence d'un DisplayObject dans une liste d'affichage il existe une fonction DisplayObjectContainer.contains(monDisplayObject);
Seulement, pour celà, il faut que tu crées tes deux objets en dehors de ta fonction pour que leurs existence en mémoire soit toujours accessible ...
Ensuite, il faut savoir qu'une instance d'objet ou de classe ne peut pas appartenir à plusieurs listes d'affichages. Et donc que si tu fais un addChild d'un Objet sur une liste dont il fait déjà partie, tu risques d'avoir une erreur de redondance.
gremlins7
Messages postés380Date d'inscriptionmardi 29 avril 2003StatutMembreDernière intervention28 décembre 2009 10 mai 2009 à 16:54
Salut,
pour préciser un peu : en fait tu doit connaitre l'état de la liste d'objet en permanence, surtout qu'elle definit l'ordre d'affichage des clips. Lorsque l'ordre n'est jamais modifié en que tu rajoute un clip à la fin il n'y a pas de problème. Mais lorsque tu dois changer cet ordre, pour de la 3D par exemple, ça se complique un peu...
Lorsque que tu ajoute un clip dans la liste, par le biais d'une fonction ou non, il reste present tant que tu ne le supprime pas, c'est pour ça qu'a chaque fois que tu clic, un clip apparait.
Voici une procedure pour résoudre ton pb, tu recupere l'index du clip ajouté et tu le remove:
var toto:Sprite=new Sprite();
addChild(toto); //ajout
removeChildAt(getChildIndex(toto)); //suppression
Ca fonctionne mais je comprends pas pourquoi je n'ai pas besoin d'utiliser getChildByName() pour cibler "tTest" car logiquement j'aurai du faire ceci car les clip sont créé dynamiquement :
gremlins7
Messages postés380Date d'inscriptionmardi 29 avril 2003StatutMembreDernière intervention28 décembre 2009 10 mai 2009 à 17:55
Ben, c'est jsute une manière differente d'indexer, il y a rien d'autre a comprendre...après getChildByName, c'est plutot quand t'a envie de faire des boucle avec un certain nombre i de clip du style :
getChildByName("MonClip"+i).
Question : pourquoi tu fait pas directement ça :
var Y = 100;
addEventListener(MouseEvent.CLICK, showClip);
function showClip(e:MouseEvent)
{
if(theClip)
{
removeChild(theClip);
}
else
{
var theClip:MovieClip = new MovieClip();
addChild(theClip);
Orange73
Messages postés1375Date d'inscriptiondimanche 28 novembre 2004StatutMembreDernière intervention 2 août 2011 10 mai 2009 à 18:30
Car en fait des que je clic sur le bouton "clip", j'ai un movieclip qui doit etre créé mais son contenu est différent a chaque fois donc je dois supprimer ce clip a chaque clic avant de le recréer...
-- Orange73 -- "L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
gremlins7
Messages postés380Date d'inscriptionmardi 29 avril 2003StatutMembreDernière intervention28 décembre 2009 10 mai 2009 à 23:50
Oui mais, il me semble qu'imbriquer comme ça tes clips n'est pas la manière la plus pertinente de programmer en AS3. La tu ajoute un enfant à un enfant...
Perso, je crois qu'il vaut mieux faire une classe unique avec sa methode load, un truc du style:
dans l'imange clé
var clip:MonclipSpecial = new MonclipSpecial();
avec la classe as3
classe MonclipSpecial extends MovieClip
{
//constructeur de la classe
//Fonction showClip
//load un clip de la biblio
}
joecharier
Messages postés1Date d'inscriptionjeudi 2 octobre 2008StatutMembreDernière intervention17 mai 2010 17 mai 2010 à 11:43
salut, je ne suis pas sur d'avoir cerné ton probleme, si comme j'ai cru le comprendre tu veus que ton clip soit ecrasé a chque clip,tu dois faire ceci :
var Y = 100;
var theClip:MovieClip = new MovieClip();
var test:Test= new Test();
theClip.addChild(test);
this.addChild(theClip);
theClip.visible =false;
function showClip(e:MouseEvent)
{
theClip = new MovieClip();
theClip.name = "theClip";