C# 从XNA中的文件读取游戏级别

C# 从XNA中的文件读取游戏级别,c#,file,xna,C#,File,Xna,我一直在为我在XNAC#中的游戏项目开发一个基于平铺的地图引擎。与大多数其他系统一样,该系统使用一个数字,该数字对应于映射到屏幕上特定位置的瓷砖集中的瓷砖。这很好,但要求屏幕上的每个单元格都手动输入一个数字。相反,我决定从一个.txt文件中读取级别布局,该文件包含每个磁贴在它将位于ingame位置的编号,如下所示: 1111 0110 1001 1100 其中1是草,0是土。同样,我知道这是一种常见的技术。我编写的代码可以读取每一行,并将第一列中的下一个位置设置为相应的平铺图形。这很好,但对地

我一直在为我在XNAC#中的游戏项目开发一个基于平铺的地图引擎。与大多数其他系统一样,该系统使用一个数字,该数字对应于映射到屏幕上特定位置的瓷砖集中的瓷砖。这很好,但要求屏幕上的每个单元格都手动输入一个数字。相反,我决定从一个.txt文件中读取级别布局,该文件包含每个磁贴在它将位于ingame位置的编号,如下所示:

1111
0110
1001
1100
其中1是草,0是土。同样,我知道这是一种常见的技术。我编写的代码可以读取每一行,并将第一列中的下一个位置设置为相应的平铺图形。这很好,但对地图的其余部分没有帮助。我一直在搜索,无法找到如何将一行中的每个数字拆分为单独的数字,以便第一行的读数为(0,0)=1,(0,1)=1,等等,这样我就可以将坐标与地图上的x和y位置相匹配,并将值与瓷砖类型相匹配

因此,我需要的是能够分配一个与当前位置相对应的2d数组(文件中还有多少个字符,.txt文件中有多少行),这样我就可以为级别ie中的每个磁贴运行两个分支for循环(x和y):

for (x=0; x<levelwidth; x++)
{
    for (y=0; y<levelheight; y++)
    {
        Row[x].Column[y].Tile = Convert.ToInt32(filepos[x,y]);
    }
}

for(x=0;x由于严重的性能问题,您不想使用2D数组

另外,您可能希望在平铺编号之间使用分隔符,如下所示

1,1,1,1
1,0,1,1
有两个原因:1可以使用10多个不同的分幅,2然后可以使用String.Split()和Int.Parse()获取分幅ID并构建地图


为了使用1D数组,您可以使用myMap[y*mapWidth+x]而不是myMap[x][y].

我改为使用XML,这样我可以更容易地编辑和读取文件。这也为我提供了一种很好的方法来指示地图中一行瓷砖的结尾,以及一种简单的方法,可以在阅读器将地图加载到游戏中之前预先确定我的地图有多少列/行


代码的示例可以在我的网站上的“”示例中找到,它可能会帮助您了解如何更改当前的方法。

而逗号是您也可以使用的最佳方法。如果事情是固定长度的,则使用子字符串将其拆开。

请不要添加“C”之类的内容这就是标签的作用。很抱歉,我只是想弄清楚是哪种语言。正如我所说的,标签很清楚。是否想进一步讨论2d数组的严重性能问题?是否确定手动索引1d数组会给您带来任何好处?多维数组查找通常是数量级的与使用C#中的常规数组相比,手动索引带来了很多好处。数组OP的类型实际上是一个“锯齿”数组([]),而不是多维数组([,]),但手动索引1D数组仍然有非常显著的性能提升。我相信这在.NET4中有所改进。不过…拆分字符串正是我所需要的,而且您对我的算法的数字限制有一点看法,我并没有真正考虑到这一点。我暂时不使用2d数组。谢谢。另一个way避免数字限制的方法是为不同的块使用特殊字符。例如,将“uu”设为平台或“O”设为块,并将“”设为air。这样可以更容易地在编辑器中显示级别,并提供与ascii字符相同的块值。我会看一看,谢谢。我不确定是否真的要在m处使用XML这是个好兆头,但我相信我将来会记住XML是一种需要很长时间才能解析的格式,这会增加加载时间。