从阶段AS3中删除多个精灵

时间:2015-11-21 16:20:12

标签: actionscript-3 flashdevelop

我创建了一个精灵列表(用于保存文本字段),如何删除所有创建的精灵?

创建精灵:

    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)

        } 
        )
    }

2 个答案:

答案 0 :(得分:1)

整个方法都是错误的,你的代码编写方式只会给你带来比实际应该更多的麻烦。您只需要一种特殊的方法来删除这些按钮,因为您自己创建了这种情况。实际上,更简单,更有效的代码是将按钮设置在特定的精灵中,然后简单地删除该精灵中的所有按钮,如:

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

没有删除按钮变得非常容易

buttonHolder.removeChildren();

直接将所有内容添加到舞台上是编码员缺乏经验的线索。什么都不应该被添加到舞台上。您应该添加更多图层(Sprite),然后根据需要添加到这些图层,而不是文档类。最终得到一个非常容易管理的显示列表和一组图层。加入舞台将使你的工作和逻辑变得更加困难,并且充满了令人头疼的问题。

编辑:

不建议通过显示列表或数组循环以删除或添加它,因为它很棘手并且很容易产生错误。如果添加或删除元素更改的数量,依赖于该数字的循环可能会产生奇怪的结果。如果你删除那么循环将很快终止缺少一些要删除的元素。相反,通常使用while循环来避免此问题。

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

此外,必须像这样调用removeChildren方法

removeChildren();

不喜欢这样:

removeChildren;//missing ()

答案 1 :(得分:0)

在一个地狱中,我建议保存某个地方按钮的链接(例如Vector。),当你需要删除所有按钮时,只需浏览列表。

试试这段代码(请注意评论):

import flash.display.Sprite;

var btns:Vector。 = new Vector。();

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

另外,我用注释行测试了上面的代码,其中我没有变量,例如optionsArray,stroke,e.t.c。