質問
小さなモデルビューアを作成し、DirectXの機能をテストするために、ゲームのマップ/モデルファイルの内容をプログラムに読み取ろうとしています。モデル/マップファイル形式は本質的にチャンクされており、これらのファイルの形式を知っています。次のようなアプローチを使用して、個々のチャンクを解析することでファイルを簡単に読み取ることができます。
class FileType1 {
private Chunk1 c1;
private Chunk2 c2; // etc
public void Read(BinaryReader reader) {
c1 = new Chunk1(reader);
c2 = new Chunk2(reader);
}
}
ただし、読者がファイルが適切な構造であることを確認できるように、ファイルが準拠する形式(つまり、Chunk1の後にChunk2など)を指定することにより、これらのファイルを一般的に読み取る方法を考えています。 ChunkスーパークラスとChunkファクトリを使用して、任意のファイルのすべてのチャンクを一般的に読み取ることができます。基本的に、構造バリデーター(または同様のもの)の追加機能でこれを強化して、次のようなメソッドを作成したいと思います。
public void Read(BinaryReader reader, ChunkFileFormat format) {
while (!EOF) {
char[] chunkID = reader.ReadChars(4);
Chunk c = chunkFactory.Create(chunkID);
if (c.GetType() != format.Next.GetType())
throw new Exception("File format is invalid");
format.SetCurrentRecord(c);
}
}
ここでの考え方は、ChunkFileFormatクラスがファイルの構造を指定して、バイナリストリームから次に読み込まれるチャンクタイプを示すことです。これにより、ChunkFileFormatのサブクラスがその特定の形式のレイアウトを指定できるようになり、単一の読み取りメソッドを使用して、それぞれに長い繰り返しのメソッドを記述するのではなく、すべての異なるチャンクファイル形式を読み取ることができます。
私の質問は、この状況に対処できる設計パターンやアプローチを知っている人はいますか?私が取り組んでいるプロジェクトは現在C#で行われていますが、C ++(またはその他の言語)のソリューションに興味があります。
事前に感謝します!
解決
これらの種類のルールは、有限状態マシンを使用して簡単にコーディングできます。
>各チャンクは、現在の状態を変更する必要があります。各状態は、後で特定のチャンクを待機します。現在では遭遇しないはずのチャンクに遭遇した場合、それはエラーです。
他のヒント
DataScript / antlrを使用して形式の正式な説明を作成し、解析およびI / Oコード(JavaまたはC ++)を作成することができます。