begin process at 2008 05 17 13:36:28
1 174 053 membres
172 nouveaux aujourd'hui
13 974 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LA FONCTION REMOVEMOVIECLIP() ET SES DIFFICULTÉES


Information sur le tutorial

Catégorie :Astuces Date de création : 28/05/2006 22:53:36 Vu : 8 356 fois

Note :
8,8 / 10 - par 5 personnes
8,80 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note


Description

On peut rencontrer un certains nombre de problèmes avec la fonction removeMovieClip(), et difficile de trouver la raison, voici un bilan de ses difficultées.

Tutorial

Sommaire
         *Introduction
         *L'origine des problèmes
         *Les limites du removeMovieClip()
                 **Limite inferieur
                 **Limite superieur
         *Conclusion



* Introduction
    Malgré sa simplicité, la fonction removeMovieClip() peut-être une source d'ennuie pendant plusieurs heures pour les plus courageux, sinon un obstacles infranchissable. Mais pourquoi cette fonction ne fonctionne t'elle pas parfois ? Quelle logique y a-t-il là dedans ? Après ce petit tutorial, qui est plus une astuce à savoir, vous pourrez répondre à ces questions, et contourner le problème.

*L'origine des problèmes
    Parlons peu, parlons bien. Si parfois, cette fonction, ne fonctionne pas, c'est à cause de la profondeur du clip. Il y a des limites à respecter, mais elles sont, heureusement contournable.

*Les limites du removeMovieClip()
    **Limite inferieur
         
En général, les limites inferieurs sont connus. C'est simple, il faut avoir une profondeur de clip superieur ou égale à zéro.
Les clips placés directement sur la scène ont une profondeur de -16384 (214) pour la scène elle même, puis de plus en plus élévée. On peut retrouver cette valeur avec le code suivant (à mettre sur la scène principale) :


trace (this.getDepth());      // Fenêtre de sortie : -16384



Le premier clip placé sur la scène aura donc une profondeur de -16383, puis -16382, et ainsi de suite. C'est pourquoi la fonction removeMovieClip() ne fonctionne pas avec les clips placé manuellement. Cela dit, il existe heureusement une méthode pour supprimer ces casse-pieds, voici un exemple de code associé à la fonction pour supprimer n'importe quel clip (sans gêner le déroulement normale de l'animation) :


removeThisMovieClip (monClip);

functionremoveThisMovieClip (clip:MovieClip):Boolean
{
    
// On sauvegarde dans une variable le clip situé à la profondeur 0
    var c:MovieClip = clip._parent.getMovieClipAtDepth (0);
    
    // On passe le clip à supprimer à la profondeur 0, et on le supprime
    clip.swapDepths (0);
    removeMovieClip (clip);
    
    // On remet le clip qui était en profondeur 0, à sa place
    c.swapDepths (0);
    
    // On retourne "true" si le clip a été correctement supprimé, "false" sinon (on sait jamais)
    if (clip != undefined)
        returnfalse;
    else
        returntrue;
}



    **Limite superieur
         
Cette limite est cependant très mal connue. En effet, il ne suffit pas d'avoir un clip avec une profondeur positive pour que celui-ci puisse être supprimé en toute simplicité. Il faut en plus de cela, que sa profondeur soit strictement inferieur à 1048576 (220
). On peut retrouver cette valeur avec le code suivant (à mettre sur la scène principale) :


this.createEmptyMovieClip ("test", this.getNextHighestDepth());
trace (this.test.getDepth());      // Fenêtre de sortie : 1048576

// Un problème : les tests donne une profondeur de "0". Bizzarement, de temps en temps, mais assez rarement, j'arrive à obtenir la valeur précédente de 1048576.
this.createEmptyMovieClip ("test", this.getNextHighestDepth());
trace (this.test.getDepth());      // Fenêtre de sortie : 0, parfois 1048576



