Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.03.2011, 21:15
Universe вне форума Посмотреть профиль Отправить личное сообщение для Universe Найти все сообщения от Universe
  № 1  
Ответить с цитированием
Universe
 
Аватар для Universe

Регистрация: Feb 2010
Сообщений: 811
Отправить сообщение для Universe с помощью ICQ Отправить сообщение для Universe с помощью Skype™
Arrow Правильное размещение нескольких объектов произвольной формы в цикле

Добрый вечер. Возникла небольшая проблема. Никак не могу сообразить, как в цикле разместить несколько объектов произвольной формы.
Если размер объектов одинаковый - то всё понятно - просто записываю след. образом:
Код AS3:
obj.x = obj.width * i
Но если объекты начинают изменяться в размере, получается неправильное позиционирование.
Пробовал решить это через создание доп. переменной previousWidth.
Код AS3:
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;
Но не помогло. Знаю что простая вещь, но что-то затупил на этом. Помогите плиз!

Старый 06.03.2011, 21:21
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 2  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Если есть возможность, то складывайте объекты в контейнер, и перед добавлением нового узнавайте ширину контейнера.
Код AS3:
obj.x = container.width;//если начало координат у obj находится слева.
container.addChild(obj);

Старый 06.03.2011, 23:34
Universe вне форума Посмотреть профиль Отправить личное сообщение для Universe Найти все сообщения от Universe
  № 3  
Ответить с цитированием
Universe
 
Аватар для Universe

Регистрация: Feb 2010
Сообщений: 811
Отправить сообщение для Universe с помощью ICQ Отправить сообщение для Universe с помощью Skype™
а что если нужна не одна, а несколько линий. Идея в следующем: есть ряд геометрических объектов, которые создаются по параметрам из xml. Т.е. объекты всегда могут быть разными и в разном кол-ве. Они при создании должны помещаться в контейнер, в котором соответственно правильно расставляться, не налезать на друг друга. Если места для объекта не хватает - перескакивать на новую строку и т.д.

Старый 07.03.2011, 00:03
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 4  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Не понял о каких линиях идет речь. Код покажите, или скажите что делаете конкретно.

Старый 07.03.2011, 00:59
kseniya вне форума Посмотреть профиль Отправить личное сообщение для kseniya Найти все сообщения от kseniya
  № 5  
Ответить с цитированием
kseniya
 
Аватар для kseniya

Регистрация: Oct 2010
Адрес: Новосиб
Сообщений: 122
похоже что автора затронула тема заполнение вещей разной площади в инвентаре
пока всё что приходит в голову это
Код AS3:
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


Последний раз редактировалось kseniya; 07.03.2011 в 01:23.
Старый 07.03.2011, 02:48
Aloran вне форума Посмотреть профиль Отправить личное сообщение для Aloran Найти все сообщения от Aloran
  № 6  
Ответить с цитированием
Aloran

Регистрация: May 2009
Сообщений: 223
Записей в блоге: 1
Недавно на работе решали подобную задачу:
- Условно разбили контейнер на ячейки (чем мельче ячейки тем мельче зазоры между объектами)
- для каждого объекта добавленного в контейнер определяем занятые им ячейки и помечаем их как занятые
- перед добавлением объекта ищем первую свободную ячейку, и исходя из размеров объекта расчитываем какую область он должен занять, бежим по ячейкам данной области и смотрим есть ли хоть одна несвободная, если нет то ок помещаем туда объект, иначе ищем следующую свободную и снова расчет...

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 19:25.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.