AS3 - removeChild认为它正在工作,但是没有删除任何东西(没有错误)

时间:2015-06-21 06:55:00

标签: arrays actionscript-3 removechild

这类似于我几周前提出的问题,但不同的代码和以前的解决方案无效。

简而言之,我正在创建一个瓷砖阵列,可以通过下拉菜单选择其大小。我希望在选择新尺寸时删除先前的网格。正如您在代码中看到的那样,我已经将故障原因放在适当的位置,以确保子项存在且具有父项,并且它通过了这两个测试,但不会删除Child。

public class gridtest extends MovieClip {
    public var gridSize:Number = 225;
    public var gridBreak:Number = 15;
    public var tilesArray = new Array();
    public var tiles:MovieClip = new MovieClip();
    public var MAX_ROWS:Number = 15;
    public var MAX_COLS:Number = 15;
    public var dropDwn:MovieClip;
    //info array for the dropdown menu
    public var dropDArray:Array = new Array({label:"Select Shop Size", data:0},{label:"Size 0 - 15x15", data:225},{label:"Size 1 - 18x15", data:270},{label:"Size 2 - 18x18", data:324},
                                            {label:"Size 3 - 21x18", data:378},{label:"Size 4 - 21x21", data:441},{label:"Size 5 - 24x21", data:504},
                                            {label:"Size 6 - 24x24", data:576},{label:"Size 7 - 27x24", data:648},{label:"Size 8 - 27x27", data:729},
                                            {label:"Size 9 - 30x27", data:810},{label:"Size 10 - 30x30", data:900},{label:"Size 11 - 33x30", data:990},
                                            {label:"Size 12 - 33x33", data:1089},{label:"Size 13 - 36x33", data:1188},{label:"Size 14 - 36x36", data:1296},
                                            {label:"Size 15 - 39x36", data:1404},{label:"Size 16 - 39x39", data:1521},{label:"Size 17 - 42x39", data:1638},
                                            {label:"Size 18 - 42x42", data:1764});

    public function gridtest():void {
        //create dropdown menu based off http://www.codingcolor.com/as3/as3-drop-down-menu/
        dropDwn = new DropDown();
        dropDwn.x = 50;
        dropDwn.y = 770;
        dropDwn.init(dropDArray,150, 20,"up");
        addChild(dropDwn);
        dropDwn.addEventListener(Event.CHANGE,onDropDown);  
        }

        public function onDropDown(event:Event){
        gridSize = event.target.selectedObject.data;
        switch (gridSize){

    case 225:
    MAX_ROWS = 14;
    MAX_COLS = 14;
    break;

    case 270:
    MAX_ROWS = 17;
    MAX_COLS = 14;
    break;

    case 324:
    MAX_ROWS = 17;
    MAX_COLS = 17;
    break;

    case 378:
    MAX_ROWS = 20;
    MAX_COLS = 17;
    break;

    case 441:
    MAX_ROWS = 20;
    MAX_COLS = 20;
    break;

    case 504:
    MAX_ROWS = 23;
    MAX_COLS = 20;
    break;

    case 576:
    MAX_ROWS = 23;
    MAX_COLS = 23;
    break;

    case 648:
    MAX_ROWS = 26;
    MAX_COLS = 23;
    break;

    case 729:
    MAX_ROWS = 26;
    MAX_COLS = 26;
    break;

    case 810:
    MAX_ROWS = 29;
    MAX_COLS = 26;
    break;

    case 900:
    MAX_ROWS = 29;
    MAX_COLS = 29;
    break;

    case 990:
    MAX_ROWS = 32;
    MAX_COLS = 29;
    break;

    case 1089:
    MAX_ROWS = 32;
    MAX_COLS = 32;
    break;

    case 1188:
    MAX_ROWS = 35;
    MAX_COLS = 32;
    break;

    case 1296:
    MAX_ROWS = 35;
    MAX_COLS = 35;
    break;

    case 1404:
    MAX_ROWS = 38;
    MAX_COLS = 35;
    break;

    case 1521:
    MAX_ROWS = 38;
    MAX_COLS = 38;
    break;

    case 1638:
    MAX_ROWS = 41;
    MAX_COLS = 38;
    break;

    case 1764:
    MAX_ROWS = 41;
    MAX_COLS = 41;
    break;
    }

    var tilesArray:Array = new Array();


        //initalize the arrays
        for (var row = 0; row <= MAX_ROWS; row++)
        {
            var boolArray:Array = new Array();

            for (var col = 0; col <= MAX_COLS; col++){
                boolArray.push(false);
            }

            tilesArray.push(boolArray);
        }

        for (var row = 0; row <= MAX_ROWS; row++)
        {
            for (var col = 0; col <= MAX_COLS; col++){

                tilesArray.push(1); ;
            }
        }

        buildLevel(tilesArray);

    }

