1

谁能帮我一个简单的网格制作算法,满足以下要求:

  • 我有可变宽度但高度相同的矩形框
  • 我想用 n 个框形成一个 2 行的网格
  • 框应在水平和垂直方向上彼此间隔 10 px

谢谢 :)

编辑:哇...在阅读了第一个回复后...我想我会尝试对我的帖子进行更具体的说明。

  • 我不想要整个代码...我只需要一个 2-3 行算法就可以了。

我试过的是这样的

boxList 是一个包含所有盒子的数组...

for (var i:int = 0; i < boxList.length; i++)
{
    var b:Box = new Box(boxList[i]);
    this.addChild(b);

    b.y = 5 + (i % 2) * (b.height + 10);
    b.x = 10 + int(i / 2) * (b.width + 5);
}

但是这个只有在盒子的宽度相同的情况下才有效......在我的情况下宽度不同......那么怎么做????

4

2 回答 2

1

您知道舞台的宽度,以及要添加的每个框的宽度。

简单有一个变量来跟踪当前的水平限制。

即,一些伪代码:

lastX=0
for(box in boxes)
    if(lastX + box[i].width > width)
        lastX = box[i].width
        add box to next row, with x = 0
    else
        add box at lastX
        lastX += box[i].width
于 2013-11-11T06:51:10.673 回答
1

这可能取决于您希望如何完成的其他一些细节。例如,您是否希望两行尽可能接近相同的宽度?您是否希望每行有相同数量的框,当有奇数时,可能在其中一行上增加一个?等等。

按照您的代码,您似乎正试图在每行上获得偶数个框。重要的是,如果您从左到右平铺,将始终取您刚刚放在该行上的最后一个框,将其 x 属性和 width 属性加在一起(为您提供其右边缘的位置),然后只需加10。

因此,从您的原始代码开始工作,也许这样的事情会起作用:

var bLast1:Box; // added
var bLast2:Box; // added

for (var i:int = 0; i < boxList.length; i++)
{
    var b:Box = new Box(boxList[i]);
    this.addChild(b);

    b.y = 5 + (i % 2) * (b.height + 10);
    if (i % 2 == 0) // is this the first row?
    {
        b.x = bLast1 ? bLast1.x + bLast1.width + 10 : 10;
        bLast1 = b;
    }
    else
    {
        b.x = bLast2 ? bLast2.x + bLast2.width + 10 : 10;
        bLast2 = b;
    }
}

同样,您可能需要就您希望如何完成平铺做出更多决定。

于 2013-11-11T07:21:06.627 回答