2015-11-21 1 views
0

J'ai créé une liste de sprites (pour contenir des champs de texte), comment supprimer tous les sprites créés?Supprimer plusieurs sprites de l'étape AS3

créer les sprites:

for (var i:int = 0; i < optionsArray[currentChoicePart].length; i++) 
    { 
     var txt:TextField = new TextField(); 
     txt.defaultTextFormat = new TextFormat('Verdana',15,0xFFFFFF); 
     txt.text = optionsArray[currentChoicePart][i]; 
     txt.filters = [stroke]; 
     txt.autoSize = TextFieldAutoSize.LEFT; 
     txt.selectable = false; 
     txt.width = 400 
     txt.height = 25 
     var btn:Sprite = new Sprite(); 
     btn.mouseChildren = false; 
     btn.addChild(txt); 
     btn.buttonMode = true; 
     btn.x = stage.stageWidth/10 
     btn.y = stage.stageHeight/2 - 50 * (i * .5) 
     btn.name = "p" + String((Number(currentPart.substring(1)) + (i+1))) 
     stage.addChild(btn) 
     btn.addEventListener(MouseEvent.CLICK, function m(zen:MouseEvent) // when button is clicked 
     { 
      choice(zen.currentTarget.name) 

     } 
     ) 
    } 

Répondre

0

Dans un nutshel, je recommande d'enregistrer des liens vers les boutons quelque part et juste passer par la liste lorsque vous devez supprimer tous les boutons (par exemple Vector.).

Essayez ce code (s'il vous plaît, faites attention aux commentaires):

import flash.display.Sprite;

var btns: Vecteur. = nouveau vecteur.();

function init():void 
{ 
    trace("init"); 

    for (var i:int = 0; i < optionsArray[currentChoicePart].length; i++) 
    { 
     var txt:TextField = new TextField(); 
     txt.defaultTextFormat = new TextFormat('Verdana',15,0xFFFFFF); 
     txt.text = optionsArray[currentChoicePart][i]; 
     txt.filters = [stroke]; 
     txt.autoSize = TextFieldAutoSize.LEFT; 
     txt.selectable = false; 
     txt.width = 400 
     txt.height = 25 
     var btn:Sprite = new Sprite(); 
     btn.mouseChildren = false; 
     btn.addChild(txt); 
     btn.buttonMode = true; 
     btn.x = stage.stageWidth/10 
     btn.y = stage.stageHeight/2 - 50 * (i * .5) 
     btn.name = "p" + String((Number(currentPart.substring(1)) + (i+1))) 
     stage.addChild(btn) 
     btn.addEventListener(
      MouseEvent.CLICK, 
      function m(zen:MouseEvent) // when button is clicked 
      { 
       choice(zen.currentTarget.name); 
      } 
     ) 

     // Each button is put in the list, 
     // to be able to work with the button after 
     btns.push(btn); 
    } 

    trace(btns.length); 
} 

function reset():void 
{ 
    trace("reset"); 

    var tempBtn:Sprite; 
    var btnsCount:int = btns.length; 
    // We just go through the list and remove all buttons from theirs parents 
    for(var btnIndex:int = 0; btnIndex < btnsCount; btnIndex++) 
    { 
     tempBtn = btns[btnIndex]; 
     tempBtn.parent.removeChild(tempBtn); 
    } 

    btns = new Vector.<Sprite>(); 
} 

init(); 
setTimeout(reset, 3000); 

Aussi, je l'ai testé le code ci-dessus avec des lignes où je ne commentaires ai pas des variables telles que optionsArray, accident vasculaire cérébral, E.T.C.

+0

Je reçois cette erreur: TypeError: Erreur # 1009: Impossible d'accéder à une propriété ou méthode d'une référence d'objet nul. \t à Main/createOptions() [C: \ Utilisateurs \ badfitz66 \ Documents \ Projets \ Texte aventure \ src \ Main.as: 142] \t à Main/onEnter() [C: \ Utilisateurs \ badfitz66 \ Documents \ Projets \ Text adventure \ src \ Main.as: 92] – Badfitz66

+0

@ Badfitz66 On dirait que vous avez un énorme code. Ce serait génial si vous montriez à l'autre partie de votre code le contrôle du problème. –

+0

ligne 157 est juste cette ligne: btns.push (btn), tout mon code peut être vu ici: http://pastebin.com/XJP9dGL1 – Badfitz66

1

L'approche entière est tout faux et votre code tel qu'il est écrit ne fait que produire plus de maux de tête qu'il ne le devrait vraiment. Vous avez seulement besoin d'un moyen spécial pour supprimer ces boutons parce que vous créez cette situation pour vous-même. En réalité, un code plus simple et plus efficace serait d'avoir le bouton situé dans un sprite spécifique puis retirez simplement tous les boutons de cette sprite comme:

var buttonHolder:Sprite = new Sprite(); 
stage.addChild(buttonHolder); 

//for loop 
for (var i:int = 0; i < optionsArray[currentChoicePart].length; i++) 
//etc ... 
buttonHolder.addChild(btn); 
//here the button is added to his specific holder 

Aucun bouton suppression devient très facile

buttonHolder.removeChildren(); 

Ajouter tout à la scène directement est un indice d'inexpérience pour un codeur. Rien ne devrait vraiment être ajouté à la scène. Au lieu de votre classe de document, vous devez ajouter plus de couches (Sprite) et ajouter à ces couches en fonction de vos besoins. Vous vous retrouvez avec une liste d'affichage très facile à gérer et un ensemble de couches. Ajouter à la scène rendra toujours votre travail et votre logique plus difficiles et plein de maux de tête sur la route.

EDIT:

Looping à travers une liste d'affichage ou un tableau afin de supprimer ou d'ajouter de celui-ci n'est pas recommandé car il est délicat et peut facilement produire erreur. Si vous ajoutez ou supprimez alors le nombre de changements d'éléments et la boucle qui repose sur ce nombre pourrait aboutir à des résultats bizarres. Si vous supprimez alors la boucle se terminera trop tôt manquant un élément à supprimer. Au lieu de cela, cela est généralement fait avec une boucle while pour éviter ce problème.

while(buttonHolder.numChildren) 
{ 
    buttonHolder.removeChildAt(0); 
} 

également la méthode removeChildren doit être appelé comme celui-ci

removeChildren(); 

pas comme ça:

removeChildren;//missing() 
+0

Cela fonctionne, mais il supprime seulement 2/3 des enfants. \t \t \t for (var i2: int = 0; i2 Badfitz66

+0

je vous ai donné l'exemple de méthode removeChildren(), pourquoi ne pas vouloir utiliser celui-là? Vous ne pouvez pas parcourir la liste d'affichage en utilisant numChildren pour supprimer les enfants car chaque fois que vous en supprimez une, la valeur numChildren change, c'est pourquoi utilisez while while plutôt que while (numChildren) {removeChildAt (0)} – BotMaster

+0

Supprimer les enfants isn ' Une chose cependant? Il me donne juste une erreur de méthode non définie ou quelque chose comme ça – Badfitz66