Работа с данными приложения (Handling an Application Data)
Содержание
Intro
Самый простой способ организовать работу с данными приложения - это создать систему работы с данными (data packaging system), которая будет ответственна за сохранение данных игры и их последующую загрузку.1Создаём класс cDataPackage
Создадим объект, который содержит буфер данных (data buffer) и добавим в него несколько функций, сохраняющих и загружающих данные:class cDataPackage { protected: // Буфер данных и его размер void *m_Buf; unsigned long m_Size; public: cDataPackage() { m_Buf=NULL; m_Size=0; } `cDataPackage() {Free();} void *Create(unsigned long Size) { // Освобождаем ранее созданный буфер Free (); // Выделяем память и возвращаем указатель return (m_Buf = (void*)new char[(m_Size = Size)]); } // Освобождаем ранее выделенную память void Free() { delete m_Buf; m_Buf = NULL; m_Size = 0; } BOOL Save(char *Filename) { FILE *fp; // Убедись, что есть, что записывать if(m_Buf != NULL && m_Size) { // Открываем файл, пишем размер данных и сами данные fwrite(&m_Size, 1, 4, fp); fwrite(m_Buf, 1, m_Size, fp); fclose(fp); return TRUE; } } return FALSE; void *Load(char *FileName, unsigned long *Size) { FILE *fp; // Освобождаем основной буфер Free() if((fp=open(Filename, "rb"))!=NULL { // Читаем размер данных и сами данные fread(&m_Size, 1, 4, fp); if((m_Buf = (void*) new char[m_Size]) != NULL) { fread(m_Buf, 1, m_Size, fp); fclose(fp); // Сохраняем возвращаемый размер данных if(Size != NULL) {*Size = m_Size;} // Возвращаем указатель return m_Buf; } return NULL; } } };
Класс cDataPackage содержит 4 функции (вообще, их 6, если считать конструктор и деструктор класса). Функция Create выделяет блок памяти размера, заданного в её параметре (Size). Функция Free освобождает данный блок памяти. Функции Save и Load сохраняет и загружает данный, используя указанное в параметре имя файла (filename). Обрати внимание, что функции Create и Load возвращают указатель на буфер данных. Можно подставить свой собственный указатель на буфер данных.
Пример реализации системы работы с данными
Допустим, ты хочешь создать систему работы с данными, которая хранит список имён и для этого ты хочешь использовать свою собственную структуру. Создав экземпляр класса cDataPackage и передав ему указатель на свою структуру, ты можешь быстро работать со списком имён. Вот пример такой системы:// Структура, содержащая имена typedef struct {char Name[32];}sName; int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int nCmdShow) { cDataPackage DP; DWORD Size; // Создаём систему работы с данными (data package) // и передаём ей указатель на созданный пользовательский тип структуры данных sName sName *Names = (sName*)DP.Create(64); // Раз уж у нас есть под каждое имя 64 байта, а каждое имя содержит 32 байта, // то можно сохранять двойные имена. strcpy(Names[0].Name, "Jim"); strcpy(Names[1].Name, "Adams"); // Сохраняем имена на жёсткий диск и освобождаем буфер данных DP.Save("names.dat"); DP.Free(); // Загружаем имена с жёсткого диска. Когда функция загрузки // вернёт значение, его размер будет 64 байт. Names = (sName*)DP.Load("names.dat", &Size); // Показываем имена на экране MessageBox(NULL, Names[0].Name, "1st Name", MB_OK); MessageBox(NULL, Names[1].Name, "2nd Name", MB_OK); // Освобождаем структуру данных (data package). DP.Free() }
Из кода видно, что 64-байтный буфер данных с именем делится на 2 блока по 32 байт каждый (См. Рис.1).
Итоги
Возможности применения на практике системы работы с данными огромны. Оперируя двумя маленькими объектами дата-пэкэджа (data package), мы можем создавать на них указатели, при этом держа все данные приложения в едином объекте, который может сам себя сохранять и загружать.Источники
1. Adams J. Programming Role Playing Games with DirectX 8.0. - Premier Press, 2002
Последние изменения страницы Вторник 21 / Июнь, 2022 20:57:04 MSK
Последние комментарии wiki