2015-06-03 21 views
1

好的,起初你可能会想; “哦,太好了,另一个问题在那里的家伙问以前没有研究这个......”如何访问.txt文件中的数据以在XNA中分配具有特定属性的特定图块?

我向你保证,我已经研究这个话题深入,没有太大的运气与我的具体问题。我的问题是我已经阅读了this教程,该教程成功地允许我创建一个简单的.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()方法。相交'功能。

很抱歉,如果这一直是一个加载的问题,或遇到困惑,但我已经达到了这个话题,需要一点点的援助在墙上。

感谢您抽出宝贵时间阅读这个问题,

亲切的问候,奥利。

快乐的编码大家!^^

+0

您应该将blockIndex'0'分配给空白区域。除了'0'以外,还有瓦片索引。这样你的值总是有'width * height'。所以做一些像:'tileMap [y,x] = Convert.ToInt32(tileNo [x] -1);'但是你应该在分配它们之前检查索引边界。 –

+0

谢谢你的回应如此之快,我应该说我是新来的游戏编程,我不知道如何设置一个空的空间。你添加到列表中吗? tiles.Add(...)?你怎么说它是一个空的空间?谢谢。 – HairySeal

+0

只需创建索引所在的地图数组。当索引为'0'时,这意味着你不应该画任何东西。在绘制时,你使用类似(伪)'for y - >来表示x - > if(map [y,x]!= 0)DrawTile(y,x,map [y,x]);'所以,在绘制地图内。 –

回答

0

这听起来像你对中长出这个特殊的瓷砖 架构的边缘。

在您当前的代码中,图块只有一个属性:纹理。因此,仅使用纹理列表就可以跟踪您的图块定义。但是,如果你想要更多的属性添加到您的砖(例如坚实的标志),你应该通过创建一个平铺定义,可以为你增加新的功能进行扩展开始:

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 
} 

加载您的瓦片地图的逻辑保持不变,因为片号没有从改变之前。但是您必须更改绘图逻辑才能查找新的Texture属性。

+0

谢谢RogerN,这让我对这种情况更有条理,更有活力的方法有了深刻的认识。 – HairySeal

0

如果要添加新的模式,可以先将其添加到地砖:

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文件新块。 Ofcourse,您还应该创建new_block的Texture2D

如果你想避免额外的质感,那么你可以修改绘制方法:

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

虽然,我会说创造了TRANSPARANT质地使代码更容易在未来阅读和保存。

+0

是的,谢谢你的回应,我知道如何导入这些纹理,并将其添加到列表中,并且new_block在.txt文件中的数值为4。我很好奇你如何将一个empty_block添加到列表中,而没有真正绘制一个alpha值为0的块,因为显然这是多余的并且使用了不必要的内存。我如何获得有关访问这些值,所以以伪代码术语:如果.txt文件中的整数等于1,请将isSolid设置为true ...如何访问这些值? – HairySeal

+0

当地图[y,x]为0时,您应该进行查找。如果它是'!= 0',只需使用map [y,x] -1作为索引。 –

+0

在答案中查看我的编辑 – Nader

相关问题