0

このプラグインは、コンテナのすべての子オブジェクトをグリッド構成に配置するように作成しました。ここで、コンテナ内の子にクリックハンドラを追加しました。子の1つをクリックすると、その子は削除されます。右側の全列(上から下)を削除すると、すべてうまくいきますが、左側の全列を削除すると、コンテナ内のすべてのアイテムの位置はそのままになりますが、コンテナ自体はx=0およびy=0に移動されます。必要なのは、コンテナ内のすべての子が1つのグループとして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 に答える