La fonction removemovieclip() et ses difficultées

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

<hr width= "100%" size="2">

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

<hr width ="100%" size= "2">

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

<hr width="100%" size="2">

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

<hr width="100%" size="2">

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;
}

<hr width="100%" size="2">

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

<hr width ="100%" size="2">

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

</strike> // 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

<hr width="100%" size="2">

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.

Adresse d'origine

Ce document intitulé « La fonction removemovieclip() et ses difficultées » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
15 Commentaires