Actionscript 3 AS3-删除父容器中的子容器不会';t正确地重新定位儿童

Actionscript 3 AS3-删除父容器中的子容器不会';t正确地重新定位儿童,actionscript-3,grid,click,containers,Actionscript 3,Grid,Click,Containers,我制作了这个插件,它将容器的所有子对象放置在网格中。现在,我向容器中的child添加了一个clickhandler,当我单击其中一个时,它将被删除。当我移除右侧的一整行(从上到下)时,一切正常,但当我移除左侧的一整行时,容器中所有项目的位置保持不变,但容器本身将移动到x=0和y=0。我想要的是将容器中的所有子对象作为一个组移动到x:0,y:0 一些关于我得到什么和我想要什么的图片: 1)我得到的: private function clickHandler(event:MouseEvent):v

我制作了这个插件,它将容器的所有子对象放置在网格中。现在,我向容器中的child添加了一个clickhandler,当我单击其中一个时,它将被删除。当我移除右侧的一整行(从上到下)时,一切正常,但当我移除左侧的一整行时,容器中所有项目的位置保持不变,但容器本身将移动到x=0和y=0。我想要的是将容器中的所有子对象作为一个组移动到x:0,y:0

一些关于我得到什么和我想要什么的图片:

1)我得到的:

private function clickHandler(event:MouseEvent):void {


    var name:String = event.currentTarget.name;

    if(container.getChildByName(name) != null)
    container.removeChild(container.getChildByName(name));
    trace(name, "container.width: ", container.width);
    trace(name, "container.width: ", container.height);
    trace(name, "container.x: ", container.x);

    container.graphics.clear();
    container.graphics.beginFill(0x2C2C2C);
    container.graphics.drawRect(container.x ,container.y, container.width, container.height);
    container.graphics.endFill();

}
private function generateGrid(rows:int, cols:int, spacing:int):void
    {
        for (var py:int = 0; py <rows; py++)
        {
            for (var px:int = 0; px <cols; px++)
            {
                if(childs.length > 0)
                {
                    var child:* = childs.shift();

                    child.x = (child.width + spacing) * px;
                    child.y = (child.height + spacing) * py;

                } else {
                    break;
                }

            }
        }


    }

2)删除左侧整行时得到的结果:

private function clickHandler(event:MouseEvent):void {


    var name:String = event.currentTarget.name;

    if(container.getChildByName(name) != null)
    container.removeChild(container.getChildByName(name));
    trace(name, "container.width: ", container.width);
    trace(name, "container.width: ", container.height);
    trace(name, "container.x: ", container.x);

    container.graphics.clear();
    container.graphics.beginFill(0x2C2C2C);
    container.graphics.drawRect(container.x ,container.y, container.width, container.height);
    container.graphics.endFill();

}
private function generateGrid(rows:int, cols:int, spacing:int):void
    {
        for (var py:int = 0; py <rows; py++)
        {
            for (var px:int = 0; px <cols; px++)
            {
                if(childs.length > 0)
                {
                    var child:* = childs.shift();

                    child.x = (child.width + spacing) * px;
                    child.y = (child.height + spacing) * py;

                } else {
                    break;
                }

            }
        }


    }

3)我想要什么:

private function clickHandler(event:MouseEvent):void {


    var name:String = event.currentTarget.name;

    if(container.getChildByName(name) != null)
    container.removeChild(container.getChildByName(name));
    trace(name, "container.width: ", container.width);
    trace(name, "container.width: ", container.height);
    trace(name, "container.x: ", container.x);

    container.graphics.clear();
    container.graphics.beginFill(0x2C2C2C);
    container.graphics.drawRect(container.x ,container.y, container.width, container.height);
    container.graphics.endFill();

}
private function generateGrid(rows:int, cols:int, spacing:int):void
    {
        for (var py:int = 0; py <rows; py++)
        {
            for (var px:int = 0; px <cols; px++)
            {
                if(childs.length > 0)
                {
                    var child:* = childs.shift();

                    child.x = (child.width + spacing) * px;
                    child.y = (child.height + spacing) * py;

                } else {
                    break;
                }

            }
        }


    }

