Рандомное создание объектов на поле
| |
makso134 | Дата: Вторник, 28 Июля 2015, 18:58 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Народ подскажите как лучше всего создать поле например 10х10 одна клетка которого равна 64px, как сделать чтобы к примеру 5 спрайтов радномно создавались в центре любой из клеток, т.е. не по всему полю, а 5 спрайтов в 5 клетках. Вот скрин примерно того что я описал:
|
|
| |
Nick_Rimer | Дата: Среда, 29 Июля 2015, 08:42 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| makso134, тут формула зависит от того, как ты располагаешь клеточки. Есть два основных варианта:
1. Клетки располагаются вплотную друг к другу и не имеют общей границы (смотри первый скриншот). С2 ставит координаты между пикселями, таким образом центр клетки (32;32), а левому верхнему углу соответствует координата (0;0). Будем пользоваться рандомом, чтобы выбрать случайную клетку из поля 10х10, но не будем забывать, что в двух самых распространённых вариантах рандома мы можем определять клетки как 1я, 2я, 3я, ..., 10я или как 0я, 1я, 2я, ..., 9я. Рассмотрим также оба варианта (отличаются только моментом времени, когда необходимо прирастить единицу). Формула же вообще в данном случае проста (напишу в псевдокоде). Код DIMENSION = 64
i = floor(random(10)+1) //номер клетки в столбце от 1 до 10 j = floor(random(10)+1) //номер клетки в строке от 1 до 10 X = DIMENSION * i - DIMENSION / 2 Y = DIMENSION * j - DIMENSION / 2
или
i = floor(random(10)) //номер клетки в столбце от 0 до 9 j = floor(random(10)) //номер клетки в строке от 0 до 9 X = DIMENSION * (i+1) - DIMENSION / 2 Y = DIMENSION * (j+1) - DIMENSION / 2
Несложно проверить расчёты.
2. Клетки располагаются вплотную друг к другу, но имеют общую границу, чтобы между клетками не было слишком толстой границы. Это важно, когда отображается сетка, иначе разница между толщинами внешних и внутренних границ слишком бросается в глаза. Здесь нужно компенсировать уменьшение толщины, и эта погрешность тем больше, чем дальше мы удаляемся от первой клетки. Обрати внимание на второй скриншот (внешние границы красные, внутренние границы стали общими для клеток - они зелёным цветом), как сильно поменялись координаты при границе всего лишь в один пиксель и перестали быть - как я говорю - "квадратными", появилось смещение. Для первой клетки координаты не изменились, но для всех последующих будет происходить слияние границ с одной или нескольких сторон, и это слияние необходимо компенсировать в расчётах. Величина компенсации будет зависеть от толщины границы. Формула, конечно, усложняется, хотя общие черты прослеживаются. Рассмотрим псевдокод (и не забудем про два варианта рандома). Код DIMENSION = 64 BORDER = 1
i = floor(random(10)+1) //номер клетки в столбце от 1 до 10 j = floor(random(10)+1) //номер клетки в строке от 1 до 10 X = DIMENSION * i - DIMENSION / 2 - BORDER * (i-1) Y = DIMENSION * j - DIMENSION / 2 - BORDER * (j-1)
или
i = floor(random(10)) //номер клетки в столбце от 0 до 9 j = floor(random(10)) //номер клетки в строке от 0 до 9 X = DIMENSION * (i+1) - DIMENSION / 2 - BORDER * i Y = DIMENSION * (j+1) - DIMENSION / 2 - BORDER * j
Можно проверить расчёты и выбрать подходящий для своей ситуации вариант. Удачи!
P.S. за мерзкие картинки, сварганенные вручную в пейнте, просьба не пинать
- Доброе утро, Агент Пи!
|
|
| |
makso134 | Дата: Среда, 29 Июля 2015, 15:17 | Сообщение # 3 |
участник
Сейчас нет на сайте
| Отлично, но что то псевдокод не очень понял, не мог бы ты исходник первого варианта показать, где клеточки вплотную без бордера. Спасибо
|
|
| |
Nick_Rimer | Дата: Среда, 29 Июля 2015, 16:28 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| makso134, а что же не понятно? Ты знаешь размер клеточки (по высоте и ширине значение одинаково, и это DIMENSION), ты можешь и просто использовать цифру 64 без доп. переменной. Я просто показал весьма общий вариант (вдруг ты станешь использовать клетки других размеров?) Допустим, такая задача - при нажатии на кнопку создать какой-то спрайт в координатах центра случайной клетки на поле размером 10х10 этих клеток. При создании спрайта через System мы должны указать слой (но нам пофиг), объект, который создаём (наш спрайт) и координаты X и Y, в которых объект будет создаваться. Вместо Х подставь выражение для X. Вместо Y подставь выражение для Y. Для первого случая (из тех, что я рассмотрел в посте выше) для этих выражений значения i и j используются по одному разу, так что ты просто можешь подставить их формулы взамен.
Короче, твой случай: Код Button -> OnClick System -> Create sprite X = 64 * floor(random(10)+1) - 32 Y = 64 * floor(random(10)+1) - 32 И спрайт будет создаваться в центре случайной клеточки. Если у тебя есть опыт написания небольших программ на С2, ты справишься с этим сам, очень ведь простое задание, особенно теперь, когда всё так подробно расписано.
Несложно посчитать первые несколько значений, которые будут получаться: 64 * 1 - 32 = 32 64 * 2 - 32 = 96 64 * 3 - 32 = 160 и т.д.
- Доброе утро, Агент Пи!
|
|
| |
sakhalin | Дата: Среда, 29 Июля 2015, 16:57 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Можно еще попробовать сделать поле через массив.
|
|
| |
Nick_Rimer | Дата: Среда, 29 Июля 2015, 17:06 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| sakhalin, никакого смысла в массиве нет. Зачем занимать лишнюю память непонятно под что, если расчёт координат просто наиэлементарнейший?? Это уже ближе к вопросу об оптимизации. Если есть возможность избежать лишних действий, нужно пользоваться этим (либо приведите ваш аргумент против этого). А помочь мы и здесь можем, рекламировать сторонние ресурсы нет никакой необходимости.
- Доброе утро, Агент Пи!
|
|
| |
makso134 | Дата: Среда, 29 Июля 2015, 23:36 | Сообщение # 7 |
участник
Сейчас нет на сайте
| Спасибо Nick_Rimer, будем пробовать!
Сообщение отредактировал makso134 - Четверг, 30 Июля 2015, 06:23 |
|
| |
Nick_Rimer | Дата: Четверг, 30 Июля 2015, 10:08 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| makso134, ночью было ведь другое сообщение, куда всё стёр?
Я подумал, кстати, о том, что мой пример не гарантирует того, что создаваемые объекты будут созданы в разных клетках, а ведь было бы, мне кажется, логичным и даже необходимым обеспечить создание объектов именно в строго разных координатах. Так что я добавил к старым мыслям новые, и это значительно усложнило финальный результат относительно первоначального слепого рандома. Пришлось добавить "пару переменных" и, кстати, массив использовать, но отнюдь не для построения сетки, а для хранения значений занятых клеток, дабы избежать повторений (появилась проверка на занятую клетку).
Для теста программы можешь менять: - размер клеточек (cell) в редакторе, увидишь, что все координаты будут верно посчитаны (только не забывай соразмерно менять и размер квадратов (square))
- константы GRID_W и GRID_H для изменения размеров поля
- константу COUNT для изменения количества создаваемых квадратов
В общем, я с удовольствием поработал над этим! Все комментарии внутри исходника. Но не стесняйся задавать любые вопросы по коду.
СКАЧАТЬ Версия: C2 r210 Срок хранения: 90 дней
- Доброе утро, Агент Пи!
|
|
| |
makso134 | Дата: Четверг, 30 Июля 2015, 15:17 | Сообщение # 9 |
участник
Сейчас нет на сайте
| Цитата Nick_Rimer ( ![Ссылка на цитируемый текст](http://s18.ucoz.net/img/fr/ic/11/lastpost.gif) ) ночью было ведь другое сообщение, куда всё стёр? dry Да я просто не увидел что ты уже ответил, вот и потер, за исходник отдельное спасибо, вечерком гляну
|
|
| |
|