Создание файла хранения ресурсов в играх
Этот пример демонстрирует, как можно сохранить в файле имя, дату, размер файла, а также изображение, которое хранилось в JPG файле. Для начала поместите на форму две кнопки (Button1 и Button2) и компонент TImage (Image1). Поместите следующий код в секцию кода формы:
// Сохранение любых ресурсов в файле записи unit Unit1; interface uses JPEG, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Buttons, ImgList, ComCtrls, ToolWin; type TForm1 = class(TForm) Button1: TButton; // Кнопка для записи JPG файла в файл записи Button2: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} type TJPGRecord = Record // Это пример записи, которая хранит имя, размер, // дату и байты файла JPG Name : String [255]; Date : String [10]; Size : LongWord; // В Delphi 4.0 используйте Cardinal вместо LongWord ImgBytes : Pointer; end; const CRecFile = 'D:\Resource.rec'; CJPGFile = 'D:\test.jpg'; // файл должен быть LenName = 255; LenDate = 10; procedure TForm1.Button1Click(Sender: TObject); var FHandle : Integer; Resource : TJPGRecord; begin // Эта процедура хранит любой файл непосредственно в файле записи FHandle := FileOpen (CJPGFile, fmOpenRead); // Открываеам файл JPG и назначаем дескриптор with Resource do begin Name := ExtractFileName (CJPGFile); // Заполняем имя файла JPG Date := DateToStr (FileDateToDateTime (FileAge (CJPGFile))); // Заполняем дату файла JPG Size := FileSeek (FHandle, 0, 2); // Заполняем размер файла JPG GetMem (ImgBytes, Size); // Назначить память для указателя FileSeek (FHandle, 0, 0); // Переместиться в начало файла FileRead (FHandle, ImgBytes^, Size); // Чтение байтов JPG файла FileClose (FHandle); // Освободить дескриптор JPG файла FHandle := FileCreate (CRecFile); // Создаем открытый файл записи FileWrite (FHandle, Name, LenName); // Записываем имя FileWrite (FHandle, Date, LenDate); // Записываем дату FileWrite (FHandle, Size, SizeOf (Size)); // Записываем размер FileWrite (FHandle, ImgBytes^, Size); // Записываем изображение JPG FileClose (FHandle); FreeMem (ImgBytes, Size); // Освободить указатель end; end; procedure TForm1.Button2Click(Sender: TObject); var FHandle : Integer; Resource : TJPGRecord; JPGImage : TJPEGImage; MStream : TMemoryStream; begin // Зта процедура читает файл JPG, сохраненный в файле записи и отображает его FHandle := FileOpen (CRecFile, fmOpenRead); // Открываем файл записи и назначаем ему дескриптор with Resource do begin FileSeek (FHandle, 0, 0); // Переместиться в начало файла FileRead (FHandle, Name, LenName); // Читаем имя, сохраненное в файле записи FileRead (FHandle, Date, LenDate); // Читаем дату, сохраненную в файле записи FileRead (FHandle, Size, SizeOf (Size)); // Читаем размер файла, сохраненный в файле записи GetMem (ImgBytes, Size); // Назначить память для указателя FileRead (FHandle, ImgBytes^, Size); // Читаем файл JPG, сохраненные в файле записи FileClose (FHandle); // Освободить дескриптор файла JPG MStream := TMemoryStream.Create; // Создать поток памяти MStream.Write (ImgBytes^, Size); // Заполнить память с указателя MStream.Seek (0, 0); // Переместиться в начало потока памяти JPGImage := TJPEGImage.Create; JPGImage.LoadFromStream (MStream); // Выводим изображение Image1.Picture.Assign (JPGImage); FreeMem (ImgBytes, Size); // Освободить указатель JPGImage.Free; // Освободить объект MStream.Free; // Освободить поток end; end; end.
Вот и все! Теперь можно сохранять промежуточные результаты игры в файле на диске, а также в нужный момент загружать их.
Комментарии