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

时间:2012-02-11 18:30:11

标签: c# file xna

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

1111
0110
1001
1100

其中1是草,0是污垢。我再次意识到这是一种常见的技术。我编写的代码可以读取每一行,并将第一列中的下一个位置设置为相应的图块图形。这很好,但它对地图的其余部分没有帮助。我一直在搜索,无法找到如何将一行中的每个数字拆分成一个单独的数字,以便第一行读取(0,0)= 1,(0,1)= 1等,所以我可以然后将坐标与地图上的x和y位置匹配,并将值与tile的类型相匹配。

所以我需要的是能够分配对应于当前位置的2d数组(文件中剩余多少个字符,.txt文件中有多少行),所以我可以运行两个分支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]);
    }
}

3 个答案:

答案 0 :(得分:1)

由于性能问题严重,您不想使用2D阵列。

此外,您可能希望在图块编号之间使用分隔符,例如

1,1,1,1
1,0,1,1

有两个原因; 1你可以使用超过10个不同的图块,然后你可以使用String.Split()和Int.Parse()来获取你的图块ID并构建地图。

为了使用一维数组而不是做myMap [x] [y],你可以做myMap [y * mapWidth + x]。

答案 1 :(得分:0)

我转而使用XML,以便我可以更轻松地编辑和读取文件。这也给了我一个很好的方法来指示我的地图中一排瓷砖的结束,以及一种简单的方法来预先确定我的地图在阅读器在游戏中加载它之前有多少列/行。

代码的示例可以在我的网站上的“Looks Level to Me”示例中找到,它可能有助于获得有关如何更改当前方法的一些想法。

答案 2 :(得分:0)

虽然逗号是最好的方法,但如果事物的长度固定,你也可以使用.substring来区分它。