begin process at 2010 03 14 17:33:13
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Astuces

 > LA FONCTION REMOVEMOVIECLIP() ET SES DIFFICULTÉES

LA FONCTION REMOVEMOVIECLIP() ET SES DIFFICULTÉES


 Information sur le tutoriel

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10


 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.

 Historique

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.

Commentaires

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

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

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.

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

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

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é ++

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

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.

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

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.

Commentaire de paoloadv le 16/03/2009 13:16:26

J'ai remarqué que le bug avec removeMovieClip() ou unloadMovie() arrivait lorsque je n'attendais pas la fin de son déchargement avant de passer à la suite !
C'est pour cela que je n'utilise plus removeMovieClip() mais unloadMovie(), avec l'évènement onUnload, qui me permet de passer à la suite dès que la suppression est effective.
Cela dit, il y a toujours un problème assez mystérieux que je rencontre lorsque je gère une liste de clips dynamiques à afficher, suivant les mises à jours de la liste :
En appliquant la méthode de suppression avec unloadMovie()/onUnload sur la liste de clips, très curieusement le derniers de la liste n'est pas bien supprimé !!
Sans comprendre pourquoi, j'ai tout simplement alors ajouté un clip bidon, qui ne contient rien du tout, en fin de liste des clips à gérer, pour que l'évènement onUnload soit placé sur ce dernier clip bidon, afin que tous les autres soient bien supprimés avant d'attendre le clip bidon (qui, étant vide, ne pose pas de problème en restant affiché !).
Ainsi, j'arrive, en d'une part ajoutant un clip vide bidon en fin de liste de mes clips à gérer, et d'autre par en utilisant la méthode unloadMovie() sur tout les clips de la liste, puis un onUnload sur le dernier (le clip bidon), j'arrive donc à bien suppimer toute ma liste de clips, et afficher la nouvelle liste proprement !

Dur dur, avec Flash Mx 2004 en AS2!! J'espère que ces difficultés sont résolues en AS3...
Au fait, tout le code sur lequel je travaille étant codé en AS2 avec MX 2004, quelqu'un sait-il s'il existe une solution pour convertir quasi-systématiquement du AS2 en AS3 ?

Commentaire de Slagt le 16/03/2009 19:58:10

Non, il faut tout faire à la main.

 Ajouter un commentaire




Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,078 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales