Выберите плитку на основе соседних плиток

10

Я работаю над редактором мозаичных карт, и мне нужно выбирать плитки автоматически на основе соседних плиток. Например, при размещении дорожной плитки рядом с другой дорожной плиткой их необходимо ориентировать так, чтобы они образовывали непрерывную дорогу. Если вокруг них есть другие дороги, нам, возможно, придется использовать угловые или перекрестные плитки.

Кто-нибудь может порекомендовать некоторые алгоритмы для этого? В игре используется квадратная мозаичная карта с 8 направлениями.

alekop
источник
Разве вы не можете просто исследовать все окружающие 8 плиток, когда пользователь кладет новую плитку, и соответственно ориентировать новую плитку? Конечно, вам нужно хранить дополнительную информацию о каждой плитке, такую ​​как ориентация и тип.
XiaoChuan Yu
Я изучаю все окружающие плитки, но я не знал, как обрабатывать все комбинации плиток. Например, у вас есть семь возможных плиток на выбор (горизонтальный, вертикальный, четыре угла и крест). Я думал об использовании сложных операторов switch, но это было неправильно.
alekop

Ответы:

18

Может быть, это то, как это обычно делается. У вас есть список различных плиток, которые представляют дорожные плитки во всех их возможных ориентациях. Слева направо, все четыре угла, сверху вниз, что угодно. Теперь вы будете индексировать все эти плитки с байтом каждый. 8 бит, по одному для каждого направления. Это может быть в хэш-карте или по имени файла ... однако вы хотите сделать это.

Итак, у вас есть это:

введите описание изображения здесь

Байтовый код для вышеуказанного тайла - 00000000 . Тогда ваша плитка, идущая слева направо (или справа налево), выглядит следующим образом:

введите описание изображения здесь

Байт-код для этой плитки - 10001000 или 136. В качестве другого примера, давайте рассмотрим трехстороннее пересечение:

введите описание изображения здесь

Байт-код для этой плитки - 10101000 .

Вы, наверное, видите, куда я иду. Вы устанавливаете битовые позиции в байте, представляющем соединения. Это гораздо лучше, чем пытаться создать какую-то большую цепочку if / else, которую я видел раньше. Когда вы хотите разместить плитку, осмотрите плитки вокруг нее и создайте по пути байт. Установите 1 для плиток, у которых есть дороги (или что вы хотите соединить), и 0 для плиток, у которых нет. Когда вы закончите, у вас будет байт-код для нужной плитки.

Обратите внимание, что при создании ресурсов вы можете использовать многие из них, просто вращая и присваивая ему правильный байт-код.

РЕДАКТИРОВАТЬ : Обновлены изображения, чтобы быть менее дрянным. Да, это лучше, чем раньше.

MichaelHouse
источник
Очень хорошо! Просто и эффективно. Единственное, чего я не понимаю, это как ты получаешь эти битовые маски. Например, как вы получаете битовую маску 17 от цифр 3 и 7?
alekop
Неважно, я вижу, что ты делаешь. Вы устанавливаете биты 3 и 7, но вы считаете слева, а не справа.
alekop
Ух ты, как неловко. Получил мой Endianness все перепутал. Это был несчастный случай, я исправлю это!
MichaelHouse
Отлично, теперь мой комментарий не имеет смысла! : p Просто шучу, спасибо за ответ. Это именно то, что я искал.
alekop
1
Хорошее объяснение. У меня есть сообщение в блоге, в котором
описывается
3

Я бы порекомендовал вам взглянуть на эту удобную страницу для получения дополнительной информации, так как она содержит очень подробную информацию о практически каждом аспекте того, что вы делаете, а также несколько потенциальных оптимизаций: http://www.angryfishstudios.com / 2011/04 / приключения-в-bitmasking /

Tldr заключается в том, что вы запрашиваете каждую соседнюю ячейку и сохраняете комбинацию в битовом поле / байте, а затем пропускаете ее через карту, которая преобразует число от 0 до 255 в значение от 0 до 47, которое соответствует уникальному изображению.

Кайл Баран
источник