AS3 - Как несколько объектов, которые появляются случайно, НИКОГДА не касаются друг друга?
У меня есть несколько объектов, которые случайно появляются на сцене, но я хочу, чтобы они никогда не касались друг друга, когда они появляются.
object1.x = Math.random() * stage.stageWidth;
object1.y = Math.random() * stage.stageHeight;
object2.x = Math.random() * stage.stageWidth;
object2.y = Math.random() * stage.stageHeight;
object3.x = Math.random() * stage.stageWidth;
object3.y = Math.random() * stage.stageHeight;
etc...
А также, как я могу заставить их появляться внутри коробки, а не на сцене.
1 ответ
У меня есть несколько объектов, которые случайно появляются на сцене, но я хочу, чтобы они никогда не касались друг друга, когда они появляются
Они, очевидно, не могут появляться случайно.
Наивное, но быстрое решение - использовать коллизию ограничивающего прямоугольника, прежде чем размещать элемент с помощью:
// http://stackru.com/questions/2752349/fast-rectangle-to-rectangle-intersection
function rectIntersection(r1,r2) {
return !(r2.left > r1.right ||
r2.right < r1.left ||
r2.top > r1.bottom ||
r2.bottom < r1.top);
}
Если действительно есть столкновение, вы можете повторно запустить случайное размещение этого конкретного элемента, пока не будет никакого столкновения.
Этот метод наивен, потому что вам нужно запускать обнаружение столкновений для всех элементов на экране каждый раз, когда вы пытаетесь сделать случайное размещение. Если это не удается (имеется в виду столкновение), то вам нужно запустить его снова, пока его нет.
Имейте в виду, что вы также можете предварительно рассчитать места размещения вместо проверки времени выполнения анимации (если это анимация).
По второй части у вас вопрос.
А также, как я могу заставить их появляться внутри коробки, а не на сцене.
Вместо использования stageWidth
в качестве переменной размещения вы можете использовать функцию, которая возвращает случайное целое число в пределах диапазона.
Предоставленные диапазоны будут:
- верхний левый / верхний правый для ширины
- нижний левый / нижний правый для высоты
... из поля, в котором вы хотите ограничить свои элементы.
Функция будет возвращать случайное целое число в этих диапазонах, и ваши блоки всегда будут попадать в этот блок.
Вот фрагмент кода для начала работы:
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}