Я пытаюсь реализовать тайловую игру с разнородными тайлами; плитка разных размеров. Все размеры плитки для удобства округлены по размеру (до метра). Я ищу алгоритм, который укладывает плитки в псевдослучайном порядке, с требованием, чтобы, конечно, все было выложено плиткой.
Ниже приведены несколько строк, которые я написал, однако это не работает должным образом. Как-то не соблюдается расстояние между плитками.
Сначала я создаю карту шума Перлина, которая создается на ходу. Я использую словарь для тайловой карты.
Переменная в метрах объекта плитки - это ширина и глубина квадратной плитки в метрах. Первый тайл в массиве тайлов - это пустой тайл для указания пропуска.
Изменить: теперь я вижу, что в Unity есть проблема с масштабированием, когда я применяю масштаб 1 к плоскости в игре, в результате получается размер 10. Может ли кто-нибудь объяснить это?
for(int i=-viewSpreadMeters;i<=viewSpreadMeters;i++)
{
for(int j=-viewSpreadMeters;j<=viewSpreadMeters;j++)
{
int x = currentTerrainID[0] + i;
int y = currentTerrainID[1] + j;
if (!tileMap.ContainsKey(x, y)) {
int id = noiseMap[x, y];
int iteratedTiles = 0;
Restart:
for (int k = 1; k < tiles[id].meters; k++) {
for (int l = 1; l < tiles[id].meters; l++) {
int x2 = x + k;
int y2 = y + l;
if (tileMap.ContainsKey(x2, y2)) {
int prevMeters;
do {
iteratedTiles++;
print ("Iterated tiles" + iteratedTiles);
if (iteratedTiles >= tiles.Length - 1) {
id = 0;
goto EndLoop;
}
prevMeters = tiles[id].meters;
id++;
id %= tiles.Length;
if (id == 0) id++;
} while(tiles[id].meters >= prevMeters);
goto Restart;
}
}
}
EndLoop:
tileMap.Add(x, y, id);
for (int k = 1; k < tiles[id].meters; k++) {
for (int l = 1; l < tiles[id].meters; l++) {
int x2 = x + k;
int y2 = y + l;
tileMap.Add(x2, y2, 0);
}
}
}
}
}