2017-01-01 3 views
2

J'ai une scène incluant tous les MovieClips, les Sprites, les graphiques que j'apporte certains d'entre eux sur la scène en utilisant addChild (...).Comment supprimer tous les MovieClips, Sprites et graphiques d'une scène dans AS3?

Je veux tous les supprimer parce que je peux toujours les voir quand je vais dans d'autres scènes.

J'ai utilisé ci-dessous le code mais il me montre l'erreur mentionnée ci-dessous:

btn.addEventListener(MouseEvent.CLICK,removing); 

function removing(e:MouseEvent):void 
{ 
    while (stage.numChildren > 0) 
    { 
    stage.removeChildAt(0); 
    } 

} 

Erreur:

TypeError: Erreur # 1009: Impossible d'accéder à une propriété ou une méthode d'une référence d'objet nul. à Show_fla :: MainTimeline/suppression()

Merci d'avance pour votre temps et aide!

Répondre

2

Comme il montre, il ne fonctionne pas avec en boucle et il travaille avec boucle |:

btn.addEventListener(MouseEvent.CLICK,removing); 

function removing(e:MouseEvent):void 
{ 
var i:int = 0; 
for (i=stage.numChildren-1; i>=0; i--) 
{ 
    stage.removeChildAt(i); 
} 
} 
1

Le DiaplayObject.stage de propriété est définie seulement pendant la durée DisplayObject donné est réellement attaché à l'étape. Dès que vous supprimez le Sprite/MovieClip qui contient le code de suppression, son .stage devient null et la condition suivante check stage.numChildren échoue naturellement. Vous devriez garder une référence à l'étape dans une variable locale.

btn.addEventListener(MouseEvent.CLICK,removing); 

function removing(e:MouseEvent):void 
{ 
    var aStage:Stage = stage; 

    while (aStage.numChildren > 0) 
    { 
    aStage.removeChildAt(0); 
    } 
} 
+0

Cela permet d'éviter l'erreur, mais retirer le [objet MainTimeline] aussi. Il n'y a donc plus d'enfants après la première boucle. @Organis – tatactic

1

Si vous ajoutez une trace de l'objet que vous retirez, vous verrez que vous retirez le [MainTimeline objet], vous ne même pas besoin d'une boucle.

Dans votre code Vous supprimez l '[objet MainTimeline] et tous les clips sont supprimés. Dans la boucle while, une erreur n'est pas détectée dans la boucle for.

function removing(e:MouseEvent):void { 
    var i:int = 0; 
    for (i=stage.numChildren-1; i>=0; i--) 
    { 
     trace("removing : " + (stage.getChildAt(i))); 
     stage.removeChildAt(i); 
    } 
} 

Sortie:

removing : [object MainTimeline] 

Alors, vous supprimer l'objet [objet MainTimeline] et ont plus d'enfants à enlever.

function removing(e:MouseEvent):void { 
    trace("removing : " + (stage.getChildAt(0))); 
    stage.removeChildAt(0); 
} 

va probablement vous donner la même sortie:

removing : [object MainTimeline] 

Donc, vous ne même pas besoin d'une boucle si l'on retire [MainTimeline objet].

Je ne l'ai pas testé dans les mêmes conditions, alors dites-nous si vous avez la même sortie.

Je vous suggère de vérifier la réponse de @LukeVanIn qui explique la difference between stage, root and main timeline

[EDIT]

function removingWhile(e:MouseEvent):void { 
    while (stage.numChildren > 0){ 
    count++; 
    trace("removing : " + (stage.getChildAt(0))); 
    trace ("number of iterations = " + (count++).toString()) 
    stage.removeChildAt(0); 
    } 
} 

sortie Will:

suppression: [objet MainTimeline] nombre d'itérations = 1

TypeError: Erreur # 1009 ... à Untitled_fla :: MainTimeline/removingWhile()

[/ EDIT]

+0

@Maziar Je voudrais vraiment savoir ce que le panneau de sortie va sortir dans votre cas. Je me trompe probablement, mais c'est toujours bon de tester le code avec une fonction trace() ou d'essayer ... des blocs catch. – tatactic