0

这是我在这里的第一篇文章,所以请温柔;)

我试图在 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)

//谢谢

4

1 回答 1

0

执行此操作的一项古老技术是将您的方向分为两组:涉及跨边缘移动的方向,以及涉及跨拐角移动的方向。假设对应于瓦片的顶角,则集合分别分解为序数和基数方向。

然后,您可以将每组方向表示为一个 4 位整数,其中每个位对应于一个方向。对于每个方向,如果该方向需要边缘,则将其对应位设置为1 ,否则设置为0。这将为您提供一对值,范围从 0(无边缘 - 0b0000)到 15(完全边缘 - 0b1111)。

然后,这两个 4 位数字可以用作纹理列表的索引。排列列表中的每个纹理,使其索引对应于设置位的方向。例如,如果您的位顺序是 NSEW(北、南、东、西),并且您计算出南北边缘需要边缘,那么您的纹理索引将为 0b1100 或 12——因此请确保索引为 12 的纹理在图块的南北边缘显示边缘。

然后你所要做的就是绘制瓷砖的基础纹理,用瓷砖的边缘覆盖它,然后用瓷砖的边角覆盖它。

于 2013-01-16T19:22:23.833 回答