Неоднородные плитки и шум перлина

Я пытаюсь реализовать тайловую игру с разнородными тайлами; плитка разных размеров. Все размеры плитки для удобства округлены по размеру (до метра). Я ищу алгоритм, который укладывает плитки в псевдослучайном порядке, с требованием, чтобы, конечно, все было выложено плиткой.

Ниже приведены несколько строк, которые я написал, однако это не работает должным образом. Как-то не соблюдается расстояние между плитками.

Сначала я создаю карту шума Перлина, которая создается на ходу. Я использую словарь для тайловой карты.

Переменная в метрах объекта плитки - это ширина и глубина квадратной плитки в метрах. Первый тайл в массиве тайлов - это пустой тайл для указания пропуска.

Изменить: теперь я вижу, что в 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);
                        }
                    }
                }
            }
        }

person RobotRock    schedule 23.03.2013    source источник


Ответы (2)


В приведенном выше коде есть ошибка, отсутствует продолжение. Кроме того, мне потребовались куски, чтобы заставить работать разнородные плитки.

person RobotRock    schedule 31.03.2013

Проблема масштабирования зависит от того, как вы импортируете свои активы. Если плитки создаются программно, они должны быть в масштабе 1: 1; однако, если вы импортируете их из инструмента DCC, такого как Max или Maya, вам необходимо проверить настройку 'glbal scale' в настройках импорта моделей - в зависимости от исходного приложения и настроек там глобальный масштаб может быть увеличен или уменьшить импортные единицы от 1: 100 до 100: 1.

Неоднородные плитки сложны, потому что вам нужно управлять согласованием краев по частичным краям. Вы уверены, что вам нужны разнородные размеры?

person theodox    schedule 31.03.2013
comment
Проблема масштабирования все еще существует. Я использую самолеты Unity; при масштабе 1x1 получится размер 10x10. Однако добавление этой константы в любом случае не имеет большого значения. - person RobotRock; 01.04.2013
comment
Если вы все еще пытаетесь делать плитки разного размера, вы можете посмотреть на Wang Tiles, чтобы увидеть, как они используют кодирование краев для сопоставления плиток. Плитка большего размера может быть вписана в такую ​​схему, если ее края соответствуют схеме кодирования .... procworld.blogspot.com/2013/01/introduction-to-wang-tiles.html - person theodox; 01.04.2013