Я ищу информацию о том, как люди внедряют автотиллинг в своих играх на основе тайлов. До сих пор я всегда импровизировал с кучей жестко закодированных выражений «если ... еще ...», и теперь я решил, что пришло время найти более элегантное решение. Я отправился на поиски в интернете примеров реализации автотайлинга и обсуждений по этой теме, но я придумал только три статьи:
- http://www.codeproject.com/Articles/106884/Implementing-Auto-tiling-Functionality-in-a-Tile-M
- http://blog.rpgmakerweb.com/tutorials/anatomy-of-an-autotile
- http://web.archive.org/web/20130927193449/http://www.squidi.net/mapmaker/musings/m091016.php
(Особенно последний является всеобъемлющим и очень полезным.)
Я также рассмотрел различные реализации и документацию библиотек, которые ее реализуют, например, flixel: http://www.flixel.org/features.html#tilemaps
К сожалению, все решения, которые я мог найти, были такими же импровизированными и случайными, как и то, с чего я начинал, и почти никогда не покрывали все возможные случаи.
Я ищу элегантный пример реализации автотайлинга, из которого я мог бы поучиться.
Я сам прибыл сюда, погуглив эту проблему, прочитав соответствующие статьи, и создал относительно компактное решение, которое генерирует общий набор из 47 плиток. Требуется набор тайлов 2x3 для материала с автонастройкой, подобного этому:
С вариантом с одной плиткой в верхнем левом углу, внутренними углами в верхнем правом углу и четырьмя внешними угловыми плитками в нижней части (вы можете узнать это расположение в RPG Maker).
Хитрость заключается в том, чтобы разбить каждый «логический» фрагмент карты на 4 половины фрагмента для рендеринга. кроме того, полукруглый элемент в наборе листов может находиться только в этой позиции в сгенерированном фрагменте, поэтому верхний левый полукруглый элемент можно использовать только в верхнем левом положении.
Эти ограничения означают, что вам нужно проверять только 3 соседей с полной плиткой на половину плитки вместо всех 8 соседних плиток.
Я быстро реализовал эту идею, чтобы проверить ее. Вот код проверки концепции (TypeScript):
Объяснение:
A
верхняя левая часть плитки,B
верхняя правая,C
нижняя левая,D
нижняя правая.edges
содержит битовые маски для каждого из них, поэтому мы можем получить только соответствующую информацию о соседе.map*
являются словарями, отображающими состояния соседей в графические индексы в изображении набора мозаичных элементов (0..24)._tile
является плиткой, предназначенной для автотиллинга.В любом случае, вот результаты (в любом случае только с одной плиткой):
источник
Я прочитал большинство ссылок и потратил некоторое время, чтобы найти другое решение. Я не знаю, хорошо это или нет, но для имитации поведения автоматической плитки RPG Maker VX Ace (47 плиток) я начал делать что-то вроде этого:
Я не программист и не лучший с математическими алгоритмами и решениями 1, 2, 4, 8, 16, 32, 64, 128, которые мне тоже не очень понравились.
Может быть, мой подход, по крайней мере, лучше, чем это.
источник