如何访问.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()方法来操纵'。相交的功能。
对不起,如果这是一个加载的问题,或者遇到困惑,但我已经达到了这个主题的墙,需要一点帮助。
感谢您花时间阅读这个问题,
致以亲切的问候,奥利。
祝大家编码快乐!^ . ^
听起来你已经快撑不下去了架构。
在你当前的代码中,贴图只有一个属性:纹理。因此,通过使用纹理列表来跟踪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);
}
}
}
}
虽然,我想说创建透明纹理使代码在将来更容易阅读和维护。