MovieClip dupliqué !

Résolu
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011 - 10 mai 2009 à 09:46
joecharier Messages postés 1 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 17 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";
   
    var test:Test= new Test();
    test.name = "test";
   
    theClip.addChild(test);
    this.addChild(theClip);

    theClip.y = Y;
    Y += 10;
    theClip.x = 100;
}

clip.addEventListener(MouseEvent.CLICK, showClip);

---------------------------------
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)

9 réponses

pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
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.

Peg'
3
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 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
3
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
10 mai 2009 à 16:45
Hello Peg',

Merci pour ta réponse.

Donc si je fais un addChildAt(myDisplayObject, 1);

puis je refais un autre addChildAt(); avec le meme niveau ... l'objet precedent descendra automatiquement d'un niveau ?

Il faut donc que je supprime l'ancien displayobject avant de créer le nouveau ?

-- Orange73 --
"L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
0
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
10 mai 2009 à 17:20
merci pour ta réponse.

j'ai testé cela :

var Y = 100;

var theClip:MovieClip = new MovieClip();
theClip.name = "theClip";
this.addChild(theClip);
   
function showClip(e:MouseEvent)
{  
    if(theClip.tTest)
        theClip.removeChild(tTest);
  
    var tTest:Test= new Test();
    tTest.name = "test";
  
    theClip.addChild(tTest);

    theClip.y = Y;
    Y += 10;
    theClip.x = 100;
}

clip.addEventListener(MouseEvent.CLICK, showClip);

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 :

if(getChildByName("theClip").getChildByName("test"))

        getChildByName("theClip").removeChild(getChildByName("theClip").getChildByName("test"));

-- Orange73 --
"L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 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);
  
       theClip.addChild(theClip);

       theClip.y = Y;
       Y += 10;
       theClip.x = 100;
   }
}
0
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
10 mai 2009 à 18:00
Pardon, c'est  pas theClip.addChild(theClip); mais simplement addChild(theClip);
(3 lignes en partant de la fin)
0
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Derniè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)
0
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 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
}
0
joecharier Messages postés 1 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 17 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";

test= new Test();
test.name = "test";

theClip.visible =true;

theClip.y = Y;
Y += 10;
theClip.x = 100;
}

clip.addEventListener(MouseEvent.CLICK, showClip);

J'espere t'avoir aidé et ne pas etre hors sujet, sinon désolé
0
Rejoignez-nous