Для хранения любых ресурсов в играх можно использовать следующий метод: создаем запись с полями, которые нужно сохранить и записываем эту запись в файл, который будет храниться на диске. В нужный момент мы просто читаем этот файл и получаем сохраненные данные.
Этот пример демонстрирует, как можно сохранить в файле имя, дату, размер файла, а также изображение, которое хранилось в 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.
Вот и все! Теперь можно сохранять промежуточные результаты игры в файле на диске, а также в нужный момент загружать их.
|