Я работаю над редактором мозаичных карт, и мне нужно выбирать плитки автоматически на основе соседних плиток. Например, при размещении дорожной плитки рядом с другой дорожной плиткой их необходимо ориентировать так, чтобы они образовывали непрерывную дорогу. Если вокруг них есть другие дороги, нам, возможно, придется использовать угловые или перекрестные плитки.
Кто-нибудь может порекомендовать некоторые алгоритмы для этого? В игре используется квадратная мозаичная карта с 8 направлениями.
Ответы:
Может быть, это то, как это обычно делается. У вас есть список различных плиток, которые представляют дорожные плитки во всех их возможных ориентациях. Слева направо, все четыре угла, сверху вниз, что угодно. Теперь вы будете индексировать все эти плитки с байтом каждый. 8 бит, по одному для каждого направления. Это может быть в хэш-карте или по имени файла ... однако вы хотите сделать это.
Итак, у вас есть это:
Байтовый код для вышеуказанного тайла - 00000000 . Тогда ваша плитка, идущая слева направо (или справа налево), выглядит следующим образом:
Байт-код для этой плитки - 10001000 или 136. В качестве другого примера, давайте рассмотрим трехстороннее пересечение:
Байт-код для этой плитки - 10101000 .
Вы, наверное, видите, куда я иду. Вы устанавливаете битовые позиции в байте, представляющем соединения. Это гораздо лучше, чем пытаться создать какую-то большую цепочку if / else, которую я видел раньше. Когда вы хотите разместить плитку, осмотрите плитки вокруг нее и создайте по пути байт. Установите 1 для плиток, у которых есть дороги (или что вы хотите соединить), и 0 для плиток, у которых нет. Когда вы закончите, у вас будет байт-код для нужной плитки.
Обратите внимание, что при создании ресурсов вы можете использовать многие из них, просто вращая и присваивая ему правильный байт-код.
РЕДАКТИРОВАТЬ : Обновлены изображения, чтобы быть менее дрянным. Да, это лучше, чем раньше.
источник
Я бы порекомендовал вам взглянуть на эту удобную страницу для получения дополнительной информации, так как она содержит очень подробную информацию о практически каждом аспекте того, что вы делаете, а также несколько потенциальных оптимизаций: http://www.angryfishstudios.com / 2011/04 / приключения-в-bitmasking /
Tldr заключается в том, что вы запрашиваете каждую соседнюю ячейку и сохраняете комбинацию в битовом поле / байте, а затем пропускаете ее через карту, которая преобразует число от 0 до 255 в значение от 0 до 47, которое соответствует уникальному изображению.
источник