使用特殊切片纹理生成等距切片贴图

时间:2013-01-16 10:27:35

标签: xna xna-4.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)的邻居图块

//感谢名单

1 个答案:

答案 0 :(得分:0)

这样做的一种老技术是将你的方向分成两组:那些涉及在边缘上移动的方法,以及那些涉及在一个角落移动的方向。假设 north 对应于图块的上角,则这些图组分别分为序数和基数方向。

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

然后,这两个4位数可以作为纹理列表的索引。在列表中排列每个纹理,使其索引对应于具有设置位的方向。例如,如果您的位顺序是NSEW(北,南,东,西),并且您计算了北边和南边需要条纹,则纹理索引将为0b1100或12 - 因此请确保索引为12的纹理显示了瓷砖北边和南边的边缘。

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