        public function buildLevel(s:Array){

            //This reports back "tiles removed", but the tiles are still on the screen...

            if(tiles != null && this.contains(tiles)){ 
                removeChild(tiles);
                trace("tiles removed");
            }

            for(var i=0; i  < MAX_ROWS + 1; i++){
                for(var o=0; o < MAX_COLS + 1; o++){
                    var currentTile:Tiles = new Tiles();
                    currentTile.x = i*15;
                    currentTile.y = o*15;
                    currentTile.name = "t"+i+"by"+o;
                    tiles.addChild(currentTile);
                    currentTile.gotoAndStop(int(s[o][i]));

                }
            }

                tiles.x = 400 - tiles.width/2;
                tiles.y = 360 - tiles.height/2;
                addChild(tiles);

        }

1 个答案:

答案 0 :(得分:2)

  

我希望在选择新尺寸时删除之前的网格。

你确实这样做了。但是您稍后会将其添加回显示列表。请参阅我在下面的代码中添加的评论:

public function buildLevel(s:Array){
    //This reports back "tiles removed", but the tiles are still on the screen...

    if(tiles != null && this.contains(tiles)){ 
        removeChild(tiles);     // <--------------------you remove tiles here                   
        trace("tiles removed");
    }

    for(var i=0; i  < MAX_ROWS + 1; i++){
        for(var o=0; o < MAX_COLS + 1; o++){
            var currentTile:Tiles = new Tiles();
            currentTile.x = i*15;
            currentTile.y = o*15;
            currentTile.name = "t"+i+"by"+o;
            tiles.addChild(currentTile);
            currentTile.gotoAndStop(int(s[o][i]));
        }
    }

    tiles.x = 400 - tiles.width/2;
    tiles.y = 360 - tiles.height/2;
    addChild(tiles);        // <--------------------but you add it again here       
}

如果删除容器,则执行此操作:删除容器。那个容器的孩子仍然是那个容器的孩子。当您再次添加容器时,将其与之前的所有子项一起添加,这也使它们再次可见。

如果您稍后将其添加回来,则删除tiles时没有任何意义。

您想删除所有的孩子,而不是删除tiles。 为此,您可以使用removeChildren()方法删除所有孩子。 但是,您可以简单地将tiles替换为新的空容器。毕竟,如果你扔掉所有孩子,重复使用单亲容器的好处可以忽略不计。

  

无法确保孩子存在且有父母,   实际上,你没有。这种情况属实的事实:

tiles != null && this.contains(tiles)

不保证这一行:

removeChild(tiles); 

将毫无问题地执行。我留给你阅读contains()的文档,看看为什么这不是故障保险。在你的情况下它可能有用,但仍然,这不会一直工作。一般来说,那些&#34; failafes&#34;通常用作&#34;修补程序&#34;来修补一些意外行为。这种意想不到的行为几乎总是由于缺乏对正在发生的事情的理解和对潜在问题的根源缺乏兴趣。

你通过询问清楚地表明了兴趣。我希望你同意这个&#34; failsafe&#34;没有保存任何东西。而不是将错误的代码行包装到故障保护中(可能不像您认为的那样安全),尝试解决潜在的问题,并找出导致问题的原因。

我希望我能提供一些见解。