Как я могу рассчитать соседние плитки, чтобы сгенерировать края и углы для массива 2D-карты тайлов? - PullRequest
1 голос
/ 15 апреля 2019

У меня есть простой метод, который генерирует двумерные карты островов из SimpleX Noise, но он оставляет одну большую проблему. Работает хорошо, но оставляет острые углы.

Sharp corners on 2D Tile Map

То, что я хотел бы сделать, это взять это и вычислить соседей, чтобы добавить правильные плитки для краев и углов, но я не уверен, как добавить это. Как лучше всего это вычислить?

generateMap()
{
    let outputMap = [];

    for(let y = 0; y < this.tileCount; y++)
    {
        outputMap[y] = [];
        for(let x = 0; x < this.tileCount; x++)
        {
            let nx = x / this.tileCount - 0.5, ny = y / this.tileCount - 0.5;
            let e = 1 + +Math.abs(this.heightMapGen.noise2D(1 * nx, 1 * ny));
            e += 0.5 + +Math.abs(this.heightMapGen.noise2D(2 * nx, 2 * ny));  
            e += 0.25 + +Math.abs(this.heightMapGen.noise2D(4 * nx, 4 * ny));  


            let output = (Math.pow(e, 0.21) % 1).toFixed(2).split(".");
            outputMap[y][x] = parseFloat(output[1]);

            if (outputMap[y][x] <= 25)
            {
                outputMap[y][x] = 0; // Water //
            } else {
                // Terrain //
                switch(outputMap[y][x])
                {
                    case 28:
                    case 29:
                        outputMap[y][x] = 2;
                    break;                        
                    case 27:
                        outputMap[y][x] = 1;
                    break;
                    case 26:
                        outputMap[y][x] = 4;
                    break;
                    default:
                        outputMap[y][x] = 3;
                }                
            }  
        }
    }

    return outputMap;
}

1 Ответ

0 голосов
/ 06 мая 2019

Определите, где находятся эти желтые (песочные?) Граничные плитки, у вас есть 4 случая для внешних углов и 4 для внутренних углов.

+-->  +-----------+  <---+ corner tile (one case)
      |         |_|  
      |    land   |  sea here
      |    here   |
      |           |
      |           |
+-->  +-----------+  <----+

4 external corners (sea shore, beach)


      +-----------+
      | land here |
+-------> +---+ <-------+
      |   |wat|   |
      |   |er |   |
+-------> +---+ <-------+
      |           |
      +-----------+

4 potential internal corners (lake shore or pond edge)

Чтобы определить, в каком случае вы смотрите на соседей ячейки (это вода? в каком направлении ...).Либо используйте make 8 конкретных плиток для этих случаев (см. классические наборы плиток ), либо вы можете играть с эффектами прозрачности в альфа-канале.Как вы можете видеть на примере набора тайлов, может быть больше случаев: только одна ячейка воды, всего две ячейки с водой ... вы можете исключить их из сгенерированной карты, чтобы избежать их.

Удачи.

...