这是我在这里发表的第一篇文章,所以请保持温和;)
我试图在XNA中制作一个瓦片地图,到目前为止,我使用perlin方法随机生成我的地图,该方法生成一个灰度纹理,用于基于平铺的地面选择。
我就是这样做的
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;
}
}
}
我使用的纹理板因此包含沙子,草,水和深水的纹理。 但它也包含用于创建漂亮重叠的瓷砖,即从沙子到水等。
!试图发布我的tileset图片,但我无法在这个网站上发布新内容;(
所以我的问题是,我如何使用重叠的瓷砖?我怎么知道何时使用重叠的瓷砖以及在什么方向?
所有图块也“知道”其所有第八个方向(S,SE,E,NE,N,NW,W,NE)的邻居图块
//感谢名单
答案 0 :(得分:0)
这样做的一种老技术是将你的方向分成两组:那些涉及在边缘上移动的方法,以及那些涉及在一个角落移动的方向。假设 north 对应于图块的上角,则这些图组分别分为序数和基数方向。
然后,您可以将每组方向表示为4位整数,其中每个位对应于一个方向。对于每个方向,如果该方向需要边缘,则将其对应位设置为 1 ,否则设置 0 。这将为您提供一对值,范围从0(无边缘 - 0b0000)到15(全边缘 - 0b1111)。
然后,这两个4位数可以作为纹理列表的索引。在列表中排列每个纹理,使其索引对应于具有设置位的方向。例如,如果您的位顺序是NSEW(北,南,东,西),并且您计算了北边和南边需要条纹,则纹理索引将为0b1100或12 - 因此请确保索引为12的纹理显示了瓷砖北边和南边的边缘。
然后你需要做的就是绘制瓷砖的基础纹理,用瓷砖的边缘边缘覆盖它,然后用瓷砖的边角边缘覆盖它。