【问题标题】:Game level read from file in XNA从 XNA 中的文件读取游戏关卡
【发布时间】:2018-09-09 12:25:30
【问题描述】:

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

1111
0110
1001
1100

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

所以我需要的是能够分配一个与当前位置相对应的二维数组(文件中剩下多少字符,.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]);
    }
}

【问题讨论】:

  • 请不要在标题末尾添加“C#”之类的内容。这就是标签的用途。
  • 对不起,我只是想弄清楚是哪种语言。
  • 正如我所说,标签说明了一切。

标签: c# file xna


【解决方案1】:

由于严重的性能问题,您不想使用 2D 数组。

另外,您可能想在图块编号之间使用分隔符,像这样

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

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

为了使用一维数组,不要执行 myMap[x][y],而是执行 myMap[y*mapWidth+x]。

【讨论】:

  • 关心扩展二维数组的严重性能问题?您确定手动索引一维数组会给您带来什么好处吗?
  • 多维数组查找通常比使用 C# 中的常规数组慢几个数量级,是的,手动索引带来了很多好处。 OP 所说的数组类型实际上是一个“锯齿状”数组 ([][]) 而不是多维数组 ([,]),但是手动索引一维数组仍然有非常显着的性能提升。我确实相信这在 .NET4 中有所改进......
  • 分割字符串正是我所需要的,你对我的算法的数量限制有一点看法,我并没有真正考虑过。我暂时不会使用二维数组。谢谢。
  • 另一种避免数量限制的方法是对不同的块使用特殊字符。例如,将 '_' 设为平台或将 'O' 设为块,而 ' ' 只是空气。让您在编辑器中更轻松地可视化您的关卡,并提供与 ascii 字符一样多的块值。
【解决方案2】:

我转而使用 XML,以便更轻松地编辑和读取文件。这也为我提供了一种很好的方式来指示我的地图中一行图块的结束,以及一种简单的方法,可以在读者将其加载到游戏中之前预先确定我的地图有多少列/行。

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

【讨论】:

  • 我去看看,谢谢。我不确定我现在是否真的想使用 XML,但我相信我将来会这样做
  • 请记住,XML 是一种需要很长时间才能解析的格式,从而增加了加载时间。
【解决方案3】:

虽然逗号是最好的方法,但如果事物是​​固定长度的,您也可以使用 .substring 将其分开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    相关资源
    最近更新 更多