我使用的代码:

private function clickHandler(event:MouseEvent):void {


    var name:String = event.currentTarget.name;

    if(container.getChildByName(name) != null)
    container.removeChild(container.getChildByName(name));
    trace(name, "container.width: ", container.width);
    trace(name, "container.width: ", container.height);
    trace(name, "container.x: ", container.x);

    container.graphics.clear();
    container.graphics.beginFill(0x2C2C2C);
    container.graphics.drawRect(container.x ,container.y, container.width, container.height);
    container.graphics.endFill();

}
private function generateGrid(rows:int, cols:int, spacing:int):void
    {
        for (var py:int = 0; py <rows; py++)
        {
            for (var px:int = 0; px <cols; px++)
            {
                if(childs.length > 0)
                {
                    var child:* = childs.shift();

                    child.x = (child.width + spacing) * px;
                    child.y = (child.height + spacing) * py;

                } else {
                    break;
                }

            }
        }


    }
有人知道如何解决这个问题吗?:)

编辑:创建网格的代码:

private function clickHandler(event:MouseEvent):void {


    var name:String = event.currentTarget.name;

    if(container.getChildByName(name) != null)
    container.removeChild(container.getChildByName(name));
    trace(name, "container.width: ", container.width);
    trace(name, "container.width: ", container.height);
    trace(name, "container.x: ", container.x);

    container.graphics.clear();
    container.graphics.beginFill(0x2C2C2C);
    container.graphics.drawRect(container.x ,container.y, container.width, container.height);
    container.graphics.endFill();

}
private function generateGrid(rows:int, cols:int, spacing:int):void
    {
        for (var py:int = 0; py <rows; py++)
        {
            for (var px:int = 0; px <cols; px++)
            {
                if(childs.length > 0)
                {
                    var child:* = childs.shift();

                    child.x = (child.width + spacing) * px;
                    child.y = (child.height + spacing) * py;

                } else {
                    break;
                }

            }
        }


    }
