0

我制作了这个插件,它将容器的所有子对象以网格形式定位。现在我为容器中的子元素添加了一个点击处理程序,当我单击其中一个时,它被删除了。当我在右侧删除一整行(从上到下)时,一切顺利,但是当我在左侧删除一整行时,容器中所有项目的位置都保持在原位,但容器本身将被移动到 x = 0 和 y = 0。我想要的是容器中的所有孩子都被移动到 x:0, y:0 作为一组。

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

1)我得到什么:

我在启动时有什么

2)当我删除左侧的一整行时得到什么:

当我删除左侧的一整行时得到什么

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

            }
        }


    }
4

2 回答 2

2

没有什么需要“修复”的,你只是没有编写任何代码来移动这些对象,所以它们没有移动。您正在根据新宽度重绘容器的背景,但实际上并未移动该容器内的任何对象。

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

(您可能也想对 y 位置执行此操作,因此当您移除第一行时它们会向上移动。)

每次删除孩子时,您都将运行整个过程。如果最低位置为 0,表示最左边的位置有一个物体,那么什么都不会移动,如果有一个空白行,则最低 x 将大于 0,所有东西都会移动那个量。

免责声明:
不要将图形视图与数据结构混为一谈可能会“更好”,但这是我可以提供的最佳建议,而无需查看您的其余代码。

于 2012-10-04T00:45:05.477 回答
1
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);
        }
    }   
}

试试这个。

于 2012-10-04T07:29:59.870 回答