Карта сайтаСсылкиКонтакты

Хостинг


Создание файла хранения ресурсов в играх

PDF Печать
Статьи

Для хранения любых ресурсов в играх можно использовать следующий метод: создаем запись с полями, которые нужно сохранить и записываем эту запись в файл, который будет храниться на диске. В нужный момент мы просто читаем этот файл и получаем сохраненные данные.


Этот пример демонстрирует, как можно сохранить в файле имя, дату, размер файла, а также изображение, которое хранилось в 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.

Вот и все! Теперь можно сохранять промежуточные результаты игры в файле на диске, а также в нужный момент загружать их.


 

Добавить комментарий


Защитный код
Обновить