- XML:手で簡単に編集できますが、大量のデータの読み込みを開始すると、速度が低下します。
- SQLite:大量のデータを一度に取得したい場合や、小さなチャンクだけを取得したい場合は、これが良いかもしれません。ただし、これをゲームの他の場所で使用している場合を除き、マップが過剰に機能していると思われます(おそらく複雑すぎます)。
私の推奨事項は、カスタムバイナリファイル形式を使用することです。私のゲームでは、をSaveMap
使用して各フィールドを通過して保存するメソッドがありますBinaryWriter
。これにより、必要に応じて圧縮することもでき、ファイルサイズをより細かく制御できます。つまり、32767より大きくならないことがわかってshort
いるint
場合は、代わりにを保存します。大きなループでは、何かをの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; }
次に、saveメソッドを更新します。
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
}
次に、これが実際にメリットが得られる場所です。ロード方法を更新します。
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
メソッドはマップの最新バージョンだけでなく、古いバージョンもロードできます!古いマップをロードすると、使用するデフォルト値を制御できます。