我如何访问 .txt 文件中的数据以在 XNA 中分配具有特定属性的特定图块?

How do I access data in a .txt file to assign specific tiles with certain properties in XNA?

好吧,一开始你可能在想; "oh great, another question where the guy asking has not researched this before..."

我向你保证我已经彻底研究了这个主题,但我的具体问题运气不佳。我的问题是我已经阅读了 this 教程,它成功地让我创建了一个简单的 .txt 文件来处理关卡的布局,之后可以迭代它来读取整数值,最后绘制相应的将纹理平铺到屏幕上。

在上面的教程 link 中,基本上是创建了 Map.cs class,它最终负责加载平铺纹理:

void LoadTileTextures(ContentManager content)
{
      tiles = new List<Texture2D>();
      tiles.Add(content.Load<Texture2D>("Blocks/sky"));           // 0
      tiles.Add(content.Load<Texture2D>("Blocks/grass_block"));   // 1
      tiles.Add(content.Load<Texture2D>("Blocks/dirt_block"));    // 2
      tiles.Add(content.Load<Texture2D>("Blocks/rock_block"));    // 3
}

我假设这些纹理是根据它们加载的顺序在那里分配数值的。在此之后,然后创建一个负责加载的方法,我猜分配瓦片数据:

void LoadMapData(string name)
{
      string path = name + ".txt";

      // Width and height of our tile array
      int width = 0;
      int height = File.ReadLines(path).Count();

      StreamReader sReader = new StreamReader(path);
      string line = sReader.ReadLine();
      string[] tileNo = line.Split(',');

      width = tileNo.Count();

      // Creating a new instance of the tile map
      tileMap = new int[height, width];
      sReader.Close();

      sReader = new StreamReader(path);

      for (int y = 0; y < height; y++)
      {
             line = sReader.ReadLine();
             tileNo = line.Split(',');

             for (int x = 0; x < width; x++)
             {
                 tileMap[y, x] = Convert.ToInt32(tileNo[x]);
             }
         }

         sReader.Close();
}

http://programming.nullanswer.com/forum/14791

前面提到的 link 是关于同一主题的问题,具有相同的教程代码。回答他问题的人对我个人来说有点太含糊了。我明白他的意思,只是我自己的经验不够丰富,无法详细说明他的建议。

重申一下,我的问题是我不确定 .txt 文件中的数据是如何分配给相应的图块值的。如果我知道这是如何完成的,那么我就能够为 .txt 文件中的这些图块分配某些值。具体来说,我想知道如何为 .txt 文件中的每个图块分配一个值,例如布尔值,无论它是否是实体,然后我可以继续创建一个 Collision() 方法来操作 '.相交的功能。

很抱歉,如果这是一个繁琐的问题,或者让人感到困惑,但我已经遇到了这个主题的瓶颈,需要一点帮助。

感谢您花时间阅读这个问题,

亲切的问候,奥利。

祝大家编码愉快! ^.^

如果要添加新图案,可以先将其添加到图块中:

void LoadTileTextures(ContentManager content)
{
      tiles = new List<Texture2D>();
      tiles.Add(content.Load<Texture2D>("Blocks/sky"));           // 0
      tiles.Add(content.Load<Texture2D>("Blocks/grass_block"));   // 1
      tiles.Add(content.Load<Texture2D>("Blocks/dirt_block"));    // 2
      tiles.Add(content.Load<Texture2D>("Blocks/rock_block"));    // 3
      tiles.Add(content.Load<Texture2D>("Blocks/new_block"));     // 4

}

然后您可以将 4 作为新值添加到要查看新块的 txt 文件中。 当然,你还应该创建 new_block Texture2D

如果你想避免多余的纹理那么你可以修改Draw方法:

public void Draw(SpriteBatch spriteBatch)
{
    for (int y = 0; y < tileMap.GetLength(0); y++)
    {
        for (int x = 0; x < tileMap.GetLength(1); x++)
        {
          if(tileMap[y,x] != 4)
            {
            spriteBatch.Draw(
                tiles[tileMap[y, x]],
                new Vector2(x * tileWidth, y * tileHeight),
                Color.White);
            }
        }
    }
}

不过,我想说创建透明纹理会使代码更易于阅读和将来维护。

听起来您快要用完这个特定的图块了 架构。

在您当前的代码中,图块只有一个 属性:纹理。因此,仅使用纹理列表来跟踪您的图块定义就足够了。但是,如果您想为图块添加其他属性(例如实心标志),您应该首先创建一个图块定义,该定义可以在您添加功能时进行扩展:

class TileDef
{
    public Texture2D Texture { get; set;}
    public bool IsSolid { get; set; }
}

您可能最终想从文件加载图块定义,但现在您可以通过编程方式创建它们,就像之前加载纹理一样:

// Replaces function LoadTileTextures
void LoadTileDefinitions(ContentManager content)
{
    tiles = new List<TileDef>();
    tiles.Add(new TileDef() {
        Texture = content.Load<Texture2D>("Blocks/sky"),
        IsSolid = false }); // 0
    tiles.Add(new TileDef() {
        Texture = content.Load<Texture2D>("Blocks/grass_block"),
        IsSolid = true}); // 1
    tiles.Add(new TileDef() {
        Texture = content.Load<Texture2D>("Blocks/dirt_block"),
        IsSolid = true}); // 2
    tiles.Add(new TileDef() {
        Texture = content.Load<Texture2D>("Blocks/rock_block"),
        IsSolid = true}); // 3
}

加载您的瓦片地图的逻辑保持不变,因为瓦片编号与之前没有变化。但是您必须更改绘图逻辑以寻找新的纹理 属性.