Я работал над тайловой системой генерации ландшафта и столкнулся с небольшой загвоздкой. Я надеюсь создать ряд переходных плиток, которые будут обозначать переход между водой и землей, и у меня возникли проблемы с поиском эффективного способа выяснить, какая плитка должна быть какой.
Моя первая попытка (показана ниже) заключалась в том, чтобы пропустить каждую плитку через серию операторов if, чтобы выяснить, какой она должна быть. Основная проблема заключается в том, что с картой мира размером 100 x 100 тайлов она будет выполняться через 10 000 итераций, получая доступ к данным на 8 окружающих тайлах (80 000 операций), а затем выполняя до четырех операторов if (320 000 операций). операции). Мне просто кажется, что это было бы ужасно неэффективно и медленно.
Преимущество этого метода заключается в том, что он будет работать только на тайлах земли и сначала будет проверяться, чтобы убедиться, что он примыкает хотя бы к одному тайлу воды, что значительно сократит количество необходимых операций.
Вот базовая диаграмма, которую я нарисовал, которая проходит через окружающие плитки и выбирает подходящую плитку.
Моя вторая идея заключалась в том, чтобы, по сути, начать ходить по тайлам и, как только я наткнулся на тайл побережья, следовать по побережью в обоих направлениях, назначая тайлы по мере продвижения. этот метод гарантирует, что плитка еще не была понята до начала. Проблема в том, что, во-первых, я не могу понять, как это будет работать, а во-вторых, в результате я понятия не имею, насколько это будет эффективно.
Друг рассказал мне о третьем методе, который может сработать. Он берет плитки воды и устанавливает их равными 0, а плитки земли, которые установлены равными 1. Затем он берет окружающие плитки и нумерует их от 1 до 9. Оттуда они проходятся по ним и создают строку из 0 и 1:
W W W
W L L
L L L
будет: 000011111
0*2^0 + 0*2^1 + 0*2^2 + 0*2^3 + 1*2^4 + 1*2^5 + 1*2^6 + 1*2^7 + 1*2^8
0*1 + 0*2 + 0*4 + 0*8 + 1*16 + 1*32 + 1*64 + 1*128 + 1*126 = 496
Теория состоит в том, что я бы присвоил плитке, связанной с этой комбинацией, номер 496 и загрузил бы ее в ответ. Проблема в том, что каждое ребро имеет 13 или 14 комбинаций, которые приведут к его использованию. например:
W W L L W W
W L L and W L L Both need the same tile as the above example, but
L L L L L L produce different numbers.
По сути, чтобы заставить этот метод работать, мне нужно было вычислить окончательное число для каждой возможной комбинации воды и земли, которая дала бы конкретную плитку, а затем прогнать окончательное число через серию «если/случай», чтобы выбрать подходящее. битовая карта. Это было бы так же или даже более неэффективно, чем блоки if.
Итак, подходя к главному вопросу во всем этом. Кто-нибудь знает альтернативный способ сделать это или способ сделать любой из этих методов более эффективным?