Показать сообщение отдельно
Старый 14.08.2009, 14:51
Just Alex вне форума Посмотреть профиль Отправить личное сообщение для Just Alex Найти все сообщения от Just Alex
  № 5  
Ответить с цитированием
Just Alex

Регистрация: Jul 2008
Сообщений: 10
У меня подобная функция работает. Только объекты прямоугольные, поэтому пользуюсь Rectangle'ом для проверки пересечений. Как предложил etc, BitmapData поможет обобщить это и на твой случай. И у меня часть объектов обязательно будут помещены на поле, другая часть может быть игнорирована (например, если после 100 попыток поместить, объект не нашел пустого места).

Алгоритм примерно такой:
1. создается цикл for по количеству объектов, которые надо "впихнуть"
2. задается максимальное кол-во попыток найти пустое место (maxTryCount). Зануляется текущий счетчик (tryCount) и значение emptySpaceFound = true.

В цикле do while:
3. создается/выбирается объект нужных размеров и с нужными координатами (у меня и то, и другое определяются случайно)
4. проверяется наличие свободного места (классы Rectangle и BitmapData дают достаточно средств, чтоб узнать, не пересекается ли создаваемый объект с уже существующими и "стенами")
5. дальше такой кусочек
Код AS3:
tryCount++;
if (tryCount > maxTryCount)
{
	emptySpaceFound = false;
	break;
}
6. заканчивается цикл while:
Код AS3:
} while (intersect); // объект пересекается с каким-то уже помещенным на поле объектом
7. после while
Код AS3:
if (emptySpaceFound)
{
	// добавляем объект в список добавленных на поле, рисуем его и т.д.
}
P.S. для объектов, которые обязательно надо поместить на поле заменяю:
Код AS3:
tryCount++;
на
Код AS3:
tryCount++;
maxTryCount++;
Но в этом случае нужно добавить другую защиту от бесконечного while.
__________________
Флеш игры. Пока все свои.
http://justalexi.com