bmp - Creating a custom file-type in C++ -
i making level editor needs output custom map file use source code write graphics library.
my question is: need bear in mind when deciding how structure custom file type? how can encode standard bitmap image file (the tile set) can contained in single file rather 2 files; map file , tile set (.bmp file).
thanks.
first need design file layer, need fixed size data determine how decode variable data, example, first 4 bytes read tell how many tiles there are, next 4 bytes tell how many map files there are, after example have first file, have define file information, eg file , how many bytes is, know how many bytes you're away next file entry, etc...
you can use structures , overload ofstream operators << , >> create own filetype, i did myself when creating replay system need speed underground 2.
struct point4d { float x, y, z, w; }; struct point3d { float x, y, z; }; struct point2d { float x, y; }; struct quatrot { point4d front;//frontvector point4d right;//rightvector point4d up;//upvector }; #define nfs_max_vehicles (14)//seriously 14.. (including player) struct vehicleinfo { //type name array offset float unknown_01 [8]; //0x0 point3d pos; //0x20 float unknown_02; //0x2c quatrot rotation; //0x30 point3d unknown_03; //0x60 float unknown_04; //0x6c point3d velocity; //0x70 float unknown_05; //0x7c point3d turnspeed; //0x80 float unknown_06; //0x8c float speedandbrakeaccelerator; //0x90 float unknown_07 [3]; //0x94 point3d unknown_08; //0xa0 float unknown_09; //0xac point4d unknown_10 [5]; //0xb0 float unknown_11 [20]; //0x100 float unknown_12_is_zero_when_accelerating; //0x150 //end of structure...? }; std::ostream& operator<<(std::ostream& stream, const vehicleinfo &info); //overload << , >> operators on "vehicleinfo" type std::ofstream& operator<<(std::ofstream& stream, vehicleinfo &info); std::ifstream& operator>>(std::ifstream& stream, vehicleinfo &info); //overload << , >> operators on "frameinfo" type std::ofstream& operator<<(std::ofstream& stream, recorder::frameinfo &info); std::ifstream& operator>>(std::ifstream& stream, recorder::frameinfo &info); namespace recorder { struct frameinfo//1392 bytes / frame | max 167040 bytes @ 120 fps | 9.56 mb / min max { std::chrono::high_resolution_clock::duration time; vehicleinfo vehicle; int nitro; float rpm; float turbo; int currentgear; keymanager keys[256]; }; }; std::ofstream& operator<<(std::ofstream& stream, vehicleinfo &info) { stream.write(reinterpret_cast<char*>(&info.unknown_01[0]), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.unknown_01[1]), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.unknown_01[2]), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.unknown_01[3]), sizeof(float)); //... stream.write(reinterpret_cast<char*>(&info.unknown_11[18]), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.unknown_11[19]), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.unknown_11[20]), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.unknown_12_is_zero_when_accelerating), sizeof(float)); return stream; } std::ifstream& operator>>(std::ifstream& stream, vehicleinfo &info) { stream.read(reinterpret_cast<char*>(&info.unknown_01[0]), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.unknown_01[1]), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.unknown_01[2]), sizeof(float)); //..... stream.read(reinterpret_cast<char*>(&info.unknown_11[16]), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.unknown_11[17]), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.unknown_11[18]), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.unknown_11[19]), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.unknown_11[20]), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.unknown_12_is_zero_when_accelerating), sizeof(float)); return stream; } std::ofstream& operator<<(std::ofstream& stream, recorder::frameinfo &info) { stream.write(reinterpret_cast<char*>(&info.time), sizeof(std::chrono::high_resolution_clock::duration)); stream << info.vehicle; stream.write(reinterpret_cast<char*>(&info.nitro), sizeof(int)); stream.write(reinterpret_cast<char*>(&info.rpm), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.currentgear), sizeof(int)); stream.write(reinterpret_cast<char*>(&info.turbo), sizeof(int)); for(int = 0; < 256; ++i) { stream.write(reinterpret_cast<char*>(&info.keys[i].pressed), sizeof(bool)); stream.write(reinterpret_cast<char*>(&info.keys[i].released), sizeof(bool)); stream.write(reinterpret_cast<char*>(&info.keys[i].down), sizeof(bool)); stream.write(reinterpret_cast<char*>(&info.keys[i].up), sizeof(bool)); } return stream; } std::ifstream& operator>>(std::ifstream& stream, recorder::frameinfo &info) { stream.read(reinterpret_cast<char*>(&info.time), sizeof(std::chrono::high_resolution_clock::duration)); stream >> info.vehicle; stream.read(reinterpret_cast<char*>(&info.nitro), sizeof(int)); stream.read(reinterpret_cast<char*>(&info.rpm), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.currentgear), sizeof(int)); stream.read(reinterpret_cast<char*>(&info.turbo), sizeof(int)); for(int = 0; < 256; ++i) { stream.read(reinterpret_cast<char*>(&info.keys[i].pressed), sizeof(bool)); stream.read(reinterpret_cast<char*>(&info.keys[i].released), sizeof(bool)); stream.read(reinterpret_cast<char*>(&info.keys[i].down), sizeof(bool)); stream.read(reinterpret_cast<char*>(&info.keys[i].up), sizeof(bool)); } return stream; } /// std::stringstream& operator<<(std::stringstream& stream, vehicleinfo &info) { stream.write(reinterpret_cast<char*>(&info.unknown_01[0]), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.unknown_01[1]), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.unknown_01[2]), sizeof(float)); //... stream.write(reinterpret_cast<char*>(&info.unknown_11[19]), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.unknown_11[20]), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.unknown_12_is_zero_when_accelerating), sizeof(float)); return stream; } std::stringstream& operator>>(std::stringstream& stream, vehicleinfo &info) { stream.read(reinterpret_cast<char*>(&info.unknown_01[0]), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.unknown_01[1]), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.unknown_01[2]), sizeof(float)); //.... stream.read(reinterpret_cast<char*>(&info.unknown_11[20]), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.unknown_12_is_zero_when_accelerating), sizeof(float)); return stream; } std::stringstream& operator<<(std::stringstream& stream, recorder::frameinfo &info) { stream.write(reinterpret_cast<char*>(&info.time), sizeof(std::chrono::high_resolution_clock::duration)); stream << info.vehicle; stream.write(reinterpret_cast<char*>(&info.nitro), sizeof(int)); stream.write(reinterpret_cast<char*>(&info.rpm), sizeof(float)); stream.write(reinterpret_cast<char*>(&info.currentgear), sizeof(int)); stream.write(reinterpret_cast<char*>(&info.turbo), sizeof(int)); for(int = 0; < 256; ++i) { stream.write(reinterpret_cast<char*>(&info.keys[i].pressed), sizeof(bool)); stream.write(reinterpret_cast<char*>(&info.keys[i].released), sizeof(bool)); stream.write(reinterpret_cast<char*>(&info.keys[i].down), sizeof(bool)); stream.write(reinterpret_cast<char*>(&info.keys[i].up), sizeof(bool)); } return stream; } std::stringstream& operator>>(std::stringstream& stream, recorder::frameinfo &info) { stream.read(reinterpret_cast<char*>(&info.time), sizeof(std::chrono::high_resolution_clock::duration)); stream >> info.vehicle; stream.read(reinterpret_cast<char*>(&info.nitro), sizeof(int)); stream.read(reinterpret_cast<char*>(&info.rpm), sizeof(float)); stream.read(reinterpret_cast<char*>(&info.currentgear), sizeof(int)); stream.read(reinterpret_cast<char*>(&info.turbo), sizeof(int)); for(int = 0; < 256; ++i) { stream.read(reinterpret_cast<char*>(&info.keys[i].pressed), sizeof(bool)); stream.read(reinterpret_cast<char*>(&info.keys[i].released), sizeof(bool)); stream.read(reinterpret_cast<char*>(&info.keys[i].down), sizeof(bool)); stream.read(reinterpret_cast<char*>(&info.keys[i].up), sizeof(bool)); } return stream; }
Comments
Post a Comment