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

Popular posts from this blog

python - How to create a legend for 3D bar in matplotlib? -

java - Multi-Label Document Classification -

php - Dynamic url re-writing using htaccess -