PDA

Просмотр полной версии : Правильное размещение нескольких объектов произвольной формы в цикле


Universe
06.03.2011, 21:15
Добрый вечер. Возникла небольшая проблема. Никак не могу сообразить, как в цикле разместить несколько объектов произвольной формы.
Если размер объектов одинаковый - то всё понятно - просто записываю след. образом:
obj.x = obj.width * i
Но если объекты начинают изменяться в размере, получается неправильное позиционирование.
Пробовал решить это через создание доп. переменной previousWidth.
for(var i:uint; i< 4; i++)
{
obj_mc = new Obj();
if(align == "left")
{
obj_mc.width = Math.random() * obj_mc.width/2 + obj_mc.width/2;
//obj_mc.height = Math.random() * obj_mc.height/2 + obj_mc.height/2;

obj_mc.x = (previousWidth + 5) * columnNum;
obj_mc.y = (previousHeight + 5) * rowNum;

if(obj_mc.x < bg_mc.width - obj_mc.width*2)
{
columnNum ++;
}
else
{
columnNum = 0;
rowNum++;
}
trace(obj_mc.x);
trace("previousWidth " + previousWidth);
addChild(obj_mc);
previousWidth += obj_mc.width;
previousHeight += obj_mc.height;

Но не помогло. Знаю что простая вещь, но что-то затупил на этом. Помогите плиз!

Bgg
06.03.2011, 21:21
Если есть возможность, то складывайте объекты в контейнер, и перед добавлением нового узнавайте ширину контейнера.

obj.x = container.width;//если начало координат у obj находится слева.
container.addChild(obj);

Universe
06.03.2011, 23:34
а что если нужна не одна, а несколько линий. Идея в следующем: есть ряд геометрических объектов, которые создаются по параметрам из xml. Т.е. объекты всегда могут быть разными и в разном кол-ве. Они при создании должны помещаться в контейнер, в котором соответственно правильно расставляться, не налезать на друг друга. Если места для объекта не хватает - перескакивать на новую строку и т.д.

Bgg
07.03.2011, 00:03
Не понял о каких линиях идет речь. Код покажите, или скажите что делаете конкретно.

kseniya
07.03.2011, 00:59
похоже что автора затронула тема заполнение вещей разной площади в инвентаре
пока всё что приходит в голову это
var bigWidth = 0;
var bigHeight = 0;
var allHeight = 0;
for (var i:uint; i< 50; i++) {
var obj_mc = new Obj();
obj_mc.width = Math.random() * obj_mc.width / 2 + obj_mc.width / 2;
obj_mc.height = Math.random() * obj_mc.height / 2 + obj_mc.height / 2;
if (bigWidth + obj_mc.width < bg_mc.width) {
obj_mc.x = bigWidth;
obj_mc.y = allHeight;
if(bigHeight<obj_mc.height){
bigHeight = obj_mc.height;
}
bigWidth += obj_mc.width;
}else{
allHeight += bigHeight;
obj_mc.x = 0;
obj_mc.y = allHeight;
bigWidth = obj_mc.width;
bigHeight = obj_mc.height;
}
addChild(obj_mc);
}
а вобще вот что гугл подсказал http://www.blackpawn.com/texts/lightmaps/default.html

Aloran
07.03.2011, 02:48
Недавно на работе решали подобную задачу:
- Условно разбили контейнер на ячейки (чем мельче ячейки тем мельче зазоры между объектами)
- для каждого объекта добавленного в контейнер определяем занятые им ячейки и помечаем их как занятые
- перед добавлением объекта ищем первую свободную ячейку, и исходя из размеров объекта расчитываем какую область он должен занять, бежим по ячейкам данной области и смотрим есть ли хоть одна несвободная, если нет то ок помещаем туда объект, иначе ищем следующую свободную и снова расчет...

Думаю алгоритм понятен.