- XML:易于手动编辑,但是一旦开始加载大量数据,它就会变慢。
- SQLite:如果您想一次检索很多数据,甚至只是一小部分,这可能会更好。但是,除非您在游戏中的其他地方使用此功能,否则我认为这对于您的地图来说是过大的(并且可能过于复杂)。
我的建议是使用自定义二进制文件格式。在我的游戏中,我只有一种SaveMap
方法可以使用并保存每个字段BinaryWriter
。这也使您可以根据需要选择压缩它,并更好地控制文件大小。即节省short
代替int
,如果你知道它不会比32767大。在一个大循环,节省了一些作为short
,而不是一个int
可以意味着很多较小的文件大小。
另外,如果您采用这种方式,建议您在文件中的第一个变量为版本号。
例如,考虑一个地图类(非常简化):
class Map {
private const short MapVersion = 1;
public string Name { get; set; }
public void SaveMap(string filename) {
//set up binary writer
bw.Write(MapVersion);
bw.Write(Name);
//close/dispose binary writer
}
public void LoadMap(string filename) {
//set up binary reader
short mapVersion = br.ReadInt16();
Name = br.ReadString();
//close/dispose binary reader
}
}
现在,让我们说,你想一个新的属性添加到您的地图,说List
的Platform
对象。我之所以选择它,是因为它涉及更多。
首先,您增加MapVersion
并添加List
:
private const short MapVersion = 2;
public string Name { get; set; }
public List<Platform> Platforms { get; set; }
然后,更新保存方法:
public void SaveMap(string filename) {
//set up binary writer
bw.Write(MapVersion);
bw.Write(Name);
//Save the count for loading later
bw.Write(Platforms.Count);
foreach(Platform plat in Platforms) {
//For simplicities sake, I assume Platform has it's own
// method to write itself to a file.
plat.Write(bw);
}
//close/dispose binary writer
}
然后,这就是您真正看到好处的地方,更新load方法:
public void LoadMap(string filename) {
//set up binary reader
short mapVersion = br.ReadInt16();
Name = br.ReadString();
//Create our platforms list
Platforms = new List<Platform>();
if (mapVersion >= 2) {
//Version is OK, let's load the Platforms
int mapCount = br.ReadInt32();
for (int i = 0; i < mapCount; i++) {
//Again, I'm going to assume platform has a static Read
// method that returns a Platform object
Platforms.Add(Platform.Read(br));
}
} else {
//If it's an older version, give it a default value
Platforms.Add(new Platform());
}
//close/dispose binary reader
}
如您所见,该LoadMaps
方法不仅可以加载地图的最新版本,还可以加载旧版本!当它加载较旧的地图时,您可以控制它使用的默认值。