我如何访问 .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
}
加载您的瓦片地图的逻辑保持不变,因为瓦片编号与之前没有变化。但是您必须更改绘图逻辑以寻找新的纹理 属性.
好吧,一开始你可能在想; "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
}
加载您的瓦片地图的逻辑保持不变,因为瓦片编号与之前没有变化。但是您必须更改绘图逻辑以寻找新的纹理 属性.