初めての投稿なのでお手柔らかにお願いします(;_;)
XNA でタイル マップを作成しようとしていますが、タイルベースの地面選択に使用するグレースケール テクスチャを生成するパーリン メソッドを使用して、マップをランダムに生成することができました。
これが私のやり方です
internal void RenderNew(int mapWidth, int mapHeight)
{
_mapHeigth = mapHeight;
_mapWidth = mapWidth;
Tiles = new Tile[_mapWidth, _mapHeigth];
bool moveRowLeft = true;
//Create the map array
for (int y = 0; y < _mapHeigth; y++)
{
moveRowLeft = !moveRowLeft;
for (int x = _mapWidth - 1; x >= 0; x--)
{
Tile t = new Tile(x, y, _mapWidth, _mapHeigth)
{
Position = new Vector2(x * tileWidth + (moveRowLeft ? tileWidth / 2 : 0), (y * tileHeight / 2))
};
t.Ground = Tile.GroundType.Grass;
Tiles[x, y] = t;
}
}
//Generate the grayscaled perlinTexture
GenerateNoiseMap(_mapWidth, _mapHeigth, ref perlinTexture, 20);
//Get the color for each pixel into an array from the perlintexture
Color[,] colorsArray = TextureTo2DArray(perlinTexture);
//Since a single pixel in the perlinTexture can be mapped to a tile in the map we can
//loop all tiles and set the corresponding GroundType (ie texture) depending on the
//color(black/white) of the pixel in the perlinTexture.
foreach (var tile in Tiles)
{
Color colorInPerlinTextureForaTile = colorsArray[tile.GridPosition.X, tile.GridPosition.Y];
if (colorInPerlinTextureForaTile.R > 100)
{
tile.Ground = Tile.GroundType.Grass;
}
else if (colorInPerlinTextureForaTile.R > 75)
{
tile.Ground = Tile.GroundType.Sand;
}
else if (colorInPerlinTextureForaTile.R > 50)
{
tile.Ground = Tile.GroundType.Water;
}
else
{
tile.Ground = Tile.GroundType.DeepWater;
}
}
}
私が使用するテクスチャ シートには、砂、草、水、深海のテクスチャが含まれています。ただし、砂から水などに移動するなど、適切なオーバーラップを作成するためのタイルも含まれています。
!自分のタイルセットの画像を投稿しようとしましたが、このサイトの初心者であるとは言えませんでした ;(
私の質問は、重なり合うタイルをどのように使用できますか? オーバーラップ タイルを使用するタイミングと方向を知るにはどうすればよいですか?
すべてのタイルは、すべての 8 方向 (S、SE、E、NE、N、NW、W、NE) の隣接タイルも「認識」しています。
//サンクス