private函数generateGrid(行:int,列:int,间距:int):void
{

对于(var py:int=0;py来说,实际上没有什么需要“修复”的,您只是没有编写任何代码来移动这些对象,因此它们没有移动。您正在根据新的宽度重新绘制容器的背景,但您没有实际移动容器内的任何对象

有很多方法可以做到这一点。想到的最简单的解决方案是这样的:
-循环遍历容器的所有子级并找到最低的x位置
-再次循环并从每个子对象的x位置中减去最低的x值

(您可能也希望对y位置执行此操作,以便在删除顶行时它们将向上移动。)

每次删除子对象时,您都会运行整个过程。如果最低位置为0,表示在最左侧位置有一个对象,则不会移动任何对象,如果有一个空行,则最低x将大于0,所有对象都将移动该值

免责声明:

最好不要把图形视图和数据结构搞得太混乱,但这是我能提供的最好的建议,不用看你的其余代码。

实际上没有什么需要“修复”,你只是没有编写任何代码来移动这些对象,所以它们不会移动。你正在重新绘制容器的背景r基于新的宽度,但实际上没有移动该容器中的任何对象

package  {

    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class Grid extends Sprite{

        private var _squ:Square;
        private var _cont:Sprite;

        public function Grid() {
            // constructor code
            _cont = new Sprite();
            addChild(_cont);
            for( var i:uint = 0;i< 20; i++){
                _squ = new Square(50,50,2,Math.random() * 0xFFFFFF);
                _cont.addChild(_squ);
                _squ.name = "square_"+i;
                _squ.x = 100 + 52 * Math.round(i%5);
                _squ.y = 50 + 52 * Math.floor(i/5);
                _squ.buttonMode = true;
            }           
            this.addEventListener(MouseEvent.CLICK, onClickAction);
        }
        public function gridAlign(cont:Sprite):void{
            for( var i:uint = 0;i< cont.numChildren; i++){                              
                _cont.getChildAt(i).x = 100 + 52 * Math.round(i%5);
                _cont.getChildAt(i).y = 50 + 52 * Math.floor(i/5);
            }
        }
        private function onClickAction(e:MouseEvent):void{
            _cont.removeChild(_cont.getChildByName(e.target.name));
            this.gridAlign(_cont);
        }
    }   
}
有很多方法可以做到这一点。想到的最简单的解决方案是这样的:
-循环遍历容器的所有子级并找到最低的x位置
-再次循环并从每个子对象的x位置中减去最低的x值

(您可能也希望对y位置执行此操作,以便在删除顶行时它们将向上移动。)

每次删除子对象时,您都会运行整个过程。如果最低位置为0,表示在最左侧位置有一个对象,则不会移动任何对象,如果有一个空行,则最低x将大于0,所有对象都将移动该值

免责声明:
最好不要把图形视图和数据结构搞得太混乱,但这是我能提供的最好的建议,而不必看代码的其余部分。

package{
package  {

    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class Grid extends Sprite{

        private var _squ:Square;
        private var _cont:Sprite;

        public function Grid() {
            // constructor code
            _cont = new Sprite();
            addChild(_cont);
            for( var i:uint = 0;i< 20; i++){
                _squ = new Square(50,50,2,Math.random() * 0xFFFFFF);
                _cont.addChild(_squ);
                _squ.name = "square_"+i;
                _squ.x = 100 + 52 * Math.round(i%5);
                _squ.y = 50 + 52 * Math.floor(i/5);
                _squ.buttonMode = true;
            }           
            this.addEventListener(MouseEvent.CLICK, onClickAction);
        }
        public function gridAlign(cont:Sprite):void{
            for( var i:uint = 0;i< cont.numChildren; i++){                              
                _cont.getChildAt(i).x = 100 + 52 * Math.round(i%5);
                _cont.getChildAt(i).y = 50 + 52 * Math.floor(i/5);
            }
        }
        private function onClickAction(e:MouseEvent):void{
            _cont.removeChild(_cont.getChildByName(e.target.name));
            this.gridAlign(_cont);
        }
    }   
}
导入flash.display.Sprite; 导入flash.events.MouseEvent; 公共类网格扩展了Sprite{ 私有变量squ:Square; 私有变量(续):Sprite; 公共功能网格(){ //构造代码 _cont=新精灵(); addChild(续); 对于(变量i:uint=0;i<20;i++){ _squ=新的平方(50,50,2,Math.random()*0xFFFFFF); _cont.addChild(_squ); _squ.name=“square_uu”+i; _squ.x=100+52*数学四舍五入(i%5); _squ.y=50+52*数学楼层(i/5); _squ.buttonMode=true; } this.addEventListener(MouseEvent.CLICK,onClickAction); } 公共函数gridAlign(续:精灵):无效{ 对于(变量i:uint=0;i
试试这个。

软件包{
导入flash.display.Sprite;
导入flash.events.MouseEvent;
公共类网格扩展了Sprite{
私有变量squ:Square;
私有变量(续):Sprite;
公共功能网格(){
//构造代码
_cont=新精灵();
addChild(续);
对于(变量i:uint=0;i<20;i++){
_squ=新的平方(50,50,2,Math.random()*0xFFFFFF);
_cont.addChild(_squ);
_squ.name=“square_uu”+i;
_squ.x=100+52*数学四舍五入(i%5);
_squ.y=50+52*数学楼层(i/5);
_squ.buttonMode=true;
}           
this.addEventListener(MouseEvent.CLICK,onClickAction);
}
公共函数gridAlign(续:精灵):无效{
对于(变量i:uint=0;i