如何访问.txt文件中的数据以在XNA中分配具有某些属性的特定磁贴

本文关键字:分配 属性 XNA 访问 何访问 txt 数据 文件 | 更新日期: 2023-09-27 17:52:59

好的,一开始你可能会想;"哦,太好了,问这个问题的人之前没有研究过这个问题……"

我向你保证,我已经彻底研究了这个话题,但我的具体问题没有多少运气。我的问题是,我已经阅读了这篇教程,它成功地允许我创建一个简单的。txt文件来处理关卡的布局,然后可以通过迭代读取整数值,并最终在屏幕上绘制相应的贴图纹理。

在上面链接的教程中,基本上发生的事情是创建一个Map.cs类,它最终负责加载贴图纹理:

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

前面提到的链接是一个关于相同主题的问题,使用相同的教程代码。回答他问题的人对我个人来说有点太含糊了。我明白他的意思,只是我没有足够的经验来详细说明他的建议。

只是重申一下,我的问题是,我不完全确定如何在.txt文件中的数据被分配到相应的平铺值。如果我知道这是如何完成的,那么我就能够为.txt文件中的这些磁贴分配特定的值。具体来说,我想知道如何为.txt文件中的每个tile(如布尔值)分配一个值,无论它是否是实体,所以我可以继续创建一个Collision()方法来操纵'。相交的功能。

对不起,如果这是一个加载的问题,或者遇到困惑,但我已经达到了这个主题的墙,需要一点帮助。

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

致以亲切的问候,奥利。

祝大家编码快乐!^ . ^

如何访问.txt文件中的数据以在XNA中分配具有某些属性的特定磁贴

听起来你已经快撑不下去了架构。

在你当前的代码中,贴图只有一个属性:纹理。因此,通过使用纹理列表来跟踪tile定义就足够了。但是如果你想给你的贴图添加额外的属性(例如一个实心标志),你应该先创建一个可以随着你添加特性而扩展的贴图定义:

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
}

加载贴图的逻辑保持不变,因为贴图的编号没有改变。但是你必须改变绘图逻辑来寻找新的纹理属性

如果你想添加新的图案,你可以先添加到tile:

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);
            }
        }
    }
}

虽然,我想说创建透明纹理使代码在将来更容易阅读和维护。