Динамическая загрузка спрайтов

Динамическая загрузка спрайтов
Если делать игру с большим количеством графических изображений, то неразумно будет загружать их все сразу, например зачем в основном меню игры графика босса с последнего уровня? А вот памяти его "фото" будет жрать! Чтобы этого не происходило, необходимо разделить всю игру на сцены, и просто при загрузке конкретной сцены удалять из памяти ненужные картинки и загружать туда только те которые в этой сцене используются. Делаем это так:
При загрузке сцены пишем:
LoadPicData(DxImagelist1, 'Menu');
* Вместо DxImagelist1 имя вашего TdxImageLista
* 'Menu' - Тут название файла со списком используемых картинок данной сцены
Формат файла со списком такой:
 [название] (название одинаково с именем файла, только без расширения)
 PictureHeight=800 (Высота картинки)
 PictureWidth=600 (Ширина картинки)
 PatternHeight=0 (Высота кадра (если в картинке несколько кадров)) 
 PatternWidth=0 (Ширина кадра)
 SkipHeight=0 (Пропуск высоты, пусть останеться 0)
 SkipWidth=0 (Пропуск ширины, пусть останеться 0)
 SystemMemory=0 (Пока не надо, пусть останеться 0)
 Transparent=0 (Прозрачен или нет)
 TransparentColor=clBlack (Цвет прозрачности)
Например кусочек файла "game.dat":
 [enemy]
 PictureHeight=96
 PictureWidth=192
 PatternHeight=0
 PatternWidth=48
 SkipHeight=0
 SkipWidth=0
 SystemMemory=0
 Transparent=1
 TransparentColor=$00FF8040
При этом файлы должны лежать в папке Pictures\Bmp (если они Bitmapы) или Pictures\Jpg (если они в Jpeg).
Ещё файлы со списком должны лежать в Pictures\Data
А вот и сама процедура загрузки:
PS. В USES надо дописать DIB, Jpeg, iniFiles
procedure TForm1.LoadPicData(var DXImageList: TDXImageList; FileName: string);
var
 i: Integer;
 Item: TPictureCollectionItem;
 SectionName: string;
 Ident: string;
 NewGraphic: TDIB;
 BitMap: TBitMap;
 PicFileName: string;
 SectionList: TStringList;
 JpgImg: TJPEGImage;
 Ext: string;
 function GetName(InDir, InFileName: string): string;
 begin
 Result := ExtractFilePath(Application.ExeName) + InDir + '\' + InFileName;
 end;
begin
 DXImageList.Items.Clear; // Очищаем память от картинок
 FileName := ChangeFileExt(FileName, '.dat');
 NewGraphic := TDIB.Create;
 BitMap := TBitMap.Create;
 SectionList := TStringList.Create;
 try
 // Читаем файл со списком изображений
 with TIniFile.Create(GetName('Pictures\data', FileName)) do
 try
 ReadSections(SectionList);
 for i := 0 to SectionList.Count-1 do
 begin
 SectionName := SectionList[i];
 // Пытаемся определить формат картинки
 Ext := 'bmp';
 PicFileName := GetName('Pictures', Ext + '\' + SectionName + '.' + Ext);
 if FileExists(PicFileName) then
 NewGraphic.LoadFromFile(PicFileName);
 else
 if not (FileExists(PicFileName)) then
 begin
 Ext := 'jpg';
 PicFileName := GetName('Pictures\Jpg\', SectionName + '.' + Ext);
 JpgImg := TJPEGImage.Create;
 try
 JpgImg.LoadFromFile(PicFileName);
 NewGraphic.Assign(JpgImg);
 finally
 JpgImg.Free;
 end;
 end;
 // Добавляем картинку в память
 Item := TPictureCollectionItem.Create(DXImageList.Items);
 Item.Picture.Graphic := NewGraphic;
 Item.Name := SectionName;
 Item.PatternHeight := ReadInteger(SectionName, 'PatternHeight', 0);
 Item.PatternWidth := ReadInteger(SectionName, 'PatternWidth', 0);
 Item.SkipHeight := ReadInteger(SectionName, 'SkipHeight', 0);
 Item.SkipWidth := ReadInteger(SectionName, 'SkipWidth', 0);
 Item.SystemMemory := ReadBool(SectionName, 'SystemMemory', False);
 Item.Transparent := ReadBool(SectionName, 'Transparent', False);
 Item.TransparentColor := StringToColor(ReadString(SectionName, 'TransparentColor', 'clBlack'));
 Item.Restore;
 end;
 finally
 Free;
 end;
 finally
 NewGraphic.Free;
 BitMap.Free;
 SectionList.Free;
 end;
end;
Author: Spose
Source: http://www.mirgames.ru
ID: 03922
Category:Графика
Category:DirectX