私は、このようなトピックに関する情報を探すのに数え切れないほどの時間を費やしてきました。C++ で SDL を使用して、楽しみのために独自のカスタム ゲーム エンジンを作成しています。ゲーム内リソースを管理するカスタム バイナリ ファイルを作成しようとしています。これまでのところ、ファイルに配置するオブジェクトの各「タイプ」を保存する際に、ベクトルを適切に再生することができませんでした。そこで、ベクトルを使用するという考えを捨てて、配列に行きました。ベクトルまたは配列の両方を使用する例を以下に示します。そのため、最初にファイルのヘッダーを作成します。構造体は次のとおりです。
struct Header
{
const char* name; // Name of Header file
float version; // Resource version number
int numberOfObjects;
int headerSize; // The size of the header
};
次に、ヘッダーを作成した後、オブジェクトをメモリに格納する方法を定義する別の構造体があります。ここにあります:
struct ObjectData{
int id;
int size;
const char* name;
// std::vector<char> data; // Does not work very well
// unsigned char* data; // Also did not
// Also does not work, because I do not know the size yet until I have the data.
// char data[]
};
この構造体の主な問題は、ベクターがうまく動作しないこと、unsigned char ポインターが問題を引き起こし続けること、コンパイラーが変数配列を好まないために char データの配列 (16 進数ストレージ用) が機能しないことです。
最後の構造体は、私のリソース ファイル構造です。
struct ResourceFile
{
Header header;
int objectCount;
// Again, vectors giving me issues because of how they are constructed internally
// std::vector<ObjectData> objectList;
// Below does not work because, again, no variable data types;
// ObjectData objects[header.numberOfObjects]
};
私の目標は、単一の構造体をバイナリ ファイルに書き出せるようにすることです。そのようです:
Header header;
header.name = "Resources.bin";
header.version = 1.0f;
header.headerSize = sizeof(header);
//vector<char> Object1 = ByteReader::LoadFile("D:\\TEST_FOLDER\\test.obj");
//vector<char> Object2 = ByteReader::LoadFile("D:\\TEST_FOLDER\\test.obj");
ObjectData cube;
cube.id = 0;
cube.name = "Evil Cubie";
cube.data = ByteReader::LoadFile("D:\\TEST_FOLDER\\test.obj");
cube.size = sizeof(cube.id) + sizeof(cube.name) + cube.data.size();
ofstream resourceFile("D:\\TEST_FOLDER\\Resources.bin", ios::out|ios::app|ios::binary);
resourceFile << header.name << header.version << header.headerSize;;
resourceFile << cube.id << cube.name << cube.size;
for each (char ch in cube.data)
{
resourceFile << ch;
}
resourceFile.close();
/*
ObjectData cube2;
cube.id = 1;
cube.name = "Ugle Cubie";
for each (char ch in Object1)
{
cube.object.push_back(ch);
}
*/
//resourceFile.data.push_back(cube);
//resourceFile.data.push_back(cube2);
//resourceFile.header.numberOfObjects = resourceFile.data.size();
//FILE* dat = fopen(filename, "wb");
//fwrite(&resourceFile, sizeof(resourceFile), 1, dat); // <-- write to resource file
//fclose(dat);
上記で気づいたように、私は2つの異なる方法を試しました. 私が最初に試した方法は、古き良き fwrite を使用することでした。2 番目の方法は、ofstream によって受け入れられるフラグを介してコンピューターにバイナリで書き込むように指示したにもかかわらず、バイナリで書き込むことさえありませんでした。
私の目標は、コードを次のように流暢に動作させることでした。
ResourceFile resourceFile;
resourceFile.header.name = "Resources.bin";
resourceFile.header.version = 1;
resrouceFile.header.numberOfObjects = 2;
resourceFile.header.headerSize = sizeof(resourceFile.header);
ObjectData cube;
ObjectData cube2;
resourceFile.data.push_back(cube);
resourceFile.data.push_back(cube2);
resourceFile.header.numberOfObjects = resourceFile.data.size();
FILE* dat = fopen(filename, "wb");
fwrite(&resourceFile, sizeof(resourceFile), 1, dat); // <-- write to resource file
fclose(dat);
まだ葉巻はありません。ポインター (しゃれは意図されていません) またはリソースマネージャーの適切な例を持っている人はいますか?