0

初めての投稿なのでお手柔らかにお願いします(;_;)

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) の隣接タイルも「認識」しています。

//サンクス

4

1 に答える 1

0

これを行うための古い手法は、方向を 2 つのセットに分割することです。端を横切るものと、角を横切るものです。がタイルの上隅に対応すると仮定すると、セットはそれぞれ序数方向と基数方向に分解されます。

次に、方向の各セットを 4 ビット整数として表すことができます。各ビットは方向の 1 つに対応します。方向ごとに、その方向にフリンジが必要な場合は対応するビットを1に設定し、それ以外の場合は0に設定します。これにより、0 (フリンジなし - 0b0000) から 15 (フル フリンジ - 0b1111) までの範囲の値のペアが得られます。

これら 2 つの 4 ビット数値は、テクスチャのリストへのインデックスとして機能します。インデックスが設定されたビットの方向に対応するように、リスト内の各テクスチャを配置します。たとえば、ビット順序が NSEW (北、南、東、西) で、北と南の端にフリンジが必要であると計算した場合、テクスチャ インデックスは 0b1100、つまり 12 になります。インデックス 12 のテクスチャは、タイルの北端と南端のフリンジを示しています。

あとは、タイルのベース テクスチャを描画し、それをタイルのエッジ フリンジに重ねてから、タイルのコーナー フリンジに重ねるだけです。

于 2013-01-16T19:22:23.833 に答える