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


10

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

Хтось може порекомендувати деякі алгоритми для цього? У грі використовується 8-спрямована квадратна карта.


Ви не можете просто оглянути всі навколишні 8 плиток, коли користувач кладе нову плитку, і орієнтувати нову плитку відповідно? Звичайно, вам потрібно буде зберегти додаткову інформацію на кожній плитці, наприклад, орієнтацію та тип.
XiaoChuan Yu

Я вивчаю всі навколишні плитки, але не знав, як обробити всі комбінації плиток. Наприклад, у вас є сім можливих плиток на вибір (горизонтальний, вертикальний, чотири кути та хрест). Я думав використовувати складні заяви про перемикання, але це відчувало неправильність.
алекоп

Відповіді:


18

Можливо, так це робиться, як правило. У вас є список різних плиток, які представляють дорожню плитку у всіх їх можливих напрямках. Зліва направо, усі чотири кути, зверху вниз, як би там не було. Тепер ви будете індексувати всі ці плитки кожним байтом. 8 біт, по одному для кожного напрямку. Це може бути в хешмапі або за назвою файлу ... однак ви хочете це зробити.

Отже, у вас це є:

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

Код байта для вищезазначеної плитки - 00000000 . Тоді ваша плитка, яка йде зліва направо (або справа наліво), виглядає так:

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

Код байтів для цієї плитки 10001000 , або 136. Як інший приклад, давайте подивимось тристоронній перетин:

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

Код байта для цієї плитки - 10101000 .

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

Зауважте, що при створенні активів ви можете багато разів використовувати їх, просто обертаючи та присвоюючи йому правильний байт-код.

РЕДАКТУВАННЯ : Оновлені зображення, щоб вони були менш бадьорими. Так, це краще, ніж раніше.


Дуже хороший! Простий та ефективний. Єдине, чого я не розумію - це те, як ви отримуєте ці біт-маски. Наприклад, як ви отримуєте біт-маску 17 із чисел 3 і 7?
алекоп

Неважливо, я бачу, що ти робиш. Ви встановлюєте біти 3 і 7, але ви рахуєте зліва, а не праворуч.
алекоп

Ой вау, як соромно. Здобув мою ендіантність, все змішалося. Це була випадковість, яку я виправлю!
MichaelHouse

Чудово, зараз мій коментар не має сенсу! : p Жартую, дякую за вашу відповідь. Саме це я і шукав.
алекоп

1
Гарне пояснення. У мене є повідомлення в блозі, що висвітлює ту саму техніку з фактичним кодом та роздільною здатністю плитки: kitsu.github.io/2016/07/18/roguelike-project-05
kitsu.eb

3

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

Tldr полягає в тому, що ви запитуєте кожну сусідню клітинку і зберігаєте комбінацію в бітфілді / байті, а потім передаєте її через карту, яка перетворює число від 0 ~ 255 до значення від 0 ~ 47, що відповідає унікальному зображенню.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.