Загрузка...
 
Печать

Работа с данными приложения (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).
Image
Рис.1 Размер буфера данных (64 байта) достаточен для сохранения в нём обоих частей имени персонажа. Каждая из частей имени хранится в отдельном сегменте, размер которого 32 байт


Итоги

Возможности применения на практике системы работы с данными огромны. Оперируя двумя маленькими объектами дата-пэкэджа (data package), мы можем создавать на них указатели, при этом держа все данные приложения в едином объекте, который может сам себя сохранять и загружать.

Источники


1. Adams J. Programming Role Playing Games with DirectX 8.0. - Premier Press, 2002


Последние изменения страницы Вторник 21 / Июнь, 2022 20:57:04 MSK

Последние комментарии wiki

No records to display

Search Wiki Page

Точное совпадение

Категории

|--> C#
|--> C++