La fonction écrite précédement fonctionne aussi ici.

 *Conclusion
    Connaître les raisons de ces conditions (et pourquoi ces limites de 214 et 220)est une autre histoire. Pour la limite inferieur, on peut penser que lesystème réserve ces profondeurs aux clips posé directement sur la scène(ça en fait beaucoup). Cela dit, même en posant 16384 clips sur la scène (copié collé 14 fois), ça ne pose pas de problèmes. Je n'ai pas pu tester la profondeur du dernier clip posé (peut-être a-t-il remplacé le premier posé), mon ordinateur luttait déjà pour coller les 8192 derniers clips, alors ne serait-ce qui cliquer à côté pour les déselectionner, c'était interminable. Pour la limite superieur par contre, je ne vois aucune raison. Il faudrait savoir comment est construite la fonction. Dans tous les cas, j'éspère que ce tutorial vous aura donné la réponse à un problème qui m'a demandé beaucoup de temps à solutionner, étant donné qu'il n'y a rien de très logique dans ces limites (sauf la première peut-être). Bonne chance à vous, et bon code.

07 juin 2006 12:47:23 :
- Ajout du mot "strictement" qui indique qu'une profondeur de 2^20 n'est pas inclut dans les profondeurs supprimable. (précision) - Correction du test pour la limite superieur. Il semblerait que getNextHighestDepth() ne soit pas non plus très logique. Parfois il donne 1048576 et très souvent il donne 0. (correction)
17 août 2007 21:08:14 :
La fonction a été mise à jour, pour retourner un booléen, et pour remettre le clip qui était en profondeur 0, à sa place.
  • signaler à un administrateur
    Commentaire de erlau69 le 02/06/2006 10:46:55

    Bonjour,

    Lorsque je vérifie, plusieurs problèmes.
    a)
    this.createEmptyMovieClip ("test", this.getNextHighestDepth());
    trace (this.test.getDepth());      // Fenêtre de sortie : 0

    b)
    surtout il apparaît que la valeur max doit être inférieure à
    1048576 (donc au plus égale à 1048575, sinon le clip ne peut plus être effacée.

    En tous les cas, merci pout le tut, il m'a permis d'y voir plus clair
    Roland Cire

  • signaler à un administrateur
    Commentaire de _benjy le 03/06/2006 17:26:42

    removeMovieClip fonctionne tres bien ... et quelque soit le niveau du clip !
    1/ removeMovieClip n'est que pour les clip créer dynamiquement (duplicateMovieClip, attachMovie, ...)
    et dans ce cas pour ne pas avoir de prob avec il suffit de passer par une variable :
    var clip:MovieClip = this.moOccurenceDeClip;
    clip.removeMovieClip();
    j'utilise cette méthode en permance et ss jamais le moindre prob (bon faut passé par une var temporaire mais c tout)
    2/ pour les clip fait a la mimine dans l'IDE Flash, il faut utiliser unloadMovie();
    idem passer par une varr temporaire peux evité que le unload ne se fasse pas
    ++
    _benjy

  • signaler à un administrateur
    Commentaire de Slagt le 07/06/2006 12:38:58

    ERLAU69 >> En effet, je viens de refaire le test, et effectivement je retrouve une profondeur de 0. Pourtant, j'avais bel et bien trouvé 1048576 lors de la réalisation du tutorial. Alors pourquoi cette différence ? De plus, un petit test montre qu'un clip avec une profondeur superieur ne peux effectivement pas être supprimé. Et je ne me suis pas amusé à tester pour chaque profondeur jusqu'à trouver la mauvaise... bizzare.

    _BENJY >> Fais quelques test pour te prouver le contraire :
    var c = this.createEmptyMovieClip ("test", Math.pow(2, 20) - 1);
    removeMovieClip (c);
    trace (test); // Fenêtre de sortie : undefined

    Alors que le test suivant renvoie une valeur bien différente :
    var c = this.createEmptyMovieClip ("test", Math.pow(2, 20));
    removeMovieClip (c);
    trace (test); // Fenêtre de sortie : _level0.test

    Je me sers à peu près tout le temps d'un pointeur pour travailler avec mes clips. Et j'ai quand même des problèmes de suppression.

  • signaler à un administrateur
    Commentaire de _benjy le 07/06/2006 12:59:17

    Oki en effet méacoulpa, j'avais pas vu ton truc de limite supp...
    Faut dire, t'as interret a en vouloir pour placer dynamiquement 1 million de clip (1048575) dans un clip. a moi que tu ne bosses que avec ta racine (_root).
    Enfin l'info peu etre utile a savoir, mais c vrai que perso, depuis le temps que j'utilise flash, j'avais jamais vu ce genre de prob, mais on voilà j'ai pas 1 milion de clip dans un clip (car pas oublier que chaque clip posede toute la plage de niveau que tu viens d'illustré disponible)...
    Allé un p'tit 8, car c'est bien vu et peux toujours servir, puis boen t'as taffé pour bien présenté ton truc, donc cool ;)
    @++ et bonne continuation
    _Benjy

  • signaler à un administrateur
    Commentaire de Slagt le 07/06/2006 16:50:24

    Merci beaucoup.

    En effet on a rarement plus d'un million de clip dans un même clip. Mais, il arrive que la profondeur dépasse ce seuil sans pour autant avoir le même nombre de clip.

    Par exemple, j'avais fait un programme simple où des petites boules apparaissaient aléatoirement sur l'écran, puis éclataient et disparaissaient. Sur la scène il n'y avait en même temps qu'une centaine de boule pas plus. Mais au bout d'un moment, à force d'incrémenter la valeur de la profondeur, j'arrivais à plus d'un million (à raison de 25 nouvelles boules par frame, j'en avait pour 10 minutes pas plus). Et une fois à 1048575, foutu, les boules ne disparaissent plus. Et là : cata ! Ca rame à mort, et le temps de s'en rendre compte, le navigateur ou le player à planter. Bon, le plus simple est tout de même de faire un modulo 1000 (par ex) sur la valeur de profondeur, mais c'est toujours intéressant de savoir pourquoi ;).

  • signaler à un administrateur
    Commentaire de _benjy le 07/06/2006 17:26:43

    ouaip ou suffit de reinitialiser ton niveau de duplication lorsque t'es as 100000 par exmple (car 100000 bulles sur l'ecran, tu fait explosé un petit pc avec LOL)
    Allé ++

  • signaler à un administrateur
    Commentaire de dpaolo3 le 23/08/2006 21:49:37

    merci pour le tuto ..
    ---------------
    (même en posant 16384 clips sur la scène)

    le flash player lui meme est limité par 16000  symboles (incluant movieClips,buttons et grafic)..
    tu peut inclure plus de cette limite dans ton travail et flash ne va pas vous dire que son player est limité et tu peux exporter ...
    mais dans le flash player tu ne va plus voir que les premiers 16000 symboles créés dans ton travail .

    merci bcp

  • signaler à un administrateur
    Commentaire de scara 51 le 11/09/2006 14:22:45

    3 SOLUTIONS pour éviter les bugs de profondeur.

    Premier élément : monClip.swapDepths(nouvelle_Profondeur) fonctionne quelque soit la valeur de l'ancienne profondeur de monClip pour faire ensuite monClip.removeMovieClip() en donnant une profondeur valide et vide.

    Deuxième élément : éviter de créer des clips directement dans _root avec AS.

    Troisième élément : les composants de Flash créent une merde pas possible pour la profondeur. Si vous utilisez les composants intégrés de Flash, vous pouvez résoudre ces bugs avec ces 2 lignes :
         removeMovieClip(_root.getInstanceAtDepth(1048575));
         removeMovieClip(_root.getInstanceAtDepth(1048574));
    Il est aussi possible d'utiliser la classe DepthManager pour la gestion des profondeurs. Mais perso je trouve ça plutot galère et ça alourdi inutilement l'anim.



    Si vous avez d'autres infos, n'hésitez pas.

  • signaler à un administrateur
    Commentaire de Thienou le 01/01/2007 14:31:27

    Merci pour l'explication, j'ai cherché pendant un moment comment cette fonction marchait.

    Enfaite il me manquait la fonction "clip.swapDepths (0);"

  • signaler à un administrateur
    Commentaire de dimebagplan le 15/08/2007 20:02:38

    Hello !
    Très bon tuto !
    En effet tu as raison, j'étais en train de me prendre la tête avec un clip qui voulais pas s'enlever !!!!
    En effet sa profondeur étais négative.
    j'ai donc fais un clip.swapDepths(0);
    et le tour étais jouer !
    Merci encore